From e2f82df9fc8326624ebcec9f3268fd2c34e6c469 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sat, 10 Oct 2026 10:37:11 +0000 Subject: [PATCH] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=9B=AE=E6=A0=87=E4=B8=8E=20gc=20=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/event_target.rs | 34 ++++++++++------------- crates/oxide_vm/src/session_gc.rs | 18 +++++------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/crates/oxide_builtins/src/event_target.rs b/crates/oxide_builtins/src/event_target.rs index 324d4806..c2e66216 100644 --- a/crates/oxide_builtins/src/event_target.rs +++ b/crates/oxide_builtins/src/event_target.rs @@ -72,10 +72,7 @@ pub fn event_target_add_event_listener(vm: &mut H, args: &[u8]) -> Na if let Some(exc) = vm.take_uncaught_value() { return NativeResult::Err(exc); } - return NativeResult::Err(crate::error::create_type_error( - vm, - "Cannot convert event type to a string", - )); + return NativeResult::Err(crate::error::create_type_error(vm, "Cannot convert event type to a string")); } }; if type_str.is_empty() { @@ -86,10 +83,7 @@ pub fn event_target_add_event_listener(vm: &mut H, args: &[u8]) -> Na // callback 须为函数(首版不支持对象形 handleEvent)。 let callback = if args.len() > 2 { vm.reg(args[2]) } else { JsValue::undefined() }; if !crate::iterator::is_callable(callback) { - return NativeResult::Err(crate::error::create_type_error( - vm, - "Event listener callback must be a function", - )); + return NativeResult::Err(crate::error::create_type_error(vm, "Event listener callback must be a function")); } // options:布尔(capture)或对象(once / capture)。 @@ -99,9 +93,18 @@ pub fn event_target_add_event_listener(vm: &mut H, args: &[u8]) -> Na }; // 重复登记(同 type + callback + capture)为 no-op;否则追加。 - let entry = ListenerEntry { type_si, callback, capture, once, is_attribute: false }; + let entry = ListenerEntry { + type_si, + callback, + capture, + once, + is_attribute: false, + }; let existing = vm.et_lookup(this_ptr); - if existing.iter().any(|e| e.type_si == type_si && e.capture == capture && e.callback == callback) { + if existing + .iter() + .any(|e| e.type_si == type_si && e.capture == capture && e.callback == callback) + { return NativeResult::Ok(JsValue::undefined()); } vm.et_register(this_ptr, entry); @@ -132,10 +135,7 @@ pub fn event_target_remove_event_listener(vm: &mut H, args: &[u8]) -> if let Some(exc) = vm.take_uncaught_value() { return NativeResult::Err(exc); } - return NativeResult::Err(crate::error::create_type_error( - vm, - "Cannot convert event type to a string", - )); + return NativeResult::Err(crate::error::create_type_error(vm, "Cannot convert event type to a string")); } }; let type_si = vm.perm_intern(&type_str); @@ -206,11 +206,7 @@ pub fn event_target_dispatch_event(vm: &mut H, args: &[u8]) -> Native }; let type_si = vm.perm_intern(&type_text); // 注册表按目标对象存全部监听器,此处按事件类型过滤(同型才派发)。 - let listeners: Vec = vm - .et_lookup(this_ptr) - .into_iter() - .filter(|e| e.type_si == type_si) - .collect(); + let listeners: Vec = vm.et_lookup(this_ptr).into_iter().filter(|e| e.type_si == type_si).collect(); if listeners.is_empty() { return NativeResult::Ok(JsValue::bool(true)); } diff --git a/crates/oxide_vm/src/session_gc.rs b/crates/oxide_vm/src/session_gc.rs index d4f98db4..044745ac 100644 --- a/crates/oxide_vm/src/session_gc.rs +++ b/crates/oxide_vm/src/session_gc.rs @@ -709,17 +709,13 @@ impl SessionGc { // EventTarget 监听器注册表剪枝:按 mark 位移除死目标对象(弱键,同 // broadcast_channels 时序——死目标在随后的分流循环被释放,注册表已先 // 移除其条目,无悬垂)。 - vm.realm - .gc - .borrow_mut() - .event_targets - .retain(|&ptr, _| { - if ptr.is_null() { - return false; - } - // SAFETY: ptr 来自 session 对象表登记,sweep 运行期间有效。 - unsafe { (*ptr).is_gc_marked() } - }); + vm.realm.gc.borrow_mut().event_targets.retain(|&ptr, _| { + if ptr.is_null() { + return false; + } + // SAFETY: ptr 来自 session 对象表登记,sweep 运行期间有效。 + unsafe { (*ptr).is_gc_marked() } + }); // 按 mark 位分流:存活保留清位,死对象释放本体、堆区与 upvalue 出表。 let mut dead = 0u64;