diff --git a/crates/nyrt/src/lib.rs b/crates/nyrt/src/lib.rs index e849e3e2..f1cef80b 100644 --- a/crates/nyrt/src/lib.rs +++ b/crates/nyrt/src/lib.rs @@ -147,6 +147,12 @@ pub extern "C" fn nyash_env_box_new(type_name: *const i8) -> i64 { Ok(s) => s, Err(_) => return 0, }; + // Core-first special cases: construct built-in boxes directly + if ty == "MapBox" { + use nyash_rust::boxes::map_box::MapBox; + let arc: std::sync::Arc = std::sync::Arc::new(MapBox::new()); + return handles::to_handle(arc) as i64; + } let reg = get_global_registry(); match reg.create_box(ty, &[]) { Ok(b) => { diff --git a/nyash_box.toml b/nyash_box.toml index 26b5411c..aeef4b97 100644 --- a/nyash_box.toml +++ b/nyash_box.toml @@ -32,15 +32,3 @@ returns = { type = "string" } [FileBox.methods.exists] returns = { type = "bool" } - -[ArrayBox] -type_id = 3 - -[ArrayBox.methods.length] -returns = { type = "i64" } - -[MapBox] -type_id = 11 - -[MapBox.methods.size] -returns = { type = "i64" } diff --git a/src/backend/llvm/compiler/codegen/instructions.rs b/src/backend/llvm/compiler/codegen/instructions.rs index 58f42ce0..825d27b0 100644 --- a/src/backend/llvm/compiler/codegen/instructions.rs +++ b/src/backend/llvm/compiler/codegen/instructions.rs @@ -1221,7 +1221,7 @@ pub(super) fn lower_boxcall<'ctx>( } } - // Map fast-paths (minimal): get/set/has/size with i64 keys + // Map fast-paths (core-first): get/set/has/size using NyRT shims with handle receiver if let Some(crate::mir::MirType::Box(bname)) = func.metadata.value_types.get(box_val) { if bname == "MapBox" && (method == "get" || method == "set" || method == "has" || method == "size") { let i64t = codegen.context.i64_type(); @@ -1257,7 +1257,7 @@ pub(super) fn lower_boxcall<'ctx>( "get" => { if args.len() != 1 { return Err("MapBox.get expects 1 arg".to_string()); } let key_v = *vmap.get(&args[0]).ok_or("map.get key missing")?; - // prefer integer key path; if pointer, convert to handle and call get_hh + // prefer integer key; if pointer, convert to handle and call get_hh let call = match key_v { BVE::IntValue(iv) => { let fnty = i64t.fn_type(&[i64t.into(), i64t.into()], false); diff --git a/src/backend/llvm/compiler/codegen/mod.rs b/src/backend/llvm/compiler/codegen/mod.rs index 86baac10..02976650 100644 --- a/src/backend/llvm/compiler/codegen/mod.rs +++ b/src/backend/llvm/compiler/codegen/mod.rs @@ -233,8 +233,13 @@ impl LLVMCompiler { ); } let type_id = *box_type_ids.get(box_type).unwrap_or(&0); + // Temporary gate: allow forcing MapBox to plugin path explicitly + let force_plugin_map = std::env::var("NYASH_LLVM_FORCE_PLUGIN_MAP") + .ok() + .as_deref() + == Some("1"); let i64t = codegen.context.i64_type(); - if type_id != 0 { + if type_id != 0 && !(box_type == "MapBox" && !force_plugin_map) { // declare i64 @nyash.box.birth_h(i64) let fn_ty = i64t.fn_type(&[i64t.into()], false); let callee = codegen diff --git a/src/mir/builder.rs b/src/mir/builder.rs index 570d8cb5..a790bc2c 100644 --- a/src/mir/builder.rs +++ b/src/mir/builder.rs @@ -125,6 +125,10 @@ impl MirBuilder { | ("StringBox", "toUpper") | ("StringBox", "toLower") => Some(super::MirType::String), ("ArrayBox", "length") => Some(super::MirType::Integer), + // Core MapBox minimal inference (core-first) + ("MapBox", "size") => Some(super::MirType::Integer), + ("MapBox", "has") => Some(super::MirType::Bool), + ("MapBox", "get") => Some(super::MirType::Box("Any".to_string())), _ => None, }; if let Some(mt) = inferred {