From 7799ebb055979fe2ab062effa27b6c11ca575ffa Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 14 Aug 2026 05:26:46 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B8=85=E7=90=86=20oxide=5Fvm=20clip?= =?UTF-8?q?py=20=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/async_from_sync.rs | 2 +- crates/oxide_vm/src/async_func.rs | 3 ++- crates/oxide_vm/src/async_generator.rs | 7 ++++--- crates/oxide_vm/src/bindings/bind_typed_array.rs | 2 +- crates/oxide_vm/src/dispatch/arithmetic.rs | 9 +++------ crates/oxide_vm/src/dispatch/member.rs | 1 + crates/oxide_vm/src/generator.rs | 1 + crates/oxide_vm/src/promise.rs | 11 ++++++----- crates/oxide_vm/src/suspended.rs | 2 +- crates/oxide_vm/src/vm.rs | 2 +- crates/oxide_vm/src/vm_dispatch_ctrl.rs | 8 ++------ crates/oxide_vm/src/vm_dispatch_misc.rs | 12 +++--------- crates/oxide_vm/src/vm_props.rs | 3 ++- crates/oxide_vm/tests/async_tests.rs | 2 +- 14 files changed, 29 insertions(+), 36 deletions(-) diff --git a/crates/oxide_vm/src/async_from_sync.rs b/crates/oxide_vm/src/async_from_sync.rs index 6400c9b..cee235e 100644 --- a/crates/oxide_vm/src/async_from_sync.rs +++ b/crates/oxide_vm/src/async_from_sync.rs @@ -294,7 +294,7 @@ fn async_from_sync_unwrap(vm: &mut Vm, args: &[u8]) -> NativeResult { let done_si = vm.kernel_core.perm_interner().intern(ASFS_DONE_PROP).0; let done = vm .resolve_property(callee_obj, done_si) - .map_or(false, oxide_runtime_api::to_boolean); + .is_some_and(oxide_runtime_api::to_boolean); let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() }; let result = make_iter_result(vm, value, done); let _ = vm.call_function_sync(resolve, JsValue::undefined(), &[result]); diff --git a/crates/oxide_vm/src/async_func.rs b/crates/oxide_vm/src/async_func.rs index e81b400..61134e9 100644 --- a/crates/oxide_vm/src/async_func.rs +++ b/crates/oxide_vm/src/async_func.rs @@ -381,7 +381,7 @@ fn async_await_resume_closure(vm: &mut Vm, args: &[u8]) -> NativeResult { let ctx_si = vm.kernel_core.perm_interner().intern(ASYNC_CTX_PROP).0; let ctx = vm.resolve_property(callee_obj, ctx_si).unwrap_or(JsValue::undefined()); let role_si = vm.kernel_core.perm_interner().intern(ASYNC_REJECT_PROP).0; - let is_reject = vm.resolve_property(callee_obj, role_si).map_or(false, to_boolean); + let is_reject = vm.resolve_property(callee_obj, role_si).is_some_and(to_boolean); let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() }; let mode = if is_reject { AsyncResumeMode::Throw(value) @@ -445,6 +445,7 @@ fn async_function_stub(vm: &mut Vm, _args: &[u8]) -> NativeResult { // ── session GC 支撑:状态快照中的 JsValues 作为异步上下文对象边追踪 ── +#[expect(clippy::mut_from_ref)] fn async_state_mut(obj: &JsObject) -> Option<&mut AsyncState> { let ptr = obj.native_data() as *mut AsyncState; if ptr.is_null() { diff --git a/crates/oxide_vm/src/async_generator.rs b/crates/oxide_vm/src/async_generator.rs index 177773a..fd7e890 100644 --- a/crates/oxide_vm/src/async_generator.rs +++ b/crates/oxide_vm/src/async_generator.rs @@ -610,7 +610,7 @@ fn async_gen_await_resume_closure(vm: &mut Vm, args: &[u8]) -> NativeResult { let role_si = vm.kernel_core.perm_interner().intern(AG_REJECT_PROP).0; let is_reject = vm .resolve_property(callee_obj, role_si) - .map_or(false, oxide_runtime_api::to_boolean); + .is_some_and(oxide_runtime_api::to_boolean); let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() }; // 把 await 结果写入当前请求的注入模式,resume 时按角色恢复。 if ctx.is_object() { @@ -649,11 +649,11 @@ fn async_gen_yield_unwrap_closure(vm: &mut Vm, args: &[u8]) -> NativeResult { let raw_si = vm.kernel_core.perm_interner().intern(AG_YIELD_RAW_PROP).0; let raw = vm .resolve_property(callee_obj, raw_si) - .map_or(false, oxide_runtime_api::to_boolean); + .is_some_and(oxide_runtime_api::to_boolean); let role_si = vm.kernel_core.perm_interner().intern(AG_REJECT_PROP).0; let is_reject = vm .resolve_property(callee_obj, role_si) - .map_or(false, oxide_runtime_api::to_boolean); + .is_some_and(oxide_runtime_api::to_boolean); let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() }; if is_reject { // yield 值被拒:next() 的 promise reject,且生成器关闭(后续 next 直接 done)。 @@ -817,6 +817,7 @@ fn async_generator_function_stub(vm: &mut Vm, _args: &[u8]) -> NativeResult { // ── session GC 支撑:状态快照中的 JsValues 作为异步生成器对象边追踪 ── +#[expect(clippy::mut_from_ref)] fn async_gen_state_mut(obj: &JsObject) -> Option<&mut AsyncGeneratorState> { let ptr = obj.native_data() as *mut AsyncGeneratorState; if ptr.is_null() { diff --git a/crates/oxide_vm/src/bindings/bind_typed_array.rs b/crates/oxide_vm/src/bindings/bind_typed_array.rs index 0b65aee..604747d 100644 --- a/crates/oxide_vm/src/bindings/bind_typed_array.rs +++ b/crates/oxide_vm/src/bindings/bind_typed_array.rs @@ -79,7 +79,7 @@ fn set_bypes_per_element(core: &Arc, ctor_ptr: *mut JsObject, proto_ let proto_shape = core.shape_forge().make_shape(proto.shape_id(), bpe_si); proto.set_shape_id(proto_shape); let proto_pos = proto.push_prop(bpe_val); - proto.set_data_meta(proto_pos as u32, attrs); + proto.set_data_meta(proto_pos, attrs); proto.bump_generation(); } diff --git a/crates/oxide_vm/src/dispatch/arithmetic.rs b/crates/oxide_vm/src/dispatch/arithmetic.rs index 7f3a1f9..e7e77ff 100644 --- a/crates/oxide_vm/src/dispatch/arithmetic.rs +++ b/crates/oxide_vm/src/dispatch/arithmetic.rs @@ -273,12 +273,9 @@ impl Vm { let a = lv.as_int(); let b = rv.as_int(); if b != 0 { - match a.checked_rem(b) { - Some(v) => { - self.regs[rd] = JsValue::int(v); - return Ok(()); - } - None => {} + if let Some(v) = a.checked_rem(b) { + self.regs[rd] = JsValue::int(v); + return Ok(()); } } self.regs[rd] = JsValue::float(a as f64 % b as f64); diff --git a/crates/oxide_vm/src/dispatch/member.rs b/crates/oxide_vm/src/dispatch/member.rs index c52c919..2a7e7eb 100644 --- a/crates/oxide_vm/src/dispatch/member.rs +++ b/crates/oxide_vm/src/dispatch/member.rs @@ -256,6 +256,7 @@ impl Vm { Ok(()) } + #[allow(clippy::too_many_arguments)] fn dispatch_compound_member_shift( &mut self, op_name: &str, rd: usize, a: usize, b: usize, error_msg: &str, is_right: bool, is_unsigned: bool, ) -> Result<(), String> { diff --git a/crates/oxide_vm/src/generator.rs b/crates/oxide_vm/src/generator.rs index c87297f..bbe9fc9 100644 --- a/crates/oxide_vm/src/generator.rs +++ b/crates/oxide_vm/src/generator.rs @@ -797,6 +797,7 @@ fn generator_function_stub(vm: &mut Vm, _args: &[u8]) -> NativeResult { // ── session GC 支撑:状态快照中的 JsValues 作为生成器对象边追踪 ── +#[expect(clippy::mut_from_ref)] fn generator_state_mut(obj: &JsObject) -> Option<&mut GeneratorState> { let ptr = obj.native_data() as *mut GeneratorState; if ptr.is_null() { diff --git a/crates/oxide_vm/src/promise.rs b/crates/oxide_vm/src/promise.rs index 1dcd9c3..85ecd24 100644 --- a/crates/oxide_vm/src/promise.rs +++ b/crates/oxide_vm/src/promise.rs @@ -1069,7 +1069,7 @@ fn promise_finally_handler(vm: &mut Vm, args: &[u8]) -> NativeResult { let rj_si = vm.kernel_core.perm_interner().intern(FINALLY_REJECT_PROP).0; let is_reject = vm .resolve_property(callee_obj, rj_si) - .map_or(false, oxide_runtime_api::to_boolean); + .is_some_and(oxide_runtime_api::to_boolean); let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() }; match vm.call_function_sync(on_finally, JsValue::undefined(), &[]) { Ok(_) => { @@ -1366,7 +1366,7 @@ fn agg_element_state(vm: &mut Vm) -> Option<(JsValue, i32)> { let al_si = vm.kernel_core.perm_interner().intern(AGG_ALREADY_PROP).0; // SAFETY: callee 是当前调用的存活函数对象。 let callee_ref = unsafe { &*callee_ptr }; - if vm.resolve_property(callee_ref, al_si).map_or(false, oxide_runtime_api::to_boolean) { + if vm.resolve_property(callee_ref, al_si).is_some_and(oxide_runtime_api::to_boolean) { return None; } let record = vm.resolve_property(callee_ref, rec_si).unwrap_or(JsValue::undefined()); @@ -1464,7 +1464,7 @@ fn promise_all_resolve_element(vm: &mut Vm, args: &[u8]) -> NativeResult { NativeResult::Ok(JsValue::undefined()) } -/// `Promise.race` 使用能力 resolve/reject 直连,无独立元素函数。 +// `Promise.race` 使用能力 resolve/reject 直连,无独立元素函数。 /// `Promise.allSettled` resolve 元素:写 `{status:'fulfilled', value}` 记录。 fn promise_all_settled_resolve_element(vm: &mut Vm, args: &[u8]) -> NativeResult { @@ -1587,8 +1587,8 @@ fn capability_executor(vm: &mut Vm, args: &[u8]) -> NativeResult { let obj = unsafe { &*callee.as_js_object_ptr() }; let res_si = vm.kernel_core.perm_interner().intern(CAP_RESOLVE_PROP).0; let rej_si = vm.kernel_core.perm_interner().intern(CAP_REJECT_PROP).0; - let held = vm.resolve_property(obj, res_si).map_or(false, |v| !v.is_undefined()) - || vm.resolve_property(obj, rej_si).map_or(false, |v| !v.is_undefined()); + let held = vm.resolve_property(obj, res_si).is_some_and(|v| !v.is_undefined()) + || vm.resolve_property(obj, rej_si).is_some_and(|v| !v.is_undefined()); if held { return NativeResult::Err(oxide_builtins::error::create_type_error( vm, @@ -1615,6 +1615,7 @@ fn promise_state_ref(obj: &JsObject) -> Option<&PromiseState> { } } +#[expect(clippy::mut_from_ref)] fn promise_state_mut(obj: &JsObject) -> Option<&mut PromiseState> { let ptr = obj.native_data() as *mut PromiseState; if ptr.is_null() { diff --git a/crates/oxide_vm/src/suspended.rs b/crates/oxide_vm/src/suspended.rs index e39525e..f07f996 100644 --- a/crates/oxide_vm/src/suspended.rs +++ b/crates/oxide_vm/src/suspended.rs @@ -80,7 +80,7 @@ impl SuspendedFrame { pub fn save_from(&mut self, vm: &mut Vm, callee: JsValue) -> Result<(), String> { let frame = vm.frames.pop().ok_or_else(|| "frame missing on suspend".to_string())?; self.frame = Some(frame); - self.regs = Box::new(vm.regs); + *self.regs = vm.regs; self.pc = vm.pc; self.bytecode = std::mem::take(&mut vm.bytecode); self.sub_idx = if callee.is_object() { diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 9636d98..2715e7c 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -755,7 +755,7 @@ impl Vm { if !global_ptr.is_null() { // SAFETY: KernelSession 在 VM 生命周期内拥有 global_object。 unsafe { - (*global_ptr).rewrite_object_values(|value| rewrite(value)); + (*global_ptr).rewrite_object_values(rewrite); } } } diff --git a/crates/oxide_vm/src/vm_dispatch_ctrl.rs b/crates/oxide_vm/src/vm_dispatch_ctrl.rs index 9f04644..24afe2f 100644 --- a/crates/oxide_vm/src/vm_dispatch_ctrl.rs +++ b/crates/oxide_vm/src/vm_dispatch_ctrl.rs @@ -315,9 +315,7 @@ impl Vm { return None; } let (frame_depth, finally_pc, finally_active) = { - let Some(h) = self.try_stack.last() else { - return None; - }; + let h = self.try_stack.last()?; (h.frame_depth, h.finally_pc, h.finally_active) }; if frame_depth != depth { @@ -524,9 +522,7 @@ impl Vm { let depth = self.frames.len(); loop { let (frame_depth, finally_pc, finally_active) = { - let Some(h) = self.try_stack.last() else { - return None; - }; + let h = self.try_stack.last()?; (h.frame_depth, h.finally_pc, h.finally_active) }; if frame_depth != depth { diff --git a/crates/oxide_vm/src/vm_dispatch_misc.rs b/crates/oxide_vm/src/vm_dispatch_misc.rs index d83950e..241d92c 100644 --- a/crates/oxide_vm/src/vm_dispatch_misc.rs +++ b/crates/oxide_vm/src/vm_dispatch_misc.rs @@ -415,7 +415,7 @@ impl Vm { // std Vec 建完后迁入 bump 区,避免枚举循环期间对 self 的 &mut 借用 // 与 bump 借用冲突。 let keys_bump: bumpalo::collections::Vec<(JsValue, u32)> = - bumpalo::collections::Vec::from_iter_in(keys_vec.into_iter(), self.epoch.bump()); + bumpalo::collections::Vec::from_iter_in(keys_vec, self.epoch.bump()); let iter = self.epoch.alloc(ForInIter { keys: keys_bump, index: 0 }); self.iters.push_for_in(iter.cast::>()); Ok(()) @@ -555,20 +555,14 @@ impl Vm { } let iter_obj = unsafe { &*iterator.as_js_object_ptr() }; let return_si = self.kernel_core.perm_interner().intern("return").0; - let return_fn = match self.ordinary_get(iter_obj, return_si, iterator) { - Ok(v) => v, - Err(e) => return Err(e), - }; + let return_fn = self.ordinary_get(iter_obj, return_si, iterator)?; if !return_fn.is_object() { return Ok(()); } if !unsafe { &*return_fn.as_js_object_ptr() }.is_function() { return Ok(()); } - let inner = match self.call_function_sync(return_fn, iterator, &[]) { - Ok(v) => v, - Err(e) => return Err(e), - }; + let inner = self.call_function_sync(return_fn, iterator, &[])?; if !inner.is_object() { return self.raise_type_error("iterator return() result is not an object"); } diff --git a/crates/oxide_vm/src/vm_props.rs b/crates/oxide_vm/src/vm_props.rs index 54b301e..93f7103 100644 --- a/crates/oxide_vm/src/vm_props.rs +++ b/crates/oxide_vm/src/vm_props.rs @@ -177,7 +177,7 @@ impl Vm { // receiver 非 TA 时按规范把写入落到 receiver 对象,不碰 TA buffer。 if obj.is_typed_array_obj() { if let Some(index) = self.array_index_from_property_key(prop_name_si) { - if receiver.as_js_object_ptr() != obj as *const JsObject as *mut JsObject { + if !std::ptr::eq(receiver.as_js_object_ptr(), obj as *mut JsObject) { return self.set_to_receiver(obj, prop_name_si, val, receiver, index as usize, use_frame_push); } return oxide_builtins::typed_array::typed_array_element_set(self, obj, index, val); @@ -547,6 +547,7 @@ impl Vm { /// 数组索引属性(`"0"`~`"4294967294"`)的 define 路径:存入元素区并维护 /// `array_prop_count`(length 随最高索引增长),meta 与元素槽对齐。 + #[allow(clippy::too_many_arguments)] fn define_array_index_element( &mut self, obj: &mut JsObject, index: u32, val: JsValue, attributes: PropAttributes, is_accessor: bool, get: JsValue, set: JsValue, diff --git a/crates/oxide_vm/tests/async_tests.rs b/crates/oxide_vm/tests/async_tests.rs index e4e436b..a1165ee 100644 --- a/crates/oxide_vm/tests/async_tests.rs +++ b/crates/oxide_vm/tests/async_tests.rs @@ -36,7 +36,7 @@ fn format_value(vm: &Vm, val: oxide_vm::JsValue) -> String { None => "".to_string(), } } else if obj.is_array() { - format!("[array]") + "[array]".to_string() } else { "[object]".to_string() }