diff --git a/Cargo.lock b/Cargo.lock index 447931dc..4822d60b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.8.74" +version = "0.8.75" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.8.74" +version = "0.8.75" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.8.74" +version = "0.8.75" dependencies = [ "ansi_term", "bumpalo", @@ -1226,7 +1226,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.8.74" +version = "0.8.75" dependencies = [ "lru", "oxide_bytecode", @@ -1235,7 +1235,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.8.74" +version = "0.8.75" dependencies = [ "num-bigint", "oxc_allocator", @@ -1284,7 +1284,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.8.74" +version = "0.8.75" dependencies = [ "bumpalo", "dashmap", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.8.74" +version = "0.8.75" dependencies = [ "tracing", "tracing-appender", @@ -1340,7 +1340,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1371,7 +1371,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.8.74" +version = "0.8.75" dependencies = [ "num-bigint", "num-traits", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.8.74" +version = "0.8.75" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1402,7 +1402,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.8.74" +version = "0.8.75" dependencies = [ "bumpalo", "dashmap", @@ -1415,7 +1415,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.8.74" +version = "0.8.75" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index db923fa4..c1f2c5ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.8.74" +version = "0.8.75" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_builtins/src/array/common.rs b/crates/oxide_builtins/src/array/common.rs index ba390339..d8acc95b 100644 --- a/crates/oxide_builtins/src/array/common.rs +++ b/crates/oxide_builtins/src/array/common.rs @@ -4,7 +4,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_types::object::{JsObject, MAX_DENSE_PROPS}; use oxide_types::value::JsValue; -use oxide_runtime_api::{NativeResult, VmHost}; +use oxide_runtime_api::{NativeResult, ProtoKind, VmHost}; use super::from::from_engine_error; @@ -262,7 +262,7 @@ pub(crate) fn require_callback(vm: &mut H, callback_val: JsValue) -> } pub(crate) fn create_new_array(vm: &mut H, n: usize) -> *mut JsObject { - let proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject; + let proto = vm.builtin_proto(ProtoKind::ArrayProto); vm.alloc_object(JsObject::new_array( EMPTY_SHAPE_ID, JsValue::from_js_object(proto), diff --git a/crates/oxide_builtins/src/data_view.rs b/crates/oxide_builtins/src/data_view.rs index 4f531c51..cf38f27f 100644 --- a/crates/oxide_builtins/src/data_view.rs +++ b/crates/oxide_builtins/src/data_view.rs @@ -7,7 +7,7 @@ use num_traits::ToPrimitive; use crate::array_buffer::{buffer_payload, ArrayBufferPayload}; -use oxide_runtime_api::{NativeResult, VmHost}; +use oxide_runtime_api::{NativeResult, ProtoKind, VmHost}; /// DataView 视图状态盒。`byte_length` 语义随 `length_is_auto` 分流: /// 定长视图存静态长;auto 视图(构造时 byteLength 缺省且构造期缓冲可 resize) @@ -205,7 +205,7 @@ fn has_data_view_proto(vm: &mut H, this_val: JsValue) -> bool { if !this_val.is_object() { return false; } - let target = vm.session().builtin_world().data_view_proto.as_ptr() as *mut JsObject; + let target = vm.builtin_proto(ProtoKind::DataViewProto); let mut cursor = this_val; for _ in 0..1024 { if !cursor.is_object() { @@ -290,11 +290,11 @@ pub fn data_view_constructor(vm: &mut H, args: &[u8]) -> NativeResult // GetPrototypeFromConstructor:普通读触发原型链上的访问器 getter, // 读期用户异常经原值槽恢复后重抛。NewTarget 非对象(直调/缺省面)时 // 回落默认原型,不抛错。 - let default_proto = JsValue::from_js_object(vm.session().builtin_world().data_view_proto.as_ptr() as *mut JsObject); + let default_proto = JsValue::from_js_object(vm.builtin_proto(ProtoKind::DataViewProto)); let proto = if new_target.is_object() { let nt_ptr = new_target.as_js_object_ptr(); let nt_obj = unsafe { &*nt_ptr }; - let proto_si = vm.kernel_core().perm_interner().intern("prototype").0; + let proto_si = vm.perm_intern("prototype"); let proto_val = match vm.ordinary_get(nt_obj, proto_si, new_target) { Ok(v) => v, Err(e) => return NativeResult::Err(crate::iterator::engine_error(vm, &e)), diff --git a/crates/oxide_builtins/src/date.rs b/crates/oxide_builtins/src/date.rs index 2df70653..3a85ae2a 100644 --- a/crates/oxide_builtins/src/date.rs +++ b/crates/oxide_builtins/src/date.rs @@ -4,7 +4,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_types::object::JsObject; use oxide_types::value::JsValue; -use oxide_runtime_api::{NativeResult, VmHost}; +use oxide_runtime_api::{NativeResult, ProtoKind, VmHost}; fn get_timestamp(obj: &JsObject) -> f64 { let v = obj.get_prop_at(0); @@ -345,7 +345,7 @@ pub fn date_constructor(vm: &mut H, args: &[u8]) -> NativeResult { if ptr.is_null() { false } else { - let date_proto = vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject; + let date_proto = vm.builtin_proto(ProtoKind::DateProto); if date_proto.is_null() { false } else { @@ -435,10 +435,7 @@ pub fn date_constructor(vm: &mut H, args: &[u8]) -> NativeResult { } }; - let mut obj = JsObject::new_empty( - EMPTY_SHAPE_ID, - JsValue::from_js_object(vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject), - ); + let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(vm.builtin_proto(ProtoKind::DateProto))); obj.type_tag = JsObject::OBJ_TYPE_DATE; obj.set_prop_at(0, JsValue::float(timestamp)); diff --git a/crates/oxide_builtins/src/disposable_stack.rs b/crates/oxide_builtins/src/disposable_stack.rs index 316c5f39..2cfebc91 100644 --- a/crates/oxide_builtins/src/disposable_stack.rs +++ b/crates/oxide_builtins/src/disposable_stack.rs @@ -16,7 +16,7 @@ use oxide_types::object::JsObject; use oxide_types::private_key::encode_symbol_key; use oxide_types::value::JsValue; -use oxide_runtime_api::{NativeResult, VmHost}; +use oxide_runtime_api::{NativeResult, ProtoKind, VmHost}; /// 分配空状态盒并存入新资源栈对象(proto 与 type_tag 按栈类型传入)。 fn alloc_disposable_stack(vm: &mut H, proto_val: JsValue, type_tag: u8) -> *mut JsObject { @@ -122,7 +122,7 @@ fn stack_constructor_impl(vm: &mut H, args: &[u8], proto_val: JsValue let nt_ptr = new_target.as_js_object_ptr(); // SAFETY: is_object 保证指针非空且对象本 session 存活。 let nt_obj = unsafe { &*nt_ptr }; - let proto_si = vm.kernel_core().perm_interner().intern("prototype").0; + let proto_si = vm.perm_intern("prototype"); let proto = match vm.ordinary_get(nt_obj, proto_si, new_target) { Ok(v) => v, Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)), @@ -141,15 +141,13 @@ fn stack_constructor_impl(vm: &mut H, args: &[u8], proto_val: JsValue /// `DisposableStack` 构造函数:创建带空状态盒的 DisposableStack 对象。 pub fn disposable_stack_constructor(vm: &mut H, args: &[u8]) -> NativeResult { - let proto_val = - JsValue::from_js_object(vm.session().builtin_world().disposable_stack_proto.as_ptr() as *mut JsObject); + let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::DisposableStackProto)); stack_constructor_impl(vm, args, proto_val, JsObject::OBJ_TYPE_DISPOSABLE_STACK) } /// `AsyncDisposableStack` 构造函数:创建带空状态盒的 AsyncDisposableStack 对象。 pub fn async_disposable_stack_constructor(vm: &mut H, args: &[u8]) -> NativeResult { - let proto_val = - JsValue::from_js_object(vm.session().builtin_world().async_disposable_stack_proto.as_ptr() as *mut JsObject); + let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::AsyncDisposableStackProto)); stack_constructor_impl(vm, args, proto_val, JsObject::OBJ_TYPE_ASYNC_DISPOSABLE_STACK) } @@ -464,8 +462,7 @@ fn stack_move_impl(vm: &mut H, this_val: JsValue, proto_val: JsValue, /// `DisposableStack.prototype.move()`:把全部 entries 转移到新 DisposableStack。 pub fn disposable_stack_move(vm: &mut H, args: &[u8]) -> NativeResult { let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] }); - let proto_val = - JsValue::from_js_object(vm.session().builtin_world().disposable_stack_proto.as_ptr() as *mut JsObject); + let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::DisposableStackProto)); stack_move_impl(vm, this_val, proto_val, JsObject::OBJ_TYPE_DISPOSABLE_STACK) } @@ -473,8 +470,7 @@ pub fn disposable_stack_move(vm: &mut H, args: &[u8]) -> NativeResult /// AsyncDisposableStack(proto 固定为 AsyncDisposableStack.prototype,非子类)。 pub fn async_disposable_stack_move(vm: &mut H, args: &[u8]) -> NativeResult { let this_val = vm.reg(if args.is_empty() { 0 } else { args[0] }); - let proto_val = - JsValue::from_js_object(vm.session().builtin_world().async_disposable_stack_proto.as_ptr() as *mut JsObject); + let proto_val = JsValue::from_js_object(vm.builtin_proto(ProtoKind::AsyncDisposableStackProto)); stack_move_impl(vm, this_val, proto_val, JsObject::OBJ_TYPE_ASYNC_DISPOSABLE_STACK) } diff --git a/crates/oxide_builtins/src/number.rs b/crates/oxide_builtins/src/number.rs index 626faba3..df701543 100644 --- a/crates/oxide_builtins/src/number.rs +++ b/crates/oxide_builtins/src/number.rs @@ -1,6 +1,6 @@ use oxide_types::value::JsValue; -use oxide_runtime_api::{NativeResult, VmHost}; +use oxide_runtime_api::{NativeResult, ProtoKind, VmHost}; /// 整值且 i32 域内的有限数转 int 表示;-0 排除 /// (int 表示丢符号,规范要求 `Number(-0)` 得 -0)。 @@ -46,7 +46,7 @@ pub fn number_constructor(vm: &mut H, args: &[u8]) -> NativeResult { } else { 0.0 }; - let number_proto = vm.session().builtin_world().number_proto.as_ptr() as *mut oxide_types::object::JsObject; + let number_proto = vm.builtin_proto(ProtoKind::NumberProto); let is_ctor = if let Some(this_reg) = args.first().copied() { let this_val = vm.reg(this_reg); if this_val.is_object() { @@ -345,7 +345,7 @@ fn this_number_value(vm: &mut H, this_val: JsValue) -> Result(vm: &mut H, args: &[u8]) -> NativeResult { let ptr = this_val.as_js_object_ptr(); if !ptr.is_null() { // Number.prototype 本身是 Number 对象,其 [[NumberData]] 为 +0。 - let number_proto = vm.session().builtin_world().number_proto.as_ptr() as *mut oxide_types::object::JsObject; + let number_proto = vm.builtin_proto(ProtoKind::NumberProto); if ptr == number_proto { return NativeResult::Ok(JsValue::int(0)); } diff --git a/crates/oxide_builtins/src/reflect.rs b/crates/oxide_builtins/src/reflect.rs index 86567451..3d4ec971 100644 --- a/crates/oxide_builtins/src/reflect.rs +++ b/crates/oxide_builtins/src/reflect.rs @@ -6,7 +6,7 @@ use oxide_types::value::JsValue; use crate::array::{arraylike_get, from_engine_error, is_constructor_value}; use crate::object::{delete_own_property, key_si_to_js_value, own_symbol_key_values, walk_own_keys}; -use oxide_runtime_api::{to_length, NativeResult, VmHost}; +use oxide_runtime_api::{to_length, NativeResult, ProtoKind, VmHost}; /// 原型链深度上限(与引擎原型链深度上限同值)。 const MAX_PROTO_CHAIN_DEPTH: usize = 1024; @@ -32,7 +32,7 @@ pub fn reflect_apply(vm: &mut H, args: &[u8]) -> NativeResult { let arg_list_obj = unsafe { &*arg_list_ptr }; // CreateListFromArrayLike:规范读 length(访问器异常原值传播),ToLength 纯函数不抛。 - let length_si = vm.kernel_core().perm_interner().intern("length").0; + let length_si = vm.perm_intern("length"); let len_val = match vm.ordinary_get(arg_list_obj, length_si, arg_list) { Ok(v) => v, Err(msg) => return NativeResult::Err(from_engine_error(vm, &msg)), @@ -82,7 +82,7 @@ pub fn reflect_construct(vm: &mut H, args: &[u8]) -> NativeResult { let arg_list_obj = unsafe { &*arg_list_ptr }; // CreateListFromArrayLike:规范读 length(访问器异常原值传播),ToLength 纯函数不抛。 - let length_si = vm.kernel_core().perm_interner().intern("length").0; + let length_si = vm.perm_intern("length"); let len_val = match vm.ordinary_get(arg_list_obj, length_si, arg_list) { Ok(v) => v, Err(msg) => return NativeResult::Err(from_engine_error(vm, &msg)), @@ -248,14 +248,14 @@ pub fn reflect_own_keys(vm: &mut H, args: &[u8]) -> NativeResult { // (创建序第一枚字符串键),存储下标哨兵 u32::MAX = 无槽位(消费端只读 // si,不读存储下标)。 if target.is_array() { - let length_si = vm.kernel_core().perm_interner().intern("length").0; + let length_si = vm.perm_intern("length"); let insert_at = keys.iter().position(|(si, _)| !is_int_key(*si)).unwrap_or(keys.len()); keys.insert(insert_at, (length_si, u32::MAX)); } let symbols = own_symbol_key_values(vm, target); let n = keys.len() + symbols.len(); - let array_proto = vm.session().builtin_world().array_proto.as_ptr() as *mut JsObject; + let array_proto = vm.builtin_proto(ProtoKind::ArrayProto); let arr = vm.alloc_object(JsObject::new_array(EMPTY_SHAPE_ID, JsValue::from_js_object(array_proto), n)); for (i, (si, _)) in keys.iter().enumerate() { let key_val = key_si_to_js_value(vm, *si); diff --git a/crates/oxide_builtins/src/symbol.rs b/crates/oxide_builtins/src/symbol.rs index 5cb232dc..163d4795 100644 --- a/crates/oxide_builtins/src/symbol.rs +++ b/crates/oxide_builtins/src/symbol.rs @@ -1,7 +1,6 @@ -use oxide_types::object::JsObject; use oxide_types::value::JsValue; -use oxide_runtime_api::{NativeResult, VmHost}; +use oxide_runtime_api::{NativeResult, ProtoKind, VmHost}; /// JS `Symbol()` 构造逻辑:以可选 description 创建一个新的唯一 Symbol。 /// 当以 new 语义调用(this 原型链指向 Symbol.prototype)时抛 TypeError,与规范一致。 @@ -15,7 +14,7 @@ pub fn symbol_constructor(vm: &mut H, args: &[u8]) -> NativeResult { if proto.is_object() { let proto_ptr = proto.as_js_object_ptr(); if !proto_ptr.is_null() { - let sp = vm.session().builtin_world().symbol_proto.as_ptr() as *mut JsObject; + let sp = vm.builtin_proto(ProtoKind::SymbolProto); if std::ptr::eq(proto_ptr, sp) { return NativeResult::Err(crate::error::create_type_error(vm, "Symbol is not a constructor")); } @@ -64,8 +63,7 @@ fn this_symbol_value(vm: &mut H, this_val: JsValue) -> Result(vm: &mut H) -> Result<*const JsObject, JsValue> { - let global_ptr = vm.session().global_object().as_ptr(); + let global_ptr = vm.global_object().as_ptr(); // SAFETY: 全局对象为 session 级根,本调用内有效。 let global = unsafe { &*global_ptr }; let global_val = JsValue::from_js_object(global_ptr as *mut JsObject); - let si_weakmap = vm.kernel_core().perm_interner().intern("WeakMap").0; + let si_weakmap = vm.perm_intern("WeakMap"); let ctor_val = vm .ordinary_get(global, si_weakmap, global_val) .map_err(|e| crate::iterator::engine_error(vm, &e))?; @@ -249,7 +249,7 @@ fn weak_map_proto_ptr(vm: &mut H) -> Result<*const JsObject, JsValue> if ctor_ptr.is_null() { return Err(crate::error::create_type_error(vm, "WeakMap constructor unavailable")); } - let si_prototype = vm.kernel_core().perm_interner().intern("prototype").0; + let si_prototype = vm.perm_intern("prototype"); let proto_val = vm .ordinary_get(unsafe { &*ctor_ptr }, si_prototype, ctor_val) .map_err(|e| crate::iterator::engine_error(vm, &e))?; @@ -327,7 +327,7 @@ pub fn weak_map_constructor(vm: &mut H, args: &[u8]) -> NativeResult let iterable = vm.reg(args[1]); if !iterable.is_undefined() && !iterable.is_null() { let map_ref = unsafe { &*map_obj }; - let set_si = vm.kernel_core().perm_interner().intern("set").0; + let set_si = vm.perm_intern("set"); let adder = match vm.ordinary_get(map_ref, set_si, map_val) { Ok(v) => v, Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)),