From 7a46e32f04d13f06f6704fbe0b76bd3f743f45f9 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 8 Jun 2026 21:50:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20array=5Fpush=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/builtins/array.rs | 6 +++--- crates/oxide_vm/tests/builtins_array_tests.rs | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/crates/oxide_vm/src/builtins/array.rs b/crates/oxide_vm/src/builtins/array.rs index 0f4e004c..4905dc56 100644 --- a/crates/oxide_vm/src/builtins/array.rs +++ b/crates/oxide_vm/src/builtins/array.rs @@ -118,9 +118,9 @@ pub fn array_push(vm: &mut Vm, args: &[u8]) -> NativeResult { arr.set_prop_at(len as u8, val); len += 1; } - let new_len = (len as u8).min(31); - arr.set_prop_count(new_len); - Ok(JsValue::int(new_len as i32)) + let stored_len = (len as u8).min(31); + arr.set_prop_count(stored_len); + Ok(JsValue::int(len as i32)) } pub fn array_pop(vm: &mut Vm, args: &[u8]) -> NativeResult { diff --git a/crates/oxide_vm/tests/builtins_array_tests.rs b/crates/oxide_vm/tests/builtins_array_tests.rs index 88249b9d..39dda425 100644 --- a/crates/oxide_vm/tests/builtins_array_tests.rs +++ b/crates/oxide_vm/tests/builtins_array_tests.rs @@ -1,4 +1,5 @@ use oxide_compiler::compiler::Compiler; +use oxide_vm::builtins::array::{array_constructor, array_push}; use oxide_vm::vm::Vm; fn eval(source: &str) -> Result { @@ -26,6 +27,17 @@ fn array_push_returns_length() { assert_eq!(result.as_int(), 4); } +#[test] +fn array_push_returns_true_length_beyond_31() { + let mut vm = Vm::new(); + vm.set_reg(1, oxide_types::value::JsValue::int(31)); + let array = array_constructor(&mut vm, &[0, 1]).unwrap(); + vm.set_reg(0, array); + vm.set_reg(1, oxide_types::value::JsValue::int(99)); + let result = array_push(&mut vm, &[0, 1]).unwrap(); + assert_eq!(result.as_int(), 32); +} + #[test] fn array_pop_returns_last() { let result = eval("[1,2,3].pop()").unwrap();