Check source function annotations and unify managed function identity
This commit is contained in:
@@ -45,7 +45,7 @@ Endor 是解释型语言,字节码是内部执行表示;从 AST 生成字节
|
||||
|
||||
## 代码对象:保存静态信息
|
||||
|
||||
`EndorCode` 保存 wordcode、解码结果、常量、名称表、局部变量布局、参数与自由变量信息、最大栈深度、代码名和源码位置元信息。它是不可变 Rust 数据。
|
||||
`EndorCode` 保存 wordcode、解码结果、常量、名称表、局部变量布局、参数与自由变量信息、最大栈深度、代码名和源码位置元信息。它是不可变 Rust 数据。可选 SourceSignature 还保存形参/返回注解名称和声明类名;Compiler 保留这些数据,宿主可启用[源码函数注解检查](types.md#源码函数注解检查)。
|
||||
|
||||
`vm.new_code(code)` 把数据放进 `EndorCodeObject`,分配一个受管理的堆对象。代码对象持有常量中的对象引用,并参与引用计数和循环回收;函数持有代码对象句柄,所以多个函数可共享同一代码对象,代码常量也只由这一对象统一持有。
|
||||
|
||||
@@ -116,7 +116,7 @@ ReturnValue
|
||||
|
||||
## 对象引用与返回值
|
||||
|
||||
每个帧持有函数的一份执行根,函数继续保活代码、全局字典、内建字典、默认值及闭包。局部槽和求值栈中的每个对象值也各自持有执行根,重复出现分别计数。执行根复用现有外部强引用计数,所以循环回收能保留它们。
|
||||
每个帧持有函数的一份执行根,函数继续保活代码、全局字典、内建字典、默认值及闭包。启用源码注解时,帧还持有本次返回约束的 Type/Trait 根,成功或失败清理时释放。局部槽和求值栈中的每个对象值也各自持有执行根,重复出现分别计数。执行根复用现有外部强引用计数,所以循环回收能保留它们。
|
||||
|
||||
装载借用值时先 retain,弹栈或清空槽时 release;槽之间移动直接转移持有。调用先准备并保活被调函数的参数,再清理调用者的输入。返回值从当前帧移交给调用者栈或宿主,帧清理不会释放这一份结果。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user