From 788a898b0119051f3df3117333ffc10d718d5a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Sun, 7 Jun 2026 22:26:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AD=97=E8=8A=82?= =?UTF-8?q?=E7=A0=81=E5=87=BD=E6=95=B0=E8=B0=83=E7=94=A8=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E5=AD=97=E6=89=A7=E8=A1=8C=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/emitter.rs | 4 +--- crates/oxide_vm/src/vm.rs | 11 ++++++----- crates/oxide_vm/tests/regression_tests.rs | 7 ++++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/oxide_compiler/src/emitter.rs b/crates/oxide_compiler/src/emitter.rs index b9c89d8..92844fd 100644 --- a/crates/oxide_compiler/src/emitter.rs +++ b/crates/oxide_compiler/src/emitter.rs @@ -1029,9 +1029,7 @@ impl Compiler { _ => OpCode::CALL, }; ctx.emit(opcode::encode(op, callee_reg, this_reg, first_arg_reg)); - if matches!(op, OpCode::CALL_NATIVE) { - ctx.emit(arg_regs.len() as u32); - } + ctx.emit(arg_regs.len() as u32); // Copy result from regs[0] into a dedicated register so multiple // call expressions don't overwrite each other. let result_reg = ctx.alloc_reg(); diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index e3455f3..77e6fbc 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -1191,12 +1191,13 @@ impl Vm { if !obj_ptr.is_null() { let obj = unsafe { &*obj_ptr }; if obj.is_function() { - if obj.native_fn().is_some() { - // Native call - use extension word for arg_count - let ext = self.bytecode[self.pc]; - self.pc += 1; - let arg_count = (ext & 0xFF) as usize; + // Always consume extension word for arg_count + let ext = self.bytecode[self.pc]; + self.pc += 1; + let arg_count = (ext & 0xFF) as usize; + if obj.native_fn().is_some() { + // Native call let mut args_buf = [0u8; 257]; args_buf[0] = this_reg; for i in 0..arg_count.min(256) { diff --git a/crates/oxide_vm/tests/regression_tests.rs b/crates/oxide_vm/tests/regression_tests.rs index 5ea070b..1997b5e 100644 --- a/crates/oxide_vm/tests/regression_tests.rs +++ b/crates/oxide_vm/tests/regression_tests.rs @@ -59,9 +59,10 @@ fn regression_recursion_depth_limit() { #[test] fn regression_throw_statement_errors() { - assert_eq!( - eval("throw 'error'"), - "vm error: opcode THROW not yet implemented" + let result = eval("throw 'error'"); + assert!( + result.contains("uncaught"), + "expected uncaught, got: {result}" ); }