mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 03:31:12 +08:00
style: 格式化事件目标与 gc 会话文件
This commit is contained in:
@@ -72,10 +72,7 @@ pub fn event_target_add_event_listener<H: VmHost>(vm: &mut H, args: &[u8]) -> Na
|
|||||||
if let Some(exc) = vm.take_uncaught_value() {
|
if let Some(exc) = vm.take_uncaught_value() {
|
||||||
return NativeResult::Err(exc);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
return NativeResult::Err(crate::error::create_type_error(
|
return NativeResult::Err(crate::error::create_type_error(vm, "Cannot convert event type to a string"));
|
||||||
vm,
|
|
||||||
"Cannot convert event type to a string",
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if type_str.is_empty() {
|
if type_str.is_empty() {
|
||||||
@@ -86,10 +83,7 @@ pub fn event_target_add_event_listener<H: VmHost>(vm: &mut H, args: &[u8]) -> Na
|
|||||||
// callback 须为函数(首版不支持对象形 handleEvent)。
|
// callback 须为函数(首版不支持对象形 handleEvent)。
|
||||||
let callback = if args.len() > 2 { vm.reg(args[2]) } else { JsValue::undefined() };
|
let callback = if args.len() > 2 { vm.reg(args[2]) } else { JsValue::undefined() };
|
||||||
if !crate::iterator::is_callable(callback) {
|
if !crate::iterator::is_callable(callback) {
|
||||||
return NativeResult::Err(crate::error::create_type_error(
|
return NativeResult::Err(crate::error::create_type_error(vm, "Event listener callback must be a function"));
|
||||||
vm,
|
|
||||||
"Event listener callback must be a function",
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// options:布尔(capture)或对象(once / capture)。
|
// options:布尔(capture)或对象(once / capture)。
|
||||||
@@ -99,9 +93,18 @@ pub fn event_target_add_event_listener<H: VmHost>(vm: &mut H, args: &[u8]) -> Na
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 重复登记(同 type + callback + capture)为 no-op;否则追加。
|
// 重复登记(同 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);
|
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());
|
return NativeResult::Ok(JsValue::undefined());
|
||||||
}
|
}
|
||||||
vm.et_register(this_ptr, entry);
|
vm.et_register(this_ptr, entry);
|
||||||
@@ -132,10 +135,7 @@ pub fn event_target_remove_event_listener<H: VmHost>(vm: &mut H, args: &[u8]) ->
|
|||||||
if let Some(exc) = vm.take_uncaught_value() {
|
if let Some(exc) = vm.take_uncaught_value() {
|
||||||
return NativeResult::Err(exc);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
return NativeResult::Err(crate::error::create_type_error(
|
return NativeResult::Err(crate::error::create_type_error(vm, "Cannot convert event type to a string"));
|
||||||
vm,
|
|
||||||
"Cannot convert event type to a string",
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let type_si = vm.perm_intern(&type_str);
|
let type_si = vm.perm_intern(&type_str);
|
||||||
@@ -206,11 +206,7 @@ pub fn event_target_dispatch_event<H: VmHost>(vm: &mut H, args: &[u8]) -> Native
|
|||||||
};
|
};
|
||||||
let type_si = vm.perm_intern(&type_text);
|
let type_si = vm.perm_intern(&type_text);
|
||||||
// 注册表按目标对象存全部监听器,此处按事件类型过滤(同型才派发)。
|
// 注册表按目标对象存全部监听器,此处按事件类型过滤(同型才派发)。
|
||||||
let listeners: Vec<ListenerEntry> = vm
|
let listeners: Vec<ListenerEntry> = vm.et_lookup(this_ptr).into_iter().filter(|e| e.type_si == type_si).collect();
|
||||||
.et_lookup(this_ptr)
|
|
||||||
.into_iter()
|
|
||||||
.filter(|e| e.type_si == type_si)
|
|
||||||
.collect();
|
|
||||||
if listeners.is_empty() {
|
if listeners.is_empty() {
|
||||||
return NativeResult::Ok(JsValue::bool(true));
|
return NativeResult::Ok(JsValue::bool(true));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -709,17 +709,13 @@ impl SessionGc {
|
|||||||
// EventTarget 监听器注册表剪枝:按 mark 位移除死目标对象(弱键,同
|
// EventTarget 监听器注册表剪枝:按 mark 位移除死目标对象(弱键,同
|
||||||
// broadcast_channels 时序——死目标在随后的分流循环被释放,注册表已先
|
// broadcast_channels 时序——死目标在随后的分流循环被释放,注册表已先
|
||||||
// 移除其条目,无悬垂)。
|
// 移除其条目,无悬垂)。
|
||||||
vm.realm
|
vm.realm.gc.borrow_mut().event_targets.retain(|&ptr, _| {
|
||||||
.gc
|
if ptr.is_null() {
|
||||||
.borrow_mut()
|
return false;
|
||||||
.event_targets
|
}
|
||||||
.retain(|&ptr, _| {
|
// SAFETY: ptr 来自 session 对象表登记,sweep 运行期间有效。
|
||||||
if ptr.is_null() {
|
unsafe { (*ptr).is_gc_marked() }
|
||||||
return false;
|
});
|
||||||
}
|
|
||||||
// SAFETY: ptr 来自 session 对象表登记,sweep 运行期间有效。
|
|
||||||
unsafe { (*ptr).is_gc_marked() }
|
|
||||||
});
|
|
||||||
|
|
||||||
// 按 mark 位分流:存活保留清位,死对象释放本体、堆区与 upvalue 出表。
|
// 按 mark 位分流:存活保留清位,死对象释放本体、堆区与 upvalue 出表。
|
||||||
let mut dead = 0u64;
|
let mut dead = 0u64;
|
||||||
|
|||||||
Reference in New Issue
Block a user