diff --git a/crates/prometeu-compiler/src/compiler.rs b/crates/prometeu-compiler/src/compiler.rs index ad13f568..43e28542 100644 --- a/crates/prometeu-compiler/src/compiler.rs +++ b/crates/prometeu-compiler/src/compiler.rs @@ -242,14 +242,15 @@ mod tests { 006C GetLocal U32(1) 0072 SetLocal U32(2) 0078 Nop -007A LoadRef U32(0) -0080 SetLocal U32(3) -0086 GetLocal U32(3) -008C PushConst U32(5) -0092 Add -0094 SetLocal U32(4) -009A Nop -009C Ret +007A GetLocal U32(2) +0080 LoadRef U32(0) +0086 SetLocal U32(3) +008C GetLocal U32(3) +0092 PushConst U32(5) +0098 Add +009A SetLocal U32(4) +00A0 Nop +00A2 Ret "#; assert_eq!(disasm_text, expected_disasm); diff --git a/crates/prometeu-compiler/src/frontends/pbs/lowering.rs b/crates/prometeu-compiler/src/frontends/pbs/lowering.rs index 1dc577e7..faddc13f 100644 --- a/crates/prometeu-compiler/src/frontends/pbs/lowering.rs +++ b/crates/prometeu-compiler/src/frontends/pbs/lowering.rs @@ -238,6 +238,8 @@ impl<'a> Lowerer<'a> { // 3. Begin Operation self.emit(Instr::BeginPeek { gate: ValueId(gate_slot) }); + self.emit(Instr::GetLocal(gate_slot)); + self.emit(Instr::LoadRef(0)); // 4. Bind view to local self.local_vars.push(HashMap::new()); @@ -266,6 +268,8 @@ impl<'a> Lowerer<'a> { // 3. Begin Operation self.emit(Instr::BeginBorrow { gate: ValueId(gate_slot) }); + self.emit(Instr::GetLocal(gate_slot)); + self.emit(Instr::LoadRef(0)); // 4. Bind view to local self.local_vars.push(HashMap::new()); @@ -294,6 +298,8 @@ impl<'a> Lowerer<'a> { // 3. Begin Operation self.emit(Instr::BeginMutate { gate: ValueId(gate_slot) }); + self.emit(Instr::GetLocal(gate_slot)); + self.emit(Instr::LoadRef(0)); // 4. Bind view to local self.local_vars.push(HashMap::new()); diff --git a/crates/prometeu-compiler/src/lowering/core_to_vm.rs b/crates/prometeu-compiler/src/lowering/core_to_vm.rs index 1cd3ed14..63ebfbc3 100644 --- a/crates/prometeu-compiler/src/lowering/core_to_vm.rs +++ b/crates/prometeu-compiler/src/lowering/core_to_vm.rs @@ -75,24 +75,15 @@ pub fn lower_function(core_func: &ir_core::Function) -> Result type_id: ir_vm::TypeId(ty.0), slots: *slots }, - ir_core::Instr::BeginPeek { .. } => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateBeginPeek, None)); - ir_vm::InstrKind::GateLoad { offset: 0 } - } - ir_core::Instr::BeginBorrow { .. } => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateBeginBorrow, None)); - ir_vm::InstrKind::GateLoad { offset: 0 } - } - ir_core::Instr::BeginMutate { .. } => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateBeginMutate, None)); - ir_vm::InstrKind::GateLoad { offset: 0 } - } + ir_core::Instr::BeginPeek { .. } => ir_vm::InstrKind::GateBeginPeek, + ir_core::Instr::BeginBorrow { .. } => ir_vm::InstrKind::GateBeginBorrow, + ir_core::Instr::BeginMutate { .. } => ir_vm::InstrKind::GateBeginMutate, ir_core::Instr::EndPeek => ir_vm::InstrKind::GateEndPeek, ir_core::Instr::EndBorrow => ir_vm::InstrKind::GateEndBorrow, ir_core::Instr::EndMutate => ir_vm::InstrKind::GateEndMutate, ir_core::Instr::LoadRef(offset) => ir_vm::InstrKind::GateLoad { offset: *offset }, ir_core::Instr::StoreRef(offset) => ir_vm::InstrKind::GateStore { offset: *offset }, - ir_core::Instr::Free => ir_vm::InstrKind::Nop, + ir_core::Instr::Free => anyhow::bail!("Instruction 'Free' cannot be represented in ir_vm v0"), }; vm_func.body.push(ir_vm::Instruction::new(kind, None)); } diff --git a/docs/specs/pbs/files/PRs para Junie.md b/docs/specs/pbs/files/PRs para Junie.md index 25594e3f..fbe0e6c1 100644 --- a/docs/specs/pbs/files/PRs para Junie.md +++ b/docs/specs/pbs/files/PRs para Junie.md @@ -1,35 +1,3 @@ -# PR-04 — Update `core_to_vm` Lowering (Kill Placeholders) - -### Goal - -Make lowering the **only** integration point between Core IR and VM IR. - -### Required Mapping - -* `ir_core::Alloc { ty, slots }` - → `ir_vm::Alloc { type_id, slots }` - -* `BeginPeek / Borrow / Mutate` - → `GateBegin*` - -* `EndPeek / Borrow / Mutate` - → `GateEnd*` - -**Forbidden:** - -* `LoadRef(0)` -* `Nop` as semantic replacement - -### Tests - -* Given a Core IR program with alloc + begin/end, VM IR must contain: - - * shape-explicit `Alloc` - * correctly paired gate begin/end - * zero placeholders - ---- - # PR-05 — Gate-Aware Access Path (Choose One, Explicitly) ### Goal