From e511e393d98a5d87015dc8c42cfa59a82d48a422 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Thu, 22 Oct 2026 19:02:27 +0800 Subject: [PATCH] Expose native implementation identity for verified host fast paths --- crates/core/tests/README.md | 2 +- crates/core/tests/native_context.rs | 40 +++++++++++++++++++++++++++++ crates/objects/src/README.md | 2 +- crates/objects/src/native.rs | 10 +++++++- docs/runtime/native-calls.md | 3 +++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/crates/core/tests/README.md b/crates/core/tests/README.md index b17575a..05b5a09 100644 --- a/crates/core/tests/README.md +++ b/crates/core/tests/README.md @@ -10,7 +10,7 @@ | [types.rs](types.rs) | 名义身份、继承与实例关系、类型边保活/循环回收、只读类型元数据与外来句柄、显式Trait身份/继承/参数约束及后代更新原子性;统一函数分类、原生数量元数据/副作用前拒绝/能力更新/默认参数与返回类型错误根清理;仅远端执行 | | [typed_traits.rs](typed_traits.rs) | 类型化Trait登记、原子拒绝、源码检查关闭时的显式约束、宽参数调用、类型强边GC、体后实际能力结果检查与临时验证集合恢复;仅远端执行 | | [method_contracts.rs](method_contracts.rs) | 源码/原生方法覆写参数逆变/返回协变、联合参数、已证明源码/调用图只读、全局/闭包/接收者重绑定、控制流汇合与原生效果及共享赋值保守分类、祖先替换原子性、动态名称重绑定/前向名称与体前拒绝/恢复及清理;仅远端执行 | -| [native_context.rs](native_context.rs) | 原生作用域根、分配失败清理、原生签名/联合与可空类型/固定与Delegated效果和委托返回根、绑定方法元数据、委托、只读结果分配/写入拒绝/依赖/校验与普通读取区分及失败恢复、弱引用过期及有界变更;仅远端执行 | +| [native_context.rs](native_context.rs) | 原生作用域根、分配失败清理、原生签名/联合与可空类型/固定与Delegated效果和委托返回根、绑定方法元数据、具体原生实现查询与载荷替换、委托、只读结果分配/写入拒绝/依赖/校验与普通读取区分及失败恢复、弱引用过期及有界变更;仅远端执行 | 核心对象现由 objects 定义,本目录保留既有 endor_core 导入与 Vm 方法的兼容性检查。独立对象存储检查见 [objects/tests](../../objects/tests/README.md)。堆内部伪造句柄与计数溢出检查在 objects 的 src/heap.rs,公开示例由 src/lib.rs rustdoc 提供。文件职责见 [src](../src/README.md),检查方式和结果边界见 [验证](../../../docs/operations/validation.md)。本地不执行测试;存在测试文件不代表某次提交已通过。返回 [core](../README.md)。 diff --git a/crates/core/tests/native_context.rs b/crates/core/tests/native_context.rs index c3ee7d9..afc7b78 100644 --- a/crates/core/tests/native_context.rs +++ b/crates/core/tests/native_context.rs @@ -57,6 +57,46 @@ impl NativeCallable for Delegate { } } +#[test] +fn native_implementation_inspection_follows_payload_replacement() { + let mut vm = Vm::new().unwrap(); + let function = vm + .allocate(ContextNativeFunction::new( + "allocate", + Allocate(false), + vec![], + )) + .unwrap(); + let payload = vm + .payload::(function, "native") + .unwrap(); + assert!(payload.implementation::().is_some()); + assert!(payload.implementation::().is_none()); + let version = vm.change_version(function).unwrap(); + let target = vm + .allocate(ContextNativeFunction::new( + "target", + Allocate(false), + vec![], + )) + .unwrap(); + vm.replace_payload( + function, + ContextNativeFunction::new("delegate", Delegate(target), vec![target]), + ) + .unwrap(); + let payload = vm + .payload::(function, "native") + .unwrap(); + assert!(payload.implementation::().is_none()); + assert_eq!(payload.implementation::().unwrap().0, target); + assert!(vm.change_version(function).unwrap() > version); + for object in [function, target] { + vm.release(object).unwrap(); + } + assert_eq!(vm.object_count(), 0); +} + #[test] fn native_delegation_shares_budget_and_cleans_owned_arguments() { let mut vm = Vm::new().unwrap(); diff --git a/crates/objects/src/README.md b/crates/objects/src/README.md index 483f747..5f5ead2 100644 --- a/crates/objects/src/README.md +++ b/crates/objects/src/README.md @@ -8,7 +8,7 @@ | [object.rs](object.rs) | Value、CompareOp、ObjectPayload(含显式函数标记)、ObjectHeader、EndorObject、Record、可发布数量元数据的 NativeFunction | | [types.rs](types.rs) | 托管名义类型、显式 Object/Type 引导、继承查询、受管方法表/接收者绑定、类字段、显式/类型化Trait定义、强类型签名边与声明约束、实例方法遮蔽检查和宿主缓存依赖名、原生构造委托、统一源码/原生/绑定方法参数区间和已知效果查询与能力验证、声明环境托管边、字段构造/写入检查与标记为校验读取的注解解析/匹配 | | [contracts.rs](contracts.rs) | 方法参数逆变/返回协变、名义/能力/联合包含关系、祖先方法更新的后代检查、动态注解调用前复查、类型化能力替换/返回约束与临时递归验证集合 | -| [native.rs](native.rs) | NativeContext、CallArity/CallSignature 类型、Delegated/固定效果元数据、调用前检查、签名类型强边、上下文原生函数、作用域语言函数工厂、显式能力声明入口、函数标记、根与非递归委托调用 | +| [native.rs](native.rs) | NativeContext、CallArity/CallSignature 类型、Delegated/固定效果元数据、调用前检查、签名类型强边、上下文原生函数与具体实现借用查询、作用域语言函数工厂、显式能力声明入口、函数标记、根与非递归委托调用 | | [effects.rs](effects.rs) | 非递归只读调用图证明、当前全局/闭包/绑定接收者解析、控制流栈事实合并,无执行或隐藏强根 | | [changes.rs](changes.rs) | 合并变更批次、变更键与有界通知额度 | | [number.rs](number.rs) | Integer/Decimal/Rational/BinaryFloat/Complex 的无损表示和装箱载荷 | diff --git a/crates/objects/src/native.rs b/crates/objects/src/native.rs index ce9c7d3..44c1746 100644 --- a/crates/objects/src/native.rs +++ b/crates/objects/src/native.rs @@ -222,7 +222,7 @@ impl CallSignature { } } -pub trait NativeCallable: fmt::Debug + Send + Sync + 'static { +pub trait NativeCallable: fmt::Debug + Send + Sync + std::any::Any { /// Immutable resolved types; referenced definitions must be traced by the /// payload. ContextNativeFunction snapshots and traces them automatically. fn signature(&self) -> Option { @@ -453,6 +453,14 @@ pub struct ContextNativeFunction { } impl ContextNativeFunction { + /// Borrow the concrete host implementation for intrinsic dispatch checks. + /// Function identity or a mutable class-table slot alone is not proof that + /// its current payload still implements a host intrinsic. + pub fn implementation(&self) -> Option<&T> { + let implementation: &dyn std::any::Any = self.callable.as_ref(); + implementation.downcast_ref() + } + pub fn new( name: &'static str, callable: impl NativeCallable, diff --git a/docs/runtime/native-calls.md b/docs/runtime/native-calls.md index 7d84edf..e7e3b12 100644 --- a/docs/runtime/native-calls.md +++ b/docs/runtime/native-calls.md @@ -110,3 +110,6 @@ Tessera 的 measure/arrange/paint/hitTest、Point 几何查询、Window、Block/ Delegated 在替换兼容中视为未知整体效果,与源码未知效果一样不冒充静态纯度证明。包装不得在委托前进行业务写入或外部I/O,直接返回路径也须只读;委托的原生 Mutating/External 目标仍在当前只读作用域内、进入目标实现前拒绝。源码委托继续受堆写屏障约束,旧无元数据宿主调用仍须遵守可信边界。native_context.rs 的回归覆盖只读包装进入后拒绝写目标、普通作用域允许同一链,以及替换成纯目标后只读调用成功,仅编译。 + + +ContextNativeFunction::implementation() 只借用当前具体宿主实现,不执行或复制载荷,也不改变捕获/签名的托管边。NativeCallable 继承Any(原有static要求保持);宿主可据自己的实现类型/操作识别原生快速路径,不能只凭函数句柄或当前可变类型方法表认定原生身份。替换载荷后查询跟随新实现,旧类型查询返回None;宿主缓存仍须订阅函数对象版本变化。此接口不暴露可变借用,不替代原生类型/数量/效果检查。