diff --git a/crates/core/src/README.md b/crates/core/src/README.md index a1b6839..44a6209 100644 --- a/crates/core/src/README.md +++ b/crates/core/src/README.md @@ -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、结果根转移与失败清理 | diff --git a/crates/core/src/vm.rs b/crates/core/src/vm.rs index 2591c88..45fa17b 100644 --- a/crates/core/src/vm.rs +++ b/crates/core/src/vm.rs @@ -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, + base: ObjectRef, + fields: Vec, + methods: std::collections::BTreeMap, + ) -> Result { + self.objects.new_class(name, base, fields, methods) + } + pub fn new_type( &mut self, name: impl Into, diff --git a/docs/README.md b/docs/README.md index a864784..37343c3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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 | diff --git a/docs/runtime/types.md b/docs/runtime/types.md index 946af24..46dc1c0 100644 --- a/docs/runtime/types.md +++ b/docs/runtime/types.md @@ -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 中的标量尚未统一接入。