mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 02:31:13 +08:00
49 lines
2.0 KiB
Rust
49 lines
2.0 KiB
Rust
use std::sync::Arc;
|
||
|
||
use oxide_kernel::kernel::{KernelCore, KernelSession};
|
||
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
|
||
use oxide_types::mem::P;
|
||
use oxide_types::object::JsObject;
|
||
use oxide_types::value::JsValue;
|
||
|
||
use crate::bindings::{bind_global_value, configure_native_constructor};
|
||
|
||
const STUBS: [(&str, *const (), u8); 7] = [
|
||
("Proxy", oxide_builtins::stubs::proxy_stub::<crate::vm::Vm> as *const (), 2),
|
||
("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::array_buffer::shared_array_buffer_constructor::<crate::vm::Vm> as *const (),
|
||
1,
|
||
),
|
||
("Atomics", oxide_builtins::stubs::atomics_stub::<crate::vm::Vm> as *const (), 0),
|
||
];
|
||
|
||
/// 把未实现内置(Proxy/WeakMap/WeakSet/WeakRef/FinalizationRegistry/SharedArrayBuffer/Atomics)
|
||
/// 的 stub 构造器绑定到 global,并登记到 `stub_objects` 供快照跟踪。
|
||
pub fn bind_stubs(core: &Arc<KernelCore>, session: &mut KernelSession, global: &mut JsObject) {
|
||
let builtin_world = Arc::get_mut(&mut session.builtin_world)
|
||
.expect("BuiltinWorld must be uniquely owned during init_kernel_builtins");
|
||
|
||
for (name, native_fn, arg_count) in STUBS {
|
||
let mut stub = JsObject::new_empty(
|
||
EMPTY_SHAPE_ID,
|
||
JsValue::from_js_object(builtin_world.function_proto.as_ptr() as *mut JsObject),
|
||
);
|
||
stub.set_function(true);
|
||
configure_native_constructor(&mut stub, native_fn, arg_count);
|
||
|
||
let stub = P::new(stub);
|
||
let stub_ptr = stub.as_ptr() as *mut JsObject;
|
||
bind_global_value(core, global, name, JsValue::from_js_object(stub_ptr));
|
||
builtin_world.stub_objects.push(stub);
|
||
}
|
||
}
|