From 2958243e227d4383264ed47f880bdea06b1cb10a Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Thu, 8 Oct 2026 08:09:30 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=B6=88=E6=81=AF=E5=80=BC?= =?UTF-8?q?=E8=B7=A8=20realm=20=E4=BC=A0=E9=80=92=E6=94=B9=E7=BB=8F=20VmHo?= =?UTF-8?q?st=20=E8=83=BD=E5=8A=9B=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 38 +++++++++---------- Cargo.toml | 2 +- crates/oxide_builtins/src/message_value.rs | 43 +++++++++++----------- 3 files changed, 41 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4335a3cb..cc54a953 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.8.76" +version = "0.8.77" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.8.76" +version = "0.8.77" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.8.76" +version = "0.8.77" dependencies = [ "ansi_term", "bumpalo", @@ -1226,7 +1226,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.8.76" +version = "0.8.77" dependencies = [ "lru", "oxide_bytecode", @@ -1235,7 +1235,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1269,7 +1269,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.8.76" +version = "0.8.77" dependencies = [ "num-bigint", "oxc_allocator", @@ -1284,7 +1284,7 @@ dependencies = [ [[package]] name = "oxide_engine" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1305,7 +1305,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.8.76" +version = "0.8.77" dependencies = [ "bumpalo", "dashmap", @@ -1319,7 +1319,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.8.76" +version = "0.8.77" dependencies = [ "tracing", "tracing-appender", @@ -1340,7 +1340,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1355,7 +1355,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1371,7 +1371,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.8.76" +version = "0.8.77" dependencies = [ "num-bigint", "num-traits", @@ -1384,7 +1384,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.8.76" +version = "0.8.77" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1402,7 +1402,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.8.76" +version = "0.8.77" dependencies = [ "bumpalo", "dashmap", @@ -1415,7 +1415,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.8.76" +version = "0.8.77" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 29717034..b1e8d60d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.8.76" +version = "0.8.77" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_builtins/src/message_value.rs b/crates/oxide_builtins/src/message_value.rs index 56f3e7ce..6985f801 100644 --- a/crates/oxide_builtins/src/message_value.rs +++ b/crates/oxide_builtins/src/message_value.rs @@ -20,12 +20,11 @@ use std::collections::HashSet; use std::sync::Arc; use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; -use oxide_types::mem::P; use oxide_types::object::{JsObject, NativeFnPtr, PropAttributes}; use oxide_types::private_key::{decode_symbol_key, int_key_value, is_int_key, WELL_KNOWN_SYMBOL_COUNT}; use oxide_types::value::JsValue; -use oxide_runtime_api::{to_string_full, VmHost}; +use oxide_runtime_api::{to_string_full, ProtoKind, VmHost}; use crate::array::create_new_array; use crate::map::MapInner; @@ -330,7 +329,7 @@ fn detach_error( vm: &mut H, state: &mut DetachState, src: &JsObject, transfer: &HashSet<*const JsObject>, ) -> Result { let src_val = JsValue::from_js_object(src as *const JsObject as *mut JsObject); - let si_name = vm.kernel_core().perm_interner().intern("name").0; + let si_name = vm.perm_intern("name"); let name_val = match vm.ordinary_get(src, si_name, src_val) { Ok(v) => v, Err(e) => { @@ -341,7 +340,7 @@ fn detach_error( } }; let name = vm.lookup_str(name_val).unwrap_or_else(|| "Error".to_string()); - let si_msg = vm.kernel_core().perm_interner().intern("message").0; + let si_msg = vm.perm_intern("message"); let message = if let Some(store) = vm.get_own_property_slot(src, si_msg) { let is_accessor = src.prop_meta_at(store).is_some_and(|m| m.is_accessor); if !is_accessor { @@ -353,7 +352,7 @@ fn detach_error( } else { None }; - let si_cause = vm.kernel_core().perm_interner().intern("cause").0; + let si_cause = vm.perm_intern("cause"); let cause = if let Some(store) = vm.get_own_property_slot(src, si_cause) { let val = read_own_value(vm, src, src_val, si_cause, store)?; Some(Box::new(detach_value(vm, state, val, transfer)?)) @@ -430,7 +429,7 @@ fn key_si_to_message_value(vm: &mut H, si: u32) -> Result>(); Ok(MessageValue::String(units.into_boxed_slice())) @@ -497,7 +496,7 @@ fn rehydrate_value(vm: &mut H, value: &MessageValue) -> JsValue { JsValue::from_js_object(ptr) } MessageValue::Object(props) => { - let proto = vm.session().builtin_world().object_proto.as_ptr() as *mut JsObject; + let proto = vm.builtin_proto(ProtoKind::ObjectProto); let ptr = vm.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(proto))); // SAFETY: ptr 是本函数新分配的对象,存活且本段无别名。 let obj = unsafe { &mut *ptr }; @@ -510,7 +509,7 @@ fn rehydrate_value(vm: &mut H, value: &MessageValue) -> JsValue { JsValue::from_js_object(ptr) } MessageValue::Map(entries) => { - let map_proto = vm.session().builtin_world().map_proto.as_ptr() as *mut JsObject; + let map_proto = vm.builtin_proto(ProtoKind::MapProto); let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(map_proto)); obj.set_map(true); let inner = Box::into_raw(Box::new(MapInner::new())); @@ -527,7 +526,7 @@ fn rehydrate_value(vm: &mut H, value: &MessageValue) -> JsValue { JsValue::from_js_object(ptr) } MessageValue::Set(elems) => { - let set_proto = vm.session().builtin_world().set_proto.as_ptr() as *mut JsObject; + let set_proto = vm.builtin_proto(ProtoKind::SetProto); let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(set_proto)); obj.set_set(true); let inner = Box::into_raw(Box::new(SetInner::new())); @@ -543,7 +542,7 @@ fn rehydrate_value(vm: &mut H, value: &MessageValue) -> JsValue { JsValue::from_js_object(ptr) } MessageValue::Date(ts) => { - let proto = vm.session().builtin_world().date_proto.as_ptr() as *mut JsObject; + let proto = vm.builtin_proto(ProtoKind::DateProto); let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(proto)); obj.type_tag = JsObject::OBJ_TYPE_DATE; obj.set_prop_at(0, JsValue::float(*ts)); @@ -575,7 +574,7 @@ fn rehydrate_array_buffer(vm: &mut H, bytes: &Arc>) -> JsValu /// RegExp 臂 rehydrate:按源与标志重编译,建 RegExp 对象(lastIndex 初始 0)。 fn rehydrate_regexp(vm: &mut H, source: &str, flags: &str) -> JsValue { - let proto = vm.session().builtin_world().regexp_proto.as_ptr() as *mut JsObject; + let proto = vm.builtin_proto(ProtoKind::RegExpProto); let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(proto)); let source_val = vm.new_string(source); let flags_val = vm.new_string(flags); @@ -589,7 +588,7 @@ fn rehydrate_regexp(vm: &mut H, source: &str, flags: &str) -> JsValue obj.type_tag = JsObject::OBJ_TYPE_REGEXP; obj.set_regexp_source(source_val); obj.set_regexp_flags(flags_val); - let si_lastindex = vm.kernel_core().perm_interner().intern("lastIndex").0; + let si_lastindex = vm.perm_intern("lastIndex"); let _ = vm.define_data_property(&mut obj, si_lastindex, JsValue::int(0), PropAttributes::new(true, false, false)); let ptr = vm.alloc_object(obj); JsValue::from_js_object(ptr) @@ -601,13 +600,13 @@ fn rehydrate_error( vm: &mut H, name: &str, message: &Option, cause: &Option>, ) -> JsValue { let proto = match name { - "EvalError" => P::as_ptr(&vm.session().builtin_world().eval_error_proto) as *mut JsObject, - "RangeError" => P::as_ptr(&vm.session().builtin_world().range_error_proto) as *mut JsObject, - "ReferenceError" => P::as_ptr(&vm.session().builtin_world().reference_error_proto) as *mut JsObject, - "SyntaxError" => P::as_ptr(&vm.session().builtin_world().syntax_error_proto) as *mut JsObject, - "TypeError" => P::as_ptr(&vm.session().builtin_world().type_error_proto) as *mut JsObject, - "URIError" => P::as_ptr(&vm.session().builtin_world().uri_error_proto) as *mut JsObject, - _ => P::as_ptr(&vm.session().builtin_world().error_proto) as *mut JsObject, + "EvalError" => vm.builtin_proto(ProtoKind::EvalErrorProto), + "RangeError" => vm.builtin_proto(ProtoKind::RangeErrorProto), + "ReferenceError" => vm.builtin_proto(ProtoKind::ReferenceErrorProto), + "SyntaxError" => vm.builtin_proto(ProtoKind::SyntaxErrorProto), + "TypeError" => vm.builtin_proto(ProtoKind::TypeErrorProto), + "URIError" => vm.builtin_proto(ProtoKind::UriErrorProto), + _ => vm.builtin_proto(ProtoKind::ErrorProto), }; let mut obj = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(proto)); obj.type_tag = JsObject::OBJ_TYPE_ERROR; @@ -615,12 +614,12 @@ fn rehydrate_error( // SAFETY: ptr 是本函数新分配的 Error 对象,存活且本段无别名。 let err = unsafe { &mut *ptr }; if let Some(msg) = message { - let si_msg = vm.kernel_core().perm_interner().intern("message").0; + let si_msg = vm.perm_intern("message"); let msg_val = vm.new_string(msg); let _ = vm.define_data_property(err, si_msg, msg_val, PropAttributes::new(true, false, true)); } if let Some(cause_val) = cause { - let si_cause = vm.kernel_core().perm_interner().intern("cause").0; + let si_cause = vm.perm_intern("cause"); let cause_js = rehydrate_value(vm, cause_val); let _ = vm.define_data_property(err, si_cause, cause_js, PropAttributes::DEFAULT_DATA); } @@ -672,7 +671,7 @@ mod tests { /// 读对象自身属性值(按名称),无则 undefined。 fn obj_prop(vm: &Vm, obj: &JsObject, name: &str) -> JsValue { - let si = vm.kernel_core().perm_interner().intern(name).0; + let si = vm.perm_intern(name); match vm.get_own_property_slot(obj, si) { Some(idx) => obj.get_prop_at(idx), None => JsValue::undefined(),