use std::sync::Arc; use oxide_kernel::builtin::ObjectMethods; use oxide_kernel::kernel::{KernelCore, KernelSession}; use oxide_types::object::{JsObject, PropAttributes}; use crate::bind_constructor; use crate::bindings::apply_binding_table; /// 把 Object 构造器与原型方法绑定到 global。 pub fn bind_object(core: &Arc, session: &KernelSession, global: &mut JsObject) { let methods = ObjectMethods { keys: oxide_builtins::object::object_keys:: as *const (), create: oxide_builtins::object::object_create:: as *const (), assign: oxide_builtins::object::object_assign:: as *const (), is: oxide_builtins::object::object_is:: as *const (), define_property: oxide_builtins::object::object_define_property:: as *const (), get_own_property_descriptor: oxide_builtins::object::object_get_own_property_descriptor:: as *const (), freeze: oxide_builtins::object::object_freeze:: as *const (), seal: oxide_builtins::object::object_seal:: as *const (), prevent_extensions: oxide_builtins::object::object_prevent_extensions:: as *const (), is_frozen: oxide_builtins::object::object_is_frozen:: as *const (), is_sealed: oxide_builtins::object::object_is_sealed:: as *const (), is_extensible: oxide_builtins::object::object_is_extensible:: as *const (), get_own_property_names: oxide_builtins::object::object_get_own_property_names:: as *const (), get_own_property_symbols: oxide_builtins::object::object_get_own_property_symbols:: as *const (), define_properties: oxide_builtins::object::object_define_properties:: as *const (), from_entries: oxide_builtins::object::object_from_entries:: as *const (), get_prototype_of: oxide_builtins::object::object_get_prototype_of:: as *const (), has_own: oxide_builtins::object::object_has_own:: as *const (), entries: oxide_builtins::object::object_entries:: as *const (), values: oxide_builtins::object::object_values:: as *const (), has_own_property: oxide_builtins::object::object_proto_has_own_property:: as *const (), property_is_enumerable: oxide_builtins::object::object_proto_property_is_enumerable:: as *const (), }; session .builtin_world() .bind_object_methods(&methods, core.perm_interner().as_ref(), core.shape_forge().as_ref()); let object_proto_ptr = session.builtin_world().object_proto.as_ptr() as *mut JsObject; let object_proto = unsafe { &mut *object_proto_ptr }; apply_binding_table( session.builtin_world(), object_proto, core, &[ ( "toString", oxide_builtins::object::object_proto_to_string:: as *const (), 0, ), ("valueOf", oxide_builtins::object::object_proto_value_of:: as *const (), 0), ], ); // 内置原型方法不可枚举(否则会泄漏进 for-in)。 for name in ["toString", "valueOf"] { let si = core.perm_interner().intern(name).0; if let Some(pos) = core.shape_forge().lookup_position(object_proto.shape_id(), si) { object_proto.set_data_meta(pos, PropAttributes::new(true, false, true)); } } let ctor_ptr = session.builtin_world().object_constructor.as_ptr() as *mut JsObject; bind_constructor!( core, global, "Object", ctor_ptr, oxide_builtins::object::object_constructor::, 1 ); }