use std::sync::Arc; use oxide_kernel::builtin::ArrayMethods; use oxide_kernel::kernel::{KernelCore, KernelSession}; use oxide_types::object::{JsObject, PropAttributes}; use crate::bind_constructor; use crate::bindings::apply_binding_table; /// 把 Array 构造器与原型方法绑定到 global。 pub fn bind_array(core: &Arc, session: &KernelSession, global: &mut JsObject) { let _array_methods = ArrayMethods { is_array: oxide_builtins::array::array_is_array:: as *const (), from: oxide_builtins::array::array_from:: as *const (), of: oxide_builtins::array::array_of:: as *const (), push: oxide_builtins::array::array_push:: as *const (), pop: oxide_builtins::array::array_pop:: as *const (), slice: oxide_builtins::array::array_slice:: as *const (), splice: oxide_builtins::array::array_splice:: as *const (), concat: oxide_builtins::array::array_concat:: as *const (), join: oxide_builtins::array::array_join:: as *const (), index_of: oxide_builtins::array::array_index_of:: as *const (), includes: oxide_builtins::array::array_includes:: as *const (), reverse: oxide_builtins::array::array_reverse:: as *const (), for_each: oxide_builtins::array::array_for_each:: as *const (), map: oxide_builtins::array::array_map:: as *const (), filter: oxide_builtins::array::array_filter:: as *const (), reduce: oxide_builtins::array::array_reduce:: as *const (), find: oxide_builtins::array::array_find:: as *const (), some: oxide_builtins::array::array_some:: as *const (), every: oxide_builtins::array::array_every:: as *const (), flat: oxide_builtins::array::array_flat:: as *const (), flat_map: oxide_builtins::array::array_flat_map:: as *const (), shift: oxide_builtins::array::array_shift:: as *const (), unshift: oxide_builtins::array::array_unshift:: as *const (), fill: oxide_builtins::array::array_fill:: as *const (), copy_within: oxide_builtins::array::array_copy_within:: as *const (), at: oxide_builtins::array::array_at:: as *const (), last_index_of: oxide_builtins::array::array_last_index_of:: as *const (), find_index: oxide_builtins::array::array_find_index:: as *const (), find_last: oxide_builtins::array::array_find_last:: as *const (), reduce_right: oxide_builtins::array::array_reduce_right:: as *const (), sort: oxide_builtins::array::array_sort:: as *const (), values: oxide_builtins::array::array_values:: as *const (), entries: oxide_builtins::array::array_entries:: as *const (), keys: oxide_builtins::array::array_keys:: as *const (), find_last_index: oxide_builtins::array::array_find_last_index:: as *const (), to_sorted: oxide_builtins::array::array_to_sorted:: as *const (), to_reversed: oxide_builtins::array::array_to_reversed:: as *const (), to_spliced: oxide_builtins::array::array_to_spliced:: as *const (), with_method: oxide_builtins::array::array_with:: as *const (), }; session.builtin_world().bind_array_methods( &_array_methods, core.perm_interner().as_ref(), core.shape_forge().as_ref(), ); let array_proto_ptr = session.builtin_world().array_proto.as_ptr() as *mut JsObject; let array_proto = unsafe { &mut *array_proto_ptr }; apply_binding_table( session.builtin_world(), array_proto, core, &[("toString", oxide_builtins::array::array_to_string:: as *const (), 0)], ); // 内置原型方法不可枚举(否则会泄漏进 for-in)。 let si = core.perm_interner().intern("toString").0; if let Some(pos) = core.shape_forge().lookup_position(array_proto.shape_id(), si) { array_proto.set_data_meta(pos, PropAttributes::new(true, false, true)); } let ctor_ptr = session.builtin_world().array_constructor.as_ptr() as *mut JsObject; bind_constructor!(core, global, "Array", ctor_ptr, oxide_builtins::array::array_constructor::, 1, hash: true); }