chore: 清理 oxide_vm clippy 告警

This commit is contained in:
2026-08-14 05:26:46 +08:00
parent ae58508760
commit 7799ebb055
14 changed files with 29 additions and 36 deletions
+1 -1
View File
@@ -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]);
+2 -1
View File
@@ -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() {
+4 -3
View File
@@ -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() {
@@ -79,7 +79,7 @@ fn set_bypes_per_element(core: &Arc<KernelCore>, 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();
}
+3 -6
View File
@@ -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);
+1
View File
@@ -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> {
+1
View File
@@ -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() {
+6 -5
View File
@@ -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() {
+1 -1
View File
@@ -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() {
+1 -1
View File
@@ -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);
}
}
}
+2 -6
View File
@@ -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 {
+3 -9
View File
@@ -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::<ForInIter<'static>>());
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");
}
+2 -1
View File
@@ -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,
+1 -1
View File
@@ -36,7 +36,7 @@ fn format_value(vm: &Vm, val: oxide_vm::JsValue) -> String {
None => "<pending>".to_string(),
}
} else if obj.is_array() {
format!("[array]")
"[array]".to_string()
} else {
"[object]".to_string()
}