chore: 清理 oxide_vm clippy 告警
This commit is contained in:
@@ -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_si = vm.kernel_core.perm_interner().intern(ASFS_DONE_PROP).0;
|
||||||
let done = vm
|
let done = vm
|
||||||
.resolve_property(callee_obj, done_si)
|
.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 value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
|
||||||
let result = make_iter_result(vm, value, done);
|
let result = make_iter_result(vm, value, done);
|
||||||
let _ = vm.call_function_sync(resolve, JsValue::undefined(), &[result]);
|
let _ = vm.call_function_sync(resolve, JsValue::undefined(), &[result]);
|
||||||
|
|||||||
@@ -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_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 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 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 value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
|
||||||
let mode = if is_reject {
|
let mode = if is_reject {
|
||||||
AsyncResumeMode::Throw(value)
|
AsyncResumeMode::Throw(value)
|
||||||
@@ -445,6 +445,7 @@ fn async_function_stub(vm: &mut Vm, _args: &[u8]) -> NativeResult {
|
|||||||
|
|
||||||
// ── session GC 支撑:状态快照中的 JsValues 作为异步上下文对象边追踪 ──
|
// ── session GC 支撑:状态快照中的 JsValues 作为异步上下文对象边追踪 ──
|
||||||
|
|
||||||
|
#[expect(clippy::mut_from_ref)]
|
||||||
fn async_state_mut(obj: &JsObject) -> Option<&mut AsyncState> {
|
fn async_state_mut(obj: &JsObject) -> Option<&mut AsyncState> {
|
||||||
let ptr = obj.native_data() as *mut AsyncState;
|
let ptr = obj.native_data() as *mut AsyncState;
|
||||||
if ptr.is_null() {
|
if ptr.is_null() {
|
||||||
|
|||||||
@@ -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 role_si = vm.kernel_core.perm_interner().intern(AG_REJECT_PROP).0;
|
||||||
let is_reject = vm
|
let is_reject = vm
|
||||||
.resolve_property(callee_obj, role_si)
|
.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() };
|
let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
|
||||||
// 把 await 结果写入当前请求的注入模式,resume 时按角色恢复。
|
// 把 await 结果写入当前请求的注入模式,resume 时按角色恢复。
|
||||||
if ctx.is_object() {
|
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_si = vm.kernel_core.perm_interner().intern(AG_YIELD_RAW_PROP).0;
|
||||||
let raw = vm
|
let raw = vm
|
||||||
.resolve_property(callee_obj, raw_si)
|
.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 role_si = vm.kernel_core.perm_interner().intern(AG_REJECT_PROP).0;
|
||||||
let is_reject = vm
|
let is_reject = vm
|
||||||
.resolve_property(callee_obj, role_si)
|
.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() };
|
let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
|
||||||
if is_reject {
|
if is_reject {
|
||||||
// yield 值被拒:next() 的 promise reject,且生成器关闭(后续 next 直接 done)。
|
// yield 值被拒:next() 的 promise reject,且生成器关闭(后续 next 直接 done)。
|
||||||
@@ -817,6 +817,7 @@ fn async_generator_function_stub(vm: &mut Vm, _args: &[u8]) -> NativeResult {
|
|||||||
|
|
||||||
// ── session GC 支撑:状态快照中的 JsValues 作为异步生成器对象边追踪 ──
|
// ── session GC 支撑:状态快照中的 JsValues 作为异步生成器对象边追踪 ──
|
||||||
|
|
||||||
|
#[expect(clippy::mut_from_ref)]
|
||||||
fn async_gen_state_mut(obj: &JsObject) -> Option<&mut AsyncGeneratorState> {
|
fn async_gen_state_mut(obj: &JsObject) -> Option<&mut AsyncGeneratorState> {
|
||||||
let ptr = obj.native_data() as *mut AsyncGeneratorState;
|
let ptr = obj.native_data() as *mut AsyncGeneratorState;
|
||||||
if ptr.is_null() {
|
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);
|
let proto_shape = core.shape_forge().make_shape(proto.shape_id(), bpe_si);
|
||||||
proto.set_shape_id(proto_shape);
|
proto.set_shape_id(proto_shape);
|
||||||
let proto_pos = proto.push_prop(bpe_val);
|
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();
|
proto.bump_generation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -273,12 +273,9 @@ impl Vm {
|
|||||||
let a = lv.as_int();
|
let a = lv.as_int();
|
||||||
let b = rv.as_int();
|
let b = rv.as_int();
|
||||||
if b != 0 {
|
if b != 0 {
|
||||||
match a.checked_rem(b) {
|
if let Some(v) = a.checked_rem(b) {
|
||||||
Some(v) => {
|
self.regs[rd] = JsValue::int(v);
|
||||||
self.regs[rd] = JsValue::int(v);
|
return Ok(());
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
None => {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.regs[rd] = JsValue::float(a as f64 % b as f64);
|
self.regs[rd] = JsValue::float(a as f64 % b as f64);
|
||||||
|
|||||||
@@ -256,6 +256,7 @@ impl Vm {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn dispatch_compound_member_shift(
|
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,
|
&mut self, op_name: &str, rd: usize, a: usize, b: usize, error_msg: &str, is_right: bool, is_unsigned: bool,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
|
|||||||
@@ -797,6 +797,7 @@ fn generator_function_stub(vm: &mut Vm, _args: &[u8]) -> NativeResult {
|
|||||||
|
|
||||||
// ── session GC 支撑:状态快照中的 JsValues 作为生成器对象边追踪 ──
|
// ── session GC 支撑:状态快照中的 JsValues 作为生成器对象边追踪 ──
|
||||||
|
|
||||||
|
#[expect(clippy::mut_from_ref)]
|
||||||
fn generator_state_mut(obj: &JsObject) -> Option<&mut GeneratorState> {
|
fn generator_state_mut(obj: &JsObject) -> Option<&mut GeneratorState> {
|
||||||
let ptr = obj.native_data() as *mut GeneratorState;
|
let ptr = obj.native_data() as *mut GeneratorState;
|
||||||
if ptr.is_null() {
|
if ptr.is_null() {
|
||||||
|
|||||||
@@ -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 rj_si = vm.kernel_core.perm_interner().intern(FINALLY_REJECT_PROP).0;
|
||||||
let is_reject = vm
|
let is_reject = vm
|
||||||
.resolve_property(callee_obj, rj_si)
|
.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() };
|
let value = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
|
||||||
match vm.call_function_sync(on_finally, JsValue::undefined(), &[]) {
|
match vm.call_function_sync(on_finally, JsValue::undefined(), &[]) {
|
||||||
Ok(_) => {
|
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;
|
let al_si = vm.kernel_core.perm_interner().intern(AGG_ALREADY_PROP).0;
|
||||||
// SAFETY: callee 是当前调用的存活函数对象。
|
// SAFETY: callee 是当前调用的存活函数对象。
|
||||||
let callee_ref = unsafe { &*callee_ptr };
|
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;
|
return None;
|
||||||
}
|
}
|
||||||
let record = vm.resolve_property(callee_ref, rec_si).unwrap_or(JsValue::undefined());
|
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())
|
NativeResult::Ok(JsValue::undefined())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Promise.race` 使用能力 resolve/reject 直连,无独立元素函数。
|
// `Promise.race` 使用能力 resolve/reject 直连,无独立元素函数。
|
||||||
|
|
||||||
/// `Promise.allSettled` resolve 元素:写 `{status:'fulfilled', value}` 记录。
|
/// `Promise.allSettled` resolve 元素:写 `{status:'fulfilled', value}` 记录。
|
||||||
fn promise_all_settled_resolve_element(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
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 obj = unsafe { &*callee.as_js_object_ptr() };
|
||||||
let res_si = vm.kernel_core.perm_interner().intern(CAP_RESOLVE_PROP).0;
|
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 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())
|
let held = vm.resolve_property(obj, res_si).is_some_and(|v| !v.is_undefined())
|
||||||
|| vm.resolve_property(obj, rej_si).map_or(false, |v| !v.is_undefined());
|
|| vm.resolve_property(obj, rej_si).is_some_and(|v| !v.is_undefined());
|
||||||
if held {
|
if held {
|
||||||
return NativeResult::Err(oxide_builtins::error::create_type_error(
|
return NativeResult::Err(oxide_builtins::error::create_type_error(
|
||||||
vm,
|
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> {
|
fn promise_state_mut(obj: &JsObject) -> Option<&mut PromiseState> {
|
||||||
let ptr = obj.native_data() as *mut PromiseState;
|
let ptr = obj.native_data() as *mut PromiseState;
|
||||||
if ptr.is_null() {
|
if ptr.is_null() {
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ impl SuspendedFrame {
|
|||||||
pub fn save_from(&mut self, vm: &mut Vm, callee: JsValue) -> Result<(), String> {
|
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())?;
|
let frame = vm.frames.pop().ok_or_else(|| "frame missing on suspend".to_string())?;
|
||||||
self.frame = Some(frame);
|
self.frame = Some(frame);
|
||||||
self.regs = Box::new(vm.regs);
|
*self.regs = vm.regs;
|
||||||
self.pc = vm.pc;
|
self.pc = vm.pc;
|
||||||
self.bytecode = std::mem::take(&mut vm.bytecode);
|
self.bytecode = std::mem::take(&mut vm.bytecode);
|
||||||
self.sub_idx = if callee.is_object() {
|
self.sub_idx = if callee.is_object() {
|
||||||
|
|||||||
@@ -755,7 +755,7 @@ impl Vm {
|
|||||||
if !global_ptr.is_null() {
|
if !global_ptr.is_null() {
|
||||||
// SAFETY: KernelSession 在 VM 生命周期内拥有 global_object。
|
// SAFETY: KernelSession 在 VM 生命周期内拥有 global_object。
|
||||||
unsafe {
|
unsafe {
|
||||||
(*global_ptr).rewrite_object_values(|value| rewrite(value));
|
(*global_ptr).rewrite_object_values(rewrite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -315,9 +315,7 @@ impl Vm {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let (frame_depth, finally_pc, finally_active) = {
|
let (frame_depth, finally_pc, finally_active) = {
|
||||||
let Some(h) = self.try_stack.last() else {
|
let h = self.try_stack.last()?;
|
||||||
return None;
|
|
||||||
};
|
|
||||||
(h.frame_depth, h.finally_pc, h.finally_active)
|
(h.frame_depth, h.finally_pc, h.finally_active)
|
||||||
};
|
};
|
||||||
if frame_depth != depth {
|
if frame_depth != depth {
|
||||||
@@ -524,9 +522,7 @@ impl Vm {
|
|||||||
let depth = self.frames.len();
|
let depth = self.frames.len();
|
||||||
loop {
|
loop {
|
||||||
let (frame_depth, finally_pc, finally_active) = {
|
let (frame_depth, finally_pc, finally_active) = {
|
||||||
let Some(h) = self.try_stack.last() else {
|
let h = self.try_stack.last()?;
|
||||||
return None;
|
|
||||||
};
|
|
||||||
(h.frame_depth, h.finally_pc, h.finally_active)
|
(h.frame_depth, h.finally_pc, h.finally_active)
|
||||||
};
|
};
|
||||||
if frame_depth != depth {
|
if frame_depth != depth {
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ impl Vm {
|
|||||||
// std Vec 建完后迁入 bump 区,避免枚举循环期间对 self 的 &mut 借用
|
// std Vec 建完后迁入 bump 区,避免枚举循环期间对 self 的 &mut 借用
|
||||||
// 与 bump 借用冲突。
|
// 与 bump 借用冲突。
|
||||||
let keys_bump: bumpalo::collections::Vec<(JsValue, u32)> =
|
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 });
|
let iter = self.epoch.alloc(ForInIter { keys: keys_bump, index: 0 });
|
||||||
self.iters.push_for_in(iter.cast::<ForInIter<'static>>());
|
self.iters.push_for_in(iter.cast::<ForInIter<'static>>());
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -555,20 +555,14 @@ impl Vm {
|
|||||||
}
|
}
|
||||||
let iter_obj = unsafe { &*iterator.as_js_object_ptr() };
|
let iter_obj = unsafe { &*iterator.as_js_object_ptr() };
|
||||||
let return_si = self.kernel_core.perm_interner().intern("return").0;
|
let return_si = self.kernel_core.perm_interner().intern("return").0;
|
||||||
let return_fn = match self.ordinary_get(iter_obj, return_si, iterator) {
|
let return_fn = self.ordinary_get(iter_obj, return_si, iterator)?;
|
||||||
Ok(v) => v,
|
|
||||||
Err(e) => return Err(e),
|
|
||||||
};
|
|
||||||
if !return_fn.is_object() {
|
if !return_fn.is_object() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if !unsafe { &*return_fn.as_js_object_ptr() }.is_function() {
|
if !unsafe { &*return_fn.as_js_object_ptr() }.is_function() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
let inner = match self.call_function_sync(return_fn, iterator, &[]) {
|
let inner = self.call_function_sync(return_fn, iterator, &[])?;
|
||||||
Ok(v) => v,
|
|
||||||
Err(e) => return Err(e),
|
|
||||||
};
|
|
||||||
if !inner.is_object() {
|
if !inner.is_object() {
|
||||||
return self.raise_type_error("iterator return() result is not an object");
|
return self.raise_type_error("iterator return() result is not an object");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ impl Vm {
|
|||||||
// receiver 非 TA 时按规范把写入落到 receiver 对象,不碰 TA buffer。
|
// receiver 非 TA 时按规范把写入落到 receiver 对象,不碰 TA buffer。
|
||||||
if obj.is_typed_array_obj() {
|
if obj.is_typed_array_obj() {
|
||||||
if let Some(index) = self.array_index_from_property_key(prop_name_si) {
|
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 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);
|
return oxide_builtins::typed_array::typed_array_element_set(self, obj, index, val);
|
||||||
@@ -547,6 +547,7 @@ impl Vm {
|
|||||||
|
|
||||||
/// 数组索引属性(`"0"`~`"4294967294"`)的 define 路径:存入元素区并维护
|
/// 数组索引属性(`"0"`~`"4294967294"`)的 define 路径:存入元素区并维护
|
||||||
/// `array_prop_count`(length 随最高索引增长),meta 与元素槽对齐。
|
/// `array_prop_count`(length 随最高索引增长),meta 与元素槽对齐。
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn define_array_index_element(
|
fn define_array_index_element(
|
||||||
&mut self, obj: &mut JsObject, index: u32, val: JsValue, attributes: PropAttributes, is_accessor: bool,
|
&mut self, obj: &mut JsObject, index: u32, val: JsValue, attributes: PropAttributes, is_accessor: bool,
|
||||||
get: JsValue, set: JsValue,
|
get: JsValue, set: JsValue,
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ fn format_value(vm: &Vm, val: oxide_vm::JsValue) -> String {
|
|||||||
None => "<pending>".to_string(),
|
None => "<pending>".to_string(),
|
||||||
}
|
}
|
||||||
} else if obj.is_array() {
|
} else if obj.is_array() {
|
||||||
format!("[array]")
|
"[array]".to_string()
|
||||||
} else {
|
} else {
|
||||||
"[object]".to_string()
|
"[object]".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user