use std::sync::Arc; use crate::bindings::{apply_binding_table, configure_native_constructor}; use oxide_kernel::builtin::StringMethods; use oxide_kernel::kernel::{KernelCore, KernelSession}; use oxide_types::object::JsObject; use oxide_types::value::JsValue; /// 把 String 构造器与原型方法绑定到 global。 pub fn bind_string(core: &Arc, session: &KernelSession, global: &mut JsObject) { let string_methods = StringMethods { from_char_code: oxide_builtins::string::string_from_char_code:: as *const (), index_of: oxide_builtins::string::string_index_of:: as *const (), includes: oxide_builtins::string::string_includes:: as *const (), char_at: oxide_builtins::string::string_char_at:: as *const (), char_code_at: oxide_builtins::string::string_char_code_at:: as *const (), concat: oxide_builtins::string::string_concat:: as *const (), slice: oxide_builtins::string::string_slice:: as *const (), substring: oxide_builtins::string::string_substring:: as *const (), to_upper_case: oxide_builtins::string::string_to_upper_case:: as *const (), to_lower_case: oxide_builtins::string::string_to_lower_case:: as *const (), trim: oxide_builtins::string::string_trim:: as *const (), repeat: oxide_builtins::string::string_repeat:: as *const (), pad_start: oxide_builtins::string::string_pad_start:: as *const (), pad_end: oxide_builtins::string::string_pad_end:: as *const (), starts_with: oxide_builtins::string::string_starts_with:: as *const (), ends_with: oxide_builtins::string::string_ends_with:: as *const (), split: oxide_builtins::string::string_split:: as *const (), replace: oxide_builtins::string::string_replace:: as *const (), match_fn: oxide_builtins::string::string_match_fn:: as *const (), search: oxide_builtins::string::string_search:: as *const (), trim_start: oxide_builtins::string::string_trim_start:: as *const (), trim_end: oxide_builtins::string::string_trim_end:: as *const (), code_point_at: oxide_builtins::string::string_code_point_at:: as *const (), normalize: oxide_builtins::string::string_normalize:: as *const (), match_all: oxide_builtins::string::string_match_all:: as *const (), replace_all: oxide_builtins::string::string_replace_all:: as *const (), value_of: oxide_builtins::string::string_value_of:: as *const (), substr: oxide_builtins::string::string_substr:: as *const (), at: oxide_builtins::string::string_at:: as *const (), last_index_of: oxide_builtins::string::string_last_index_of:: as *const (), from_code_point: oxide_builtins::string::string_from_code_point:: as *const (), is_well_formed: oxide_builtins::string::string_is_well_formed:: as *const (), to_well_formed: oxide_builtins::string::string_to_well_formed:: as *const (), }; session.builtin_world().bind_string_methods( &string_methods, core.perm_interner().as_ref(), core.shape_forge().as_ref(), ); let ctor_ptr = session.builtin_world().string_constructor.as_ptr() as *mut JsObject; let ctor = unsafe { &mut *ctor_ptr }; configure_native_constructor(ctor, oxide_builtins::string::string_constructor:: as *const (), 1); let proto_ptr = session.builtin_world().string_proto.as_ptr() as *mut JsObject; let proto = unsafe { &mut *proto_ptr }; apply_binding_table( session.builtin_world(), proto, core, &[("toString", oxide_builtins::string::string_to_string:: as *const (), 0)], ); // String.prototype[@@iterator]:逐 code point 迭代字符。 super::bind_well_known_method( session.builtin_world(), core, proto, 0, "iterator", oxide_builtins::string::string_symbol_iterator:: as *const (), 0, ); let si_str = core.perm_interner().intern("String").0; let str_shape = core.shape_forge().make_shape(global.shape_id(), si_str); let str_val = JsValue::from_js_object(session.builtin_world().string_constructor.as_ptr() as *mut JsObject); global.set_shape_id(str_shape); global.ensure_hash_props().push(str_val); global.bump_generation(); }