feat: 提取 oxide_builtins 独立 crate,泛型化 <H: VmHost>

This commit is contained in:
爱特每羊队
2026-06-25 22:38:23 +08:00
parent ffc0916a6b
commit 2f5d91bd48
72 changed files with 1983 additions and 1595 deletions
+147 -62
View File
@@ -46,7 +46,8 @@ macro_rules! bind_constructor {
$global.push_prop(val);
}
let ctor = unsafe { &mut *$ctor_ptr };
ctor.set_native_fn(Some(unsafe { oxide_types::object::NativeFnPtr::from_raw($ctor_fn as *const ()) }));
let ptr: *const () = ($ctor_fn as fn(&mut $crate::vm::Vm, &[u8]) -> oxide_runtime_api::NativeResult) as *const ();
ctor.set_native_fn(Some(unsafe { oxide_types::object::NativeFnPtr::from_raw(ptr) }));
ctor.set_native_arg_count($nargs);
}};
}
@@ -127,14 +128,22 @@ fn bind_global_functions(core: &Arc<KernelCore>, session: &KernelSession, global
global,
core,
&[
("parseInt", crate::builtins::number::number_parse_int as *const (), 1),
("parseFloat", crate::builtins::number::number_parse_float as *const (), 1),
("escape", crate::builtins::global::js_escape as *const (), 1),
("unescape", crate::builtins::global::js_unescape as *const (), 1),
("encodeURI", crate::builtins::global::encode_uri as *const (), 1),
("decodeURI", crate::builtins::global::decode_uri as *const (), 1),
("encodeURIComponent", crate::builtins::global::encode_uri_component as *const (), 1),
("decodeURIComponent", crate::builtins::global::decode_uri_component as *const (), 1),
("parseInt", oxide_builtins::number::number_parse_int::<crate::vm::Vm> as *const (), 1),
("parseFloat", oxide_builtins::number::number_parse_float::<crate::vm::Vm> as *const (), 1),
("escape", oxide_builtins::global::js_escape::<crate::vm::Vm> as *const (), 1),
("unescape", oxide_builtins::global::js_unescape::<crate::vm::Vm> as *const (), 1),
("encodeURI", oxide_builtins::global::encode_uri::<crate::vm::Vm> as *const (), 1),
("decodeURI", oxide_builtins::global::decode_uri::<crate::vm::Vm> as *const (), 1),
(
"encodeURIComponent",
oxide_builtins::global::encode_uri_component::<crate::vm::Vm> as *const (),
1,
),
(
"decodeURIComponent",
oxide_builtins::global::decode_uri_component::<crate::vm::Vm> as *const (),
1,
),
],
);
}
@@ -149,23 +158,47 @@ fn bind_reflect_global(core: &Arc<KernelCore>, session: &KernelSession, global:
&mut reflect,
core,
&[
("apply", crate::builtins::reflect::reflect_apply as *const (), 3),
("construct", crate::builtins::reflect::reflect_construct as *const (), 2),
("defineProperty", crate::builtins::reflect::reflect_define_property as *const (), 3),
("deleteProperty", crate::builtins::reflect::reflect_delete_property as *const (), 2),
("get", crate::builtins::reflect::reflect_get as *const (), 2),
("apply", oxide_builtins::reflect::reflect_apply::<crate::vm::Vm> as *const (), 3),
("construct", oxide_builtins::reflect::reflect_construct::<crate::vm::Vm> as *const (), 2),
(
"getOwnPropertyDescriptor",
crate::builtins::reflect::reflect_get_own_property_descriptor as *const (),
"defineProperty",
oxide_builtins::reflect::reflect_define_property::<crate::vm::Vm> as *const (),
3,
),
(
"deleteProperty",
oxide_builtins::reflect::reflect_delete_property::<crate::vm::Vm> as *const (),
2,
),
("get", oxide_builtins::reflect::reflect_get::<crate::vm::Vm> as *const (), 2),
(
"getOwnPropertyDescriptor",
oxide_builtins::reflect::reflect_get_own_property_descriptor::<crate::vm::Vm> as *const (),
2,
),
(
"getPrototypeOf",
oxide_builtins::reflect::reflect_get_prototype_of::<crate::vm::Vm> as *const (),
1,
),
("has", oxide_builtins::reflect::reflect_has::<crate::vm::Vm> as *const (), 2),
(
"isExtensible",
oxide_builtins::reflect::reflect_is_extensible::<crate::vm::Vm> as *const (),
1,
),
("ownKeys", oxide_builtins::reflect::reflect_own_keys::<crate::vm::Vm> as *const (), 1),
(
"preventExtensions",
oxide_builtins::reflect::reflect_prevent_extensions::<crate::vm::Vm> as *const (),
1,
),
("set", oxide_builtins::reflect::reflect_set::<crate::vm::Vm> as *const (), 3),
(
"setPrototypeOf",
oxide_builtins::reflect::reflect_set_prototype_of::<crate::vm::Vm> as *const (),
2,
),
("getPrototypeOf", crate::builtins::reflect::reflect_get_prototype_of as *const (), 1),
("has", crate::builtins::reflect::reflect_has as *const (), 2),
("isExtensible", crate::builtins::reflect::reflect_is_extensible as *const (), 1),
("ownKeys", crate::builtins::reflect::reflect_own_keys as *const (), 1),
("preventExtensions", crate::builtins::reflect::reflect_prevent_extensions as *const (), 1),
("set", crate::builtins::reflect::reflect_set as *const (), 3),
("setPrototypeOf", crate::builtins::reflect::reflect_set_prototype_of as *const (), 2),
],
);
bind_existing_global(core, global, "Reflect", JsValue::from_js_object(Box::into_raw(reflect)));
@@ -175,26 +208,38 @@ fn bind_iterator_global(core: &Arc<KernelCore>, session: &KernelSession, global:
let function_proto = session.builtin_world().function_proto.as_ptr() as *mut JsObject;
let mut iterator = Box::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(function_proto)));
iterator.set_function(true);
configure_native_constructor(&mut iterator, crate::builtins::iterator::iterator_constructor as *const (), 0);
configure_native_constructor(
&mut iterator,
oxide_builtins::iterator::iterator_constructor::<crate::vm::Vm> as *const (),
0,
);
apply_binding_table(
session.builtin_world(),
&mut iterator,
core,
&[("from", crate::builtins::iterator::iterator_from as *const (), 1)],
&[("from", oxide_builtins::iterator::iterator_from::<crate::vm::Vm> as *const (), 1)],
);
bind_existing_global(core, global, "Iterator", JsValue::from_js_object(Box::into_raw(iterator)));
}
fn bind_stub_globals(core: &Arc<KernelCore>, session: &KernelSession, global: &mut JsObject) {
for (index, (name, native_fn, arg_count)) in [
("Proxy", crate::builtins::stubs::proxy_stub as *const (), 2),
("BigInt", crate::builtins::stubs::bigint_stub as *const (), 1),
("WeakMap", crate::builtins::stubs::weakmap_stub as *const (), 0),
("WeakSet", crate::builtins::stubs::weakset_stub as *const (), 0),
("WeakRef", crate::builtins::stubs::weakref_stub as *const (), 1),
("FinalizationRegistry", crate::builtins::stubs::finalization_registry_stub as *const (), 1),
("SharedArrayBuffer", crate::builtins::stubs::shared_array_buffer_stub as *const (), 1),
("Atomics", crate::builtins::stubs::atomics_stub as *const (), 0),
("Proxy", oxide_builtins::stubs::proxy_stub::<crate::vm::Vm> as *const (), 2),
("BigInt", oxide_builtins::stubs::bigint_stub::<crate::vm::Vm> as *const (), 1),
("WeakMap", oxide_builtins::stubs::weakmap_stub::<crate::vm::Vm> as *const (), 0),
("WeakSet", oxide_builtins::stubs::weakset_stub::<crate::vm::Vm> as *const (), 0),
("WeakRef", oxide_builtins::stubs::weakref_stub::<crate::vm::Vm> as *const (), 1),
(
"FinalizationRegistry",
oxide_builtins::stubs::finalization_registry_stub::<crate::vm::Vm> as *const (),
1,
),
(
"SharedArrayBuffer",
oxide_builtins::stubs::shared_array_buffer_stub::<crate::vm::Vm> as *const (),
1,
),
("Atomics", oxide_builtins::stubs::atomics_stub::<crate::vm::Vm> as *const (), 0),
]
.into_iter()
.enumerate()
@@ -209,26 +254,66 @@ fn bind_stub_globals(core: &Arc<KernelCore>, session: &KernelSession, global: &m
pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession, global: &mut JsObject) {
let world = session.builtin_world();
configure_existing_ctor(&world.object_constructor, crate::builtins::object::object_constructor as *const (), 1);
configure_existing_ctor(&world.array_constructor, crate::builtins::array::array_constructor as *const (), 1);
configure_existing_ctor(
&world.object_constructor,
oxide_builtins::object::object_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.array_constructor,
oxide_builtins::array::array_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.array_buffer_constructor,
crate::builtins::array_buffer::array_buffer_constructor as *const (),
oxide_builtins::array_buffer::array_buffer_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.data_view_constructor,
crate::builtins::data_view::data_view_constructor as *const (),
oxide_builtins::data_view::data_view_constructor::<crate::vm::Vm> as *const (),
3,
);
configure_existing_ctor(&world.error_constructor, crate::builtins::error::error_constructor as *const (), 1);
configure_existing_ctor(&world.number_constructor, crate::builtins::number::number_constructor as *const (), 1);
configure_existing_ctor(&world.date_constructor, crate::builtins::date::date_constructor as *const (), 7);
configure_existing_ctor(&world.set_constructor, crate::builtins::set::set_constructor as *const (), 1);
configure_existing_ctor(&world.map_constructor, crate::builtins::map::map_constructor as *const (), 1);
configure_existing_ctor(&world.boolean_constructor, crate::builtins::boolean::boolean_constructor as *const (), 1);
configure_existing_ctor(&world.regexp_constructor, crate::builtins::regexp::regexp_constructor as *const (), 2);
configure_existing_ctor(&world.symbol_constructor, crate::builtins::symbol::symbol_constructor as *const (), 1);
configure_existing_ctor(
&world.error_constructor,
oxide_builtins::error::error_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.number_constructor,
oxide_builtins::number::number_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.date_constructor,
oxide_builtins::date::date_constructor::<crate::vm::Vm> as *const (),
7,
);
configure_existing_ctor(
&world.set_constructor,
oxide_builtins::set::set_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.map_constructor,
oxide_builtins::map::map_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.boolean_constructor,
oxide_builtins::boolean::boolean_constructor::<crate::vm::Vm> as *const (),
1,
);
configure_existing_ctor(
&world.regexp_constructor,
oxide_builtins::regexp::regexp_constructor::<crate::vm::Vm> as *const (),
2,
);
configure_existing_ctor(
&world.symbol_constructor,
oxide_builtins::symbol::symbol_constructor::<crate::vm::Vm> as *const (),
1,
);
for (name, value) in [
("Object", JsValue::from_js_object(world.object_constructor.as_ptr() as *mut JsObject)),
@@ -258,57 +343,57 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
(
"Int8Array",
&world.int8array_constructor,
crate::builtins::typed_array::int8array_constructor as *const (),
oxide_builtins::typed_array::int8array_constructor::<crate::vm::Vm> as *const (),
),
(
"Uint8Array",
&world.uint8array_constructor,
crate::builtins::typed_array::uint8array_constructor as *const (),
oxide_builtins::typed_array::uint8array_constructor::<crate::vm::Vm> as *const (),
),
(
"Uint8ClampedArray",
&world.uint8clampedarray_constructor,
crate::builtins::typed_array::uint8clampedarray_constructor as *const (),
oxide_builtins::typed_array::uint8clampedarray_constructor::<crate::vm::Vm> as *const (),
),
(
"Int16Array",
&world.int16array_constructor,
crate::builtins::typed_array::int16array_constructor as *const (),
oxide_builtins::typed_array::int16array_constructor::<crate::vm::Vm> as *const (),
),
(
"Uint16Array",
&world.uint16array_constructor,
crate::builtins::typed_array::uint16array_constructor as *const (),
oxide_builtins::typed_array::uint16array_constructor::<crate::vm::Vm> as *const (),
),
(
"Int32Array",
&world.int32array_constructor,
crate::builtins::typed_array::int32array_constructor as *const (),
oxide_builtins::typed_array::int32array_constructor::<crate::vm::Vm> as *const (),
),
(
"Uint32Array",
&world.uint32array_constructor,
crate::builtins::typed_array::uint32array_constructor as *const (),
oxide_builtins::typed_array::uint32array_constructor::<crate::vm::Vm> as *const (),
),
(
"Float32Array",
&world.float32array_constructor,
crate::builtins::typed_array::float32array_constructor as *const (),
oxide_builtins::typed_array::float32array_constructor::<crate::vm::Vm> as *const (),
),
(
"Float64Array",
&world.float64array_constructor,
crate::builtins::typed_array::float64array_constructor as *const (),
oxide_builtins::typed_array::float64array_constructor::<crate::vm::Vm> as *const (),
),
(
"BigInt64Array",
&world.bigint64array_constructor,
crate::builtins::typed_array::bigint64array_constructor as *const (),
oxide_builtins::typed_array::bigint64array_constructor::<crate::vm::Vm> as *const (),
),
(
"BigUint64Array",
&world.biguint64array_constructor,
crate::builtins::typed_array::biguint64array_constructor as *const (),
oxide_builtins::typed_array::biguint64array_constructor::<crate::vm::Vm> as *const (),
),
] {
configure_existing_ctor(ctor, native_fn, 1);
@@ -321,7 +406,7 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
global,
"TypeError",
&world.type_error_proto,
crate::builtins::error::type_error_constructor as *const (),
oxide_builtins::error::type_error_constructor::<crate::vm::Vm> as *const (),
);
bind_error_subtype_global(
core,
@@ -329,7 +414,7 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
global,
"ReferenceError",
&world.reference_error_proto,
crate::builtins::error::reference_error_constructor as *const (),
oxide_builtins::error::reference_error_constructor::<crate::vm::Vm> as *const (),
);
bind_error_subtype_global(
core,
@@ -337,7 +422,7 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
global,
"RangeError",
&world.range_error_proto,
crate::builtins::error::range_error_constructor as *const (),
oxide_builtins::error::range_error_constructor::<crate::vm::Vm> as *const (),
);
bind_error_subtype_global(
core,
@@ -345,7 +430,7 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
global,
"SyntaxError",
&world.syntax_error_proto,
crate::builtins::error::syntax_error_constructor as *const (),
oxide_builtins::error::syntax_error_constructor::<crate::vm::Vm> as *const (),
);
bind_error_subtype_global(
core,
@@ -353,7 +438,7 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
global,
"URIError",
&world.uri_error_proto,
crate::builtins::error::uri_error_constructor as *const (),
oxide_builtins::error::uri_error_constructor::<crate::vm::Vm> as *const (),
);
bind_error_subtype_global(
core,
@@ -361,7 +446,7 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
global,
"EvalError",
&world.eval_error_proto,
crate::builtins::error::eval_error_constructor as *const (),
oxide_builtins::error::eval_error_constructor::<crate::vm::Vm> as *const (),
);
bind_reflect_global(core, session, global);