diff --git a/crates/oxide_kernel/src/builtin.rs b/crates/oxide_kernel/src/builtin.rs index be24cf1..0ba4298 100644 --- a/crates/oxide_kernel/src/builtin.rs +++ b/crates/oxide_kernel/src/builtin.rs @@ -217,6 +217,7 @@ pub struct BuiltinWorld { pub sym_search: P, pub sym_split: P, pub sym_iterator: P, + pub sym_to_primitive: P, pub stub_objects: Vec>, } @@ -539,6 +540,7 @@ impl BuiltinWorld { BuiltinId::SymSearch => &self.sym_search, BuiltinId::SymSplit => &self.sym_split, BuiltinId::SymIterator => &self.sym_iterator, + BuiltinId::SymToPrimitive => &self.sym_to_primitive, } } @@ -574,6 +576,7 @@ impl BuiltinWorld { let sym_search = P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())); let sym_split = P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())); let sym_iterator = P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())); + let sym_to_primitive = P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())); let stub_objects = Vec::new(); let world = Self { @@ -641,6 +644,7 @@ impl BuiltinWorld { sym_search, sym_split, sym_iterator, + sym_to_primitive, stub_objects, }; wire_builtin_world_links(&world); @@ -701,29 +705,39 @@ impl BuiltinWorld { }, ) }; - let (symbol_proto, symbol_constructor, sym_match, sym_replace, sym_search, sym_split, sym_iterator) = - if dirty.symbol_family { - let (symbol_proto, symbol_constructor) = make_named_pair(string_forge, shape_forge, labels, "Symbol"); - ( - symbol_proto, - symbol_constructor, - P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), - P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), - P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), - P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), - P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), - ) - } else { - ( - current.symbol_proto.clone(), - current.symbol_constructor.clone(), - current.sym_match.clone(), - current.sym_replace.clone(), - current.sym_search.clone(), - current.sym_split.clone(), - current.sym_iterator.clone(), - ) - }; + let ( + symbol_proto, + symbol_constructor, + sym_match, + sym_replace, + sym_search, + sym_split, + sym_iterator, + sym_to_primitive, + ) = if dirty.symbol_family { + let (symbol_proto, symbol_constructor) = make_named_pair(string_forge, shape_forge, labels, "Symbol"); + ( + symbol_proto, + symbol_constructor, + P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), + P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), + P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), + P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), + P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), + P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())), + ) + } else { + ( + current.symbol_proto.clone(), + current.symbol_constructor.clone(), + current.sym_match.clone(), + current.sym_replace.clone(), + current.sym_search.clone(), + current.sym_split.clone(), + current.sym_iterator.clone(), + current.sym_to_primitive.clone(), + ) + }; let math_object = if dirty.math { P::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())) @@ -861,6 +875,7 @@ impl BuiltinWorld { sym_search, sym_split, sym_iterator, + sym_to_primitive, stub_objects, }; wire_builtin_world_links(&world); diff --git a/crates/oxide_kernel/src/kernel.rs b/crates/oxide_kernel/src/kernel.rs index 467eeef..7a63dba 100644 --- a/crates/oxide_kernel/src/kernel.rs +++ b/crates/oxide_kernel/src/kernel.rs @@ -201,7 +201,7 @@ pub struct KernelSession { /// Maintenance: every new `BuiltinWorld` object field must be added here and to /// `KernelSession::dirty_since_snapshot()` so selective reset can rebuild the /// correct builtin family. -pub const NUM_BUILTINS: usize = 64; +pub const NUM_BUILTINS: usize = 65; #[derive(Clone, Copy, Debug, PartialEq, Eq)] #[repr(u8)] @@ -270,6 +270,7 @@ pub enum BuiltinId { SymSearch = 61, SymSplit = 62, SymIterator = 63, + SymToPrimitive = 64, } impl BuiltinId { @@ -338,6 +339,7 @@ impl BuiltinId { BuiltinId::SymSearch, BuiltinId::SymSplit, BuiltinId::SymIterator, + BuiltinId::SymToPrimitive, ]; } @@ -506,7 +508,8 @@ impl KernelSession { || gen(BuiltinId::SymReplace) != snap(BuiltinId::SymReplace) || gen(BuiltinId::SymSearch) != snap(BuiltinId::SymSearch) || gen(BuiltinId::SymSplit) != snap(BuiltinId::SymSplit) - || gen(BuiltinId::SymIterator) != snap(BuiltinId::SymIterator), + || gen(BuiltinId::SymIterator) != snap(BuiltinId::SymIterator) + || gen(BuiltinId::SymToPrimitive) != snap(BuiltinId::SymToPrimitive), math: gen(BuiltinId::MathObject) != snap(BuiltinId::MathObject), json: gen(BuiltinId::JsonObject) != snap(BuiltinId::JsonObject), date: gen(BuiltinId::DateConstructor) != snap(BuiltinId::DateConstructor) diff --git a/crates/oxide_vm/src/bindings/bind_symbol.rs b/crates/oxide_vm/src/bindings/bind_symbol.rs index 1b020df..5a9c6e1 100644 --- a/crates/oxide_vm/src/bindings/bind_symbol.rs +++ b/crates/oxide_vm/src/bindings/bind_symbol.rs @@ -53,6 +53,10 @@ pub fn bind_symbol(core: &Arc, session: &KernelSession, global: &mut "iterator", JsValue::from_js_object(session.builtin_world().sym_iterator.as_ptr() as *mut JsObject), ), + ( + "toPrimitive", + JsValue::from_js_object(session.builtin_world().sym_to_primitive.as_ptr() as *mut JsObject), + ), ] { bind_well_known_symbol(core, ctor, name, val); }