feat: expose validated class registration to VM hosts

This commit is contained in:
2026-10-21 02:40:18 +08:00
parent 2b5539cd06
commit 44a02c9fd6
4 changed files with 15 additions and 2 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
| 文件 | 职责 |
| --- | --- |
| [lib.rs](lib.rs) | VM 类型导出、objects 类型兼容重导出、宿主调用与字节码 rustdoc 示例 |
| [vm.rs](vm.rs) | Vm 拥有 ObjectStore 与错误位置记录;对象操作显式委托给 objects |
| [vm.rs](vm.rs) | Vm 拥有 ObjectStore 与错误位置记录;对象操作和宿主 new_class 注册显式委托给 objects |
| [frame.rs](frame.rs) | EndorFrame、栈条目、执行位置元数据、ExecutionLimits |
| [eval.rs](eval.rs) | execute/call、参数绑定、帧切换、取指分派、MakeFunction、结果根转移与失败清理 |
+11
View File
@@ -33,6 +33,17 @@ impl Vm {
self.objects.bootstrap_types()
}
/// Host registration uses the same validated class builder as source code.
pub fn new_class(
&mut self,
name: impl Into<String>,
base: ObjectRef,
fields: Vec<crate::ClassField>,
methods: std::collections::BTreeMap<String, ObjectRef>,
) -> Result<ObjectRef, VmError> {
self.objects.new_class(name, base, fields, methods)
}
pub fn new_type(
&mut self,
name: impl Into<String>,
+1 -1
View File
@@ -6,7 +6,7 @@
| 解释执行、资源修订与引擎升级 | [执行与版本](architecture/execution-and-versions.md) | frontend/compiler/core |
| EndorObject、句柄、默认操作 | [对象模型](runtime/objects.md) | objects/src |
| 原生可变上下文、作用域函数工厂、委托、弱引用与变更通知 | [原生调用](runtime/native-calls.md) | objects/src/native.rs、changes.rs、core/src/eval.rs |
| 托管类型、原生分配继承与字段存储 | [名义类型](runtime/types.md) | objects/src/types.rs |
| 托管类型、宿主类注册、原生分配继承与字段存储 | [名义类型](runtime/types.md) | objects/src/types.rs |
| Number、String、Dict、Cell、Function | [基本对象](runtime/builtins.md) | objects/src |
| 源码读取与来源 | [Reader](runtime/reader.md) | frontend/src/reader.rs |
| 词法、语法、裸赋值和诊断 | [Frontend](runtime/frontend.md) | frontend/src/lexer.peg/grammar.peg |
+2
View File
@@ -11,6 +11,8 @@ ObjectStore/Vm 仍从空堆启动。宿主显式调用 `bootstrap_types()` 得
- Object 的实例类型是 Type。
- Type 的实例类型也是 Type。
`Vm::new_class(name, base, fields, methods)` 为宿主公开与源码相同的类构建校验和所有权协议,返回拥有式定义根;宿主注册普通值类型无需生成源码。
`new_type(name, base, constructor)` 创建一份新的名义定义,并沿 base 取得元类型。名字相同不代表类型相同。base 在创建时固定,不能通过替换载荷或修改属性改变,因此继承链不会因后续修改出现循环。`attach_type(instance, definition)` 只允许给尚未附加类型的对象设置一次类型,验证同堆、存活状态和 Type 载荷。已有 `type` 普通字段时拒绝附加,避免遮蔽数据。旧的原生对象可以继续保持未分类。
`type_of` 返回借用式类型引用;`is_subtype(candidate, expected)` 检查名义父链,含自身;`is_instance(instance, expected)` 先取得实例类型,再检查父链。非法句柄和非 Type 参数报错,不返回假值来掩盖错误。这些接口目前面向堆对象,直接保存在 Value 中的标量尚未统一接入。