mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 10:41:11 +08:00
feat: SharedArrayBuffer 原型对象与构造器 meta 正式绑定
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::bind_constructor;
|
||||
use crate::bindings::{bind_accessor_getter, configure_native_constructor};
|
||||
use oxide_kernel::kernel::{KernelCore, KernelSession};
|
||||
use oxide_types::object::JsObject;
|
||||
|
||||
/// 把 SharedArrayBuffer 构造器与原型访问器绑定到 global。
|
||||
pub fn bind_shared_array_buffer(core: &Arc<KernelCore>, session: &KernelSession, global: &mut JsObject) {
|
||||
let ctor_ptr = session.builtin_world().shared_array_buffer_constructor.as_ptr() as *mut JsObject;
|
||||
let ctor = unsafe { &mut *ctor_ptr };
|
||||
let proto_ptr = session.builtin_world().shared_array_buffer_proto.as_ptr() as *mut JsObject;
|
||||
let proto = unsafe { &mut *proto_ptr };
|
||||
|
||||
configure_native_constructor(
|
||||
ctor,
|
||||
oxide_builtins::array_buffer::shared_array_buffer_constructor::<crate::vm::Vm> as *const (),
|
||||
1,
|
||||
);
|
||||
|
||||
// SAB 原型当前无静态方法(grow/growable 臂与 slice 归后续面);
|
||||
// byteLength/maxByteLength 两枚访问器(set 恒 undefined)读载荷字节数。
|
||||
bind_accessor_getter(
|
||||
core,
|
||||
session,
|
||||
proto,
|
||||
"byteLength",
|
||||
oxide_builtins::array_buffer::shared_array_buffer_byte_length::<crate::vm::Vm> as *const (),
|
||||
);
|
||||
|
||||
bind_accessor_getter(
|
||||
core,
|
||||
session,
|
||||
proto,
|
||||
"maxByteLength",
|
||||
oxide_builtins::array_buffer::shared_array_buffer_max_byte_length::<crate::vm::Vm> as *const (),
|
||||
);
|
||||
|
||||
// growable 定长臂:恒 false,品牌校验抛 TypeError(proto 自身访问即抛)。
|
||||
bind_accessor_getter(
|
||||
core,
|
||||
session,
|
||||
proto,
|
||||
"growable",
|
||||
oxide_builtins::array_buffer::shared_array_buffer_growable::<crate::vm::Vm> as *const (),
|
||||
);
|
||||
|
||||
bind_constructor!(
|
||||
core,
|
||||
global,
|
||||
"SharedArrayBuffer",
|
||||
ctor_ptr,
|
||||
oxide_builtins::array_buffer::shared_array_buffer_constructor::<crate::vm::Vm>,
|
||||
1,
|
||||
hash: true
|
||||
);
|
||||
}
|
||||
@@ -8,7 +8,7 @@ use oxide_types::value::JsValue;
|
||||
|
||||
use crate::bindings::{bind_global_value, configure_native_constructor};
|
||||
|
||||
const STUBS: [(&str, *const (), u8); 7] = [
|
||||
const STUBS: [(&str, *const (), u8); 6] = [
|
||||
("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),
|
||||
@@ -18,15 +18,10 @@ const STUBS: [(&str, *const (), u8); 7] = [
|
||||
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)
|
||||
/// 把未实现内置(Proxy/WeakMap/WeakSet/WeakRef/FinalizationRegistry/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)
|
||||
|
||||
@@ -44,6 +44,8 @@ pub mod bind_reflect;
|
||||
pub mod bind_regexp;
|
||||
/// Set 构造器与原型的 native 方法绑定。
|
||||
pub mod bind_set;
|
||||
/// SharedArrayBuffer 构造器与原型的 native 方法绑定。
|
||||
pub mod bind_shared_array_buffer;
|
||||
/// String 构造器与原型的 native 方法绑定。
|
||||
pub mod bind_string;
|
||||
/// 未实现内置(Proxy/BigInt/WeakMap 等)的 stub 构造器绑定。
|
||||
@@ -632,9 +634,10 @@ fn install_to_string_tags(core: &Arc<KernelCore>, session: &KernelSession) {
|
||||
let sh = core.shape_forge().as_ref();
|
||||
let tag_id = oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG;
|
||||
let tag_key = oxide_types::private_key::make_well_known_symbol_key(tag_id);
|
||||
let cases: [(*mut JsObject, &str); 12] = [
|
||||
let cases: [(*mut JsObject, &str); 13] = [
|
||||
(world.map_proto.as_ptr() as *mut JsObject, "Map"),
|
||||
(world.array_buffer_proto.as_ptr() as *mut JsObject, "ArrayBuffer"),
|
||||
(world.shared_array_buffer_proto.as_ptr() as *mut JsObject, "SharedArrayBuffer"),
|
||||
(world.set_proto.as_ptr() as *mut JsObject, "Set"),
|
||||
(world.data_view_proto.as_ptr() as *mut JsObject, "DataView"),
|
||||
(world.array_iterator_proto.as_ptr() as *mut JsObject, "Array Iterator"),
|
||||
@@ -884,11 +887,6 @@ fn bind_stub_globals(core: &Arc<KernelCore>, session: &KernelSession, global: &m
|
||||
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),
|
||||
]
|
||||
.into_iter()
|
||||
@@ -923,6 +921,11 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
|
||||
oxide_builtins::array_buffer::array_buffer_constructor::<crate::vm::Vm> as *const (),
|
||||
1,
|
||||
);
|
||||
configure_existing_ctor(
|
||||
&world.shared_array_buffer_constructor,
|
||||
oxide_builtins::array_buffer::shared_array_buffer_constructor::<crate::vm::Vm> as *const (),
|
||||
1,
|
||||
);
|
||||
configure_existing_ctor(
|
||||
&world.data_view_constructor,
|
||||
oxide_builtins::data_view::data_view_constructor::<crate::vm::Vm> as *const (),
|
||||
@@ -976,6 +979,10 @@ pub fn bind_global_builtin_slots(core: &Arc<KernelCore>, session: &KernelSession
|
||||
"ArrayBuffer",
|
||||
JsValue::from_js_object(world.array_buffer_constructor.as_ptr() as *mut JsObject),
|
||||
),
|
||||
(
|
||||
"SharedArrayBuffer",
|
||||
JsValue::from_js_object(world.shared_array_buffer_constructor.as_ptr() as *mut JsObject),
|
||||
),
|
||||
("DataView", JsValue::from_js_object(world.data_view_constructor.as_ptr() as *mut JsObject)),
|
||||
("Error", JsValue::from_js_object(world.error_constructor.as_ptr() as *mut JsObject)),
|
||||
("String", JsValue::from_js_object(world.string_constructor.as_ptr() as *mut JsObject)),
|
||||
@@ -1160,6 +1167,9 @@ pub fn rebind_dirty_builtins(core: &Arc<KernelCore>, session: &mut KernelSession
|
||||
if dirty.map_or(true, |d| d.array_buffer) {
|
||||
bind_array_buffer::bind_array_buffer(core, session, global);
|
||||
}
|
||||
if dirty.map_or(true, |d| d.shared_array_buffer) {
|
||||
bind_shared_array_buffer::bind_shared_array_buffer(core, session, global);
|
||||
}
|
||||
if dirty.map_or(true, |d| d.data_view) {
|
||||
bind_data_view::bind_data_view(core, session, global);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user