From 2301d8a491386c315d15eae8c0f6139dfd5912e6 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 5 Jun 2026 03:29:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BF=90=E8=A1=8C=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E5=89=8D=E5=B0=86=E7=BB=93=E6=9E=9C=E7=A7=BB=E8=87=B3=20r0=20?= =?UTF-8?q?=E5=AF=84=E5=AD=98=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/compiler.rs | 45 ++++++++++++++++++--------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/crates/oxide_compiler/src/compiler.rs b/crates/oxide_compiler/src/compiler.rs index 8ea1bc21..6c047886 100644 --- a/crates/oxide_compiler/src/compiler.rs +++ b/crates/oxide_compiler/src/compiler.rs @@ -73,8 +73,15 @@ impl Compiler { ctx.max_regs = ctx.max_regs.max(1); ctx.reset_regs(); + let mut last_result = 0u8; for stmt in &program.body { - self.emit_statement(stmt, &mut ctx)?; + if let Some(r) = self.emit_statement(stmt, &mut ctx)? { + last_result = r; + } + } + + if last_result != 0 { + ctx.emit(opcode::encode(OpCode::LOAD_VAR, 0, last_result, 0)); } ctx.emit(opcode::encode(OpCode::HALT, 0, 0, 0)); @@ -191,35 +198,43 @@ impl Compiler { // ── Pass 2: Emitter ── impl Compiler { - fn emit_statement(&self, stmt: &Statement, ctx: &mut CompileCtx) -> Result<(), String> { + fn emit_statement(&self, stmt: &Statement, ctx: &mut CompileCtx) -> Result, String> { match stmt { Statement::ExpressionStatement(es) => { - self.emit_expression(&es.expression, ctx)?; + Ok(Some(self.emit_expression(&es.expression, ctx)?)) } Statement::VariableDeclaration(decl) => { + let mut r = None; for d in &decl.declarations { if let Some(init) = &d.init { - self.emit_expression(init, ctx)?; + r = Some(self.emit_expression(init, ctx)?); } } + Ok(r) } - Statement::ReturnStatement(ret) => match &ret.argument { - Some(expr) => { - let r = self.emit_expression(expr, ctx)?; - ctx.emit(opcode::encode(OpCode::RETURN, r, 0, 0)); + Statement::ReturnStatement(ret) => { + match &ret.argument { + Some(expr) => { + let r = self.emit_expression(expr, ctx)?; + ctx.emit(opcode::encode(OpCode::RETURN, r, 0, 0)); + } + None => { + ctx.emit(opcode::encode(OpCode::RETURN, 0, 0, 0)); + } } - None => { - ctx.emit(opcode::encode(OpCode::RETURN, 0, 0, 0)); - } - }, + Ok(None) + } Statement::BlockStatement(block) => { + let mut r = None; for s in &block.body { - self.emit_statement(s, ctx)?; + if let Some(rr) = self.emit_statement(s, ctx)? { + r = Some(rr); + } } + Ok(r) } - _ => {} + _ => Ok(None), } - Ok(()) } fn emit_expression(&self, expr: &Expression, ctx: &mut CompileCtx) -> Result {