From b6912c43693ff169a6c696fce0fece17f5c9f0cb Mon Sep 17 00:00:00 2001 From: Nilton Constantino Date: Mon, 2 Feb 2026 19:31:23 +0000 Subject: [PATCH] pr 59.2 --- .../prometeu-compiler/src/building/linker.rs | 4 ++-- .../tests/link_integration.rs | 2 +- .../src/virtual_machine/virtual_machine.rs | 4 ++++ test-cartridges/test01/cartridge/program.pbc | Bin 1068 -> 1074 bytes 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/prometeu-compiler/src/building/linker.rs b/crates/prometeu-compiler/src/building/linker.rs index 39fe039d..7dce576f 100644 --- a/crates/prometeu-compiler/src/building/linker.rs +++ b/crates/prometeu-compiler/src/building/linker.rs @@ -230,7 +230,6 @@ impl Linker { // Final Exports map for ProgramImage (String -> func_idx) // Only including exports from the ROOT project (the last one in build plan usually) - // Wait, the requirement says "emit final PBS v0 image". // In PBS v0, exports are name -> func_id. let mut final_exports = HashMap::new(); if let Some(root_module) = modules.last() { @@ -241,8 +240,9 @@ impl Linker { } } } + // v0: Fallback export for entrypoint `src/main/modules:frame` (root module) - if !final_exports.contains_key("src/main/modules:frame") { + if !final_exports.iter().any(|(name, _)| name.ends_with(":frame")) { if let Some(&root_offset) = module_function_offsets.last() { if let Some((idx, _)) = combined_function_names.iter().find(|(i, name)| *i >= root_offset && name == "frame") { final_exports.insert("src/main/modules:frame".to_string(), *idx); diff --git a/crates/prometeu-compiler/tests/link_integration.rs b/crates/prometeu-compiler/tests/link_integration.rs index 3359bc4e..824f97f0 100644 --- a/crates/prometeu-compiler/tests/link_integration.rs +++ b/crates/prometeu-compiler/tests/link_integration.rs @@ -67,7 +67,7 @@ fn test_integration_test01_link() { let mut vm = VirtualMachine::default(); // Use initialize to load the ROM and resolve entrypoint - vm.initialize(unit.rom, "src/main/modules:frame").expect("Failed to initialize VM"); + vm.initialize(unit.rom, "frame").expect("Failed to initialize VM"); let mut native = SimpleNative; let mut hw = SimpleHardware::new(); diff --git a/crates/prometeu-core/src/virtual_machine/virtual_machine.rs b/crates/prometeu-core/src/virtual_machine/virtual_machine.rs index 4f3fc5b8..062bfb78 100644 --- a/crates/prometeu-core/src/virtual_machine/virtual_machine.rs +++ b/crates/prometeu-core/src/virtual_machine/virtual_machine.rs @@ -160,6 +160,8 @@ impl VirtualMachine { // Try to resolve symbol name via ProgramImage exports if let Some(&func_idx) = program.exports.get(entrypoint) { program.functions[func_idx as usize].code_offset as usize + } else if let Some(&func_idx) = program.exports.get(&format!("src/main/modules:{}", entrypoint)) { + program.functions[func_idx as usize].code_offset as usize } else { return Err(VmInitError::EntrypointNotFound); } @@ -183,6 +185,8 @@ impl VirtualMachine { (addr, idx) } else if let Some(&func_idx) = self.program.exports.get(entrypoint) { (self.program.functions[func_idx as usize].code_offset as usize, func_idx as usize) + } else if let Some(&func_idx) = self.program.exports.get(&format!("src/main/modules:{}", entrypoint)) { + (self.program.functions[func_idx as usize].code_offset as usize, func_idx as usize) } else { (0, 0) }; diff --git a/test-cartridges/test01/cartridge/program.pbc b/test-cartridges/test01/cartridge/program.pbc index 648f85298ae3dcdda50d5d9c6c271010805c7407..807e2d8bce710f6d3efbbf102e9abbe1fa933a1a 100644 GIT binary patch delta 47 ycmZ3(v58|s1f$Z%$nDHZj0_A6AS?#N#YM^bxrv#1`nmZjr8%j^R%u0vxv2mdj|~9; delta 41 ocmdnQv4&$p1f$Hx$nDHBObigf45SiMQW$|0D-fp@CFZ6A0J1a(lK=n!