mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 11:11:11 +08:00
style: 全 workspace 格式订正,消除 fmt 漂移
This commit is contained in:
@@ -574,9 +574,8 @@ impl Vm {
|
||||
/// 续 dispatch 并结算:运行 body 到下一个 AWAIT/RETURN/异常,挂起则快照新状态,
|
||||
/// 完成/异常则结算 capability。恢复调用方状态。
|
||||
fn dispatch_and_finish_async(
|
||||
&mut self, state_ptr: *mut AsyncState, saved: Box<InlineSyncState>,
|
||||
prev_ctx: Option<JsValue>, prev_dispatch: bool, prev_gen_ctx: Option<JsValue>,
|
||||
prev_gen_dispatch: bool,
|
||||
&mut self, state_ptr: *mut AsyncState, saved: Box<InlineSyncState>, prev_ctx: Option<JsValue>,
|
||||
prev_dispatch: bool, prev_gen_ctx: Option<JsValue>, prev_gen_dispatch: bool,
|
||||
) -> Result<(), String> {
|
||||
let result = self.dispatch();
|
||||
if std::mem::take(&mut self.async_suspended) {
|
||||
@@ -695,7 +694,12 @@ impl Vm {
|
||||
return Ok(());
|
||||
}
|
||||
self.dispatch_and_finish_async(
|
||||
state_ptr, saved, prev_ctx, prev_dispatch, prev_gen_ctx, prev_gen_dispatch,
|
||||
state_ptr,
|
||||
saved,
|
||||
prev_ctx,
|
||||
prev_dispatch,
|
||||
prev_gen_ctx,
|
||||
prev_gen_dispatch,
|
||||
)
|
||||
}
|
||||
DisposeResumeKind::Unwind(handler) => {
|
||||
@@ -712,7 +716,12 @@ impl Vm {
|
||||
return Ok(());
|
||||
}
|
||||
self.dispatch_and_finish_async(
|
||||
state_ptr, saved, prev_ctx, prev_dispatch, prev_gen_ctx, prev_gen_dispatch,
|
||||
state_ptr,
|
||||
saved,
|
||||
prev_ctx,
|
||||
prev_dispatch,
|
||||
prev_gen_ctx,
|
||||
prev_gen_dispatch,
|
||||
)
|
||||
}
|
||||
DisposeResumeKind::Escape(completion_val) => {
|
||||
@@ -727,7 +736,12 @@ impl Vm {
|
||||
return Ok(());
|
||||
}
|
||||
self.dispatch_and_finish_async(
|
||||
state_ptr, saved, prev_ctx, prev_dispatch, prev_gen_ctx, prev_gen_dispatch,
|
||||
state_ptr,
|
||||
saved,
|
||||
prev_ctx,
|
||||
prev_dispatch,
|
||||
prev_gen_ctx,
|
||||
prev_gen_dispatch,
|
||||
)
|
||||
} else {
|
||||
// 无合并错误:执行完成。
|
||||
@@ -742,13 +756,23 @@ impl Vm {
|
||||
return Ok(());
|
||||
}
|
||||
self.dispatch_and_finish_async(
|
||||
state_ptr, saved, prev_ctx, prev_dispatch, prev_gen_ctx, prev_gen_dispatch,
|
||||
state_ptr,
|
||||
saved,
|
||||
prev_ctx,
|
||||
prev_dispatch,
|
||||
prev_gen_ctx,
|
||||
prev_gen_dispatch,
|
||||
)
|
||||
}
|
||||
Completion::Break { target_pc, .. } | Completion::Continue { target_pc, .. } => {
|
||||
self.pc = target_pc;
|
||||
self.dispatch_and_finish_async(
|
||||
state_ptr, saved, prev_ctx, prev_dispatch, prev_gen_ctx, prev_gen_dispatch,
|
||||
state_ptr,
|
||||
saved,
|
||||
prev_ctx,
|
||||
prev_dispatch,
|
||||
prev_gen_ctx,
|
||||
prev_gen_dispatch,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::bindings::{
|
||||
apply_binding_table, bind_accessor_getter, bind_accessor_getset, bind_accessor_getter_key,
|
||||
bind_well_known_method, configure_native_constructor,
|
||||
apply_binding_table, bind_accessor_getset, bind_accessor_getter, bind_accessor_getter_key, bind_well_known_method,
|
||||
configure_native_constructor,
|
||||
};
|
||||
use oxide_kernel::kernel::{KernelCore, KernelSession};
|
||||
use oxide_types::object::JsObject;
|
||||
@@ -50,16 +50,7 @@ pub fn bind_regexp(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
let sf = core.perm_interner().as_ref();
|
||||
let mut bind_getset = |name: &str, getter: *const (), setter: *const ()| {
|
||||
let key = sf.intern(name).0;
|
||||
bind_accessor_getset(
|
||||
core,
|
||||
session,
|
||||
ctor,
|
||||
key,
|
||||
&format!("get {name}"),
|
||||
&format!("set {name}"),
|
||||
getter,
|
||||
setter,
|
||||
);
|
||||
bind_accessor_getset(core, session, ctor, key, &format!("get {name}"), &format!("set {name}"), getter, setter);
|
||||
};
|
||||
// input/$_:get+set 对(唯一带 setter 的遗留访问器)。
|
||||
bind_getset(
|
||||
@@ -74,9 +65,15 @@ pub fn bind_regexp(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
);
|
||||
// 其余 18 个 getter(set 恒 undefined)。
|
||||
for (name, getter) in [
|
||||
("lastMatch", oxide_builtins::regexp::regexp_legacy_get_last_match::<crate::vm::Vm> as *const ()),
|
||||
(
|
||||
"lastMatch",
|
||||
oxide_builtins::regexp::regexp_legacy_get_last_match::<crate::vm::Vm> as *const (),
|
||||
),
|
||||
("$&", oxide_builtins::regexp::regexp_legacy_get_last_match::<crate::vm::Vm> as *const ()),
|
||||
("lastParen", oxide_builtins::regexp::regexp_legacy_get_last_paren::<crate::vm::Vm> as *const ()),
|
||||
(
|
||||
"lastParen",
|
||||
oxide_builtins::regexp::regexp_legacy_get_last_paren::<crate::vm::Vm> as *const (),
|
||||
),
|
||||
("$+", oxide_builtins::regexp::regexp_legacy_get_last_paren::<crate::vm::Vm> as *const ()),
|
||||
(
|
||||
"leftContext",
|
||||
@@ -87,7 +84,10 @@ pub fn bind_regexp(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
"rightContext",
|
||||
oxide_builtins::regexp::regexp_legacy_get_right_context::<crate::vm::Vm> as *const (),
|
||||
),
|
||||
("$'", oxide_builtins::regexp::regexp_legacy_get_right_context::<crate::vm::Vm> as *const ()),
|
||||
(
|
||||
"$'",
|
||||
oxide_builtins::regexp::regexp_legacy_get_right_context::<crate::vm::Vm> as *const (),
|
||||
),
|
||||
("index", oxide_builtins::regexp::regexp_legacy_get_index::<crate::vm::Vm> as *const ()),
|
||||
("$1", oxide_builtins::regexp::regexp_legacy_get_dollar_1::<crate::vm::Vm> as *const ()),
|
||||
("$2", oxide_builtins::regexp::regexp_legacy_get_dollar_2::<crate::vm::Vm> as *const ()),
|
||||
|
||||
@@ -45,11 +45,7 @@ pub fn bind_worker(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
let function_proto = world.function_proto.as_ptr() as *mut JsObject;
|
||||
let mut ctor = JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(function_proto));
|
||||
ctor.set_function(true);
|
||||
configure_native_constructor(
|
||||
&mut ctor,
|
||||
crate::worker::bindings::worker_constructor as *const (),
|
||||
1,
|
||||
);
|
||||
configure_native_constructor(&mut ctor, crate::worker::bindings::worker_constructor as *const (), 1);
|
||||
let ptr = Box::into_raw(Box::new(ctor));
|
||||
world.track_leaked_object(ptr);
|
||||
ptr
|
||||
@@ -63,7 +59,8 @@ pub fn bind_worker(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
if sh.lookup_position(ctor.shape_id(), si_name).is_none() {
|
||||
let shape = sh.make_shape(ctor.shape_id(), si_name);
|
||||
ctor.set_shape_id(shape);
|
||||
ctor.ensure_hash_props().push(JsValue::perm_string(sf.string_ptr(sf.intern("Worker").0)));
|
||||
ctor.ensure_hash_props()
|
||||
.push(JsValue::perm_string(sf.string_ptr(sf.intern("Worker").0)));
|
||||
let pos = ctor.hash_props_vec().map_or(0, |v| v.len() as u32).saturating_sub(1);
|
||||
ctor.set_data_meta(pos, PropAttributes::new(false, false, true));
|
||||
ctor.bump_generation();
|
||||
@@ -116,11 +113,7 @@ pub fn bind_worker(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
proto,
|
||||
core,
|
||||
&[
|
||||
(
|
||||
"postMessage",
|
||||
crate::worker::bindings::worker_post_message as *const (),
|
||||
1,
|
||||
),
|
||||
("postMessage", crate::worker::bindings::worker_post_message as *const (), 1),
|
||||
("terminate", crate::worker::bindings::worker_terminate as *const (), 0),
|
||||
],
|
||||
);
|
||||
@@ -147,11 +140,7 @@ pub fn bind_worker(core: &Arc<KernelCore>, session: &KernelSession, global: &mut
|
||||
global,
|
||||
core,
|
||||
&[
|
||||
(
|
||||
"postMessage",
|
||||
crate::worker::bindings::self_post_message as *const (),
|
||||
1,
|
||||
),
|
||||
("postMessage", crate::worker::bindings::self_post_message as *const (), 1),
|
||||
("close", crate::worker::bindings::self_close as *const (), 0),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -56,8 +56,6 @@ pub mod bind_shared_array_buffer;
|
||||
pub mod bind_string;
|
||||
/// 未实现内置(Proxy/BigInt/WeakMap 等)的 stub 构造器绑定。
|
||||
pub mod bind_stubs;
|
||||
/// Worker 构造器绑定(Box 分配,不占 BuiltinWorld P 字段)。
|
||||
pub mod bind_worker;
|
||||
/// Symbol 构造器与原型的 native 方法绑定。
|
||||
pub mod bind_symbol;
|
||||
/// Temporal 命名空间对象(Now/Instant/PlainDate/PlainTime)绑定。
|
||||
@@ -66,6 +64,8 @@ pub mod bind_temporal;
|
||||
pub mod bind_typed_array;
|
||||
/// WeakMap 构造器与原型四方法的 native 绑定(弱族不占 BuiltinWorld 槽)。
|
||||
pub mod bind_weak;
|
||||
/// Worker 构造器绑定(Box 分配,不占 BuiltinWorld P 字段)。
|
||||
pub mod bind_worker;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use crate::vm::{
|
||||
Completion, DisposeResumeKind, ForInIter, FrameArgs, FrameContinuation, PendingAsyncDispose,
|
||||
TryHandler, Vm, MAX_PROTO_CHAIN_DEPTH,
|
||||
Completion, DisposeResumeKind, ForInIter, FrameArgs, FrameContinuation, PendingAsyncDispose, TryHandler, Vm,
|
||||
MAX_PROTO_CHAIN_DEPTH,
|
||||
};
|
||||
use crate::vm_trace;
|
||||
use oxide_builtins::iterator::is_callable;
|
||||
@@ -817,18 +817,14 @@ impl Vm {
|
||||
/// 异常穿越释放:逆序释放 `depth` 以上资源。在途异常作 completion 种子(被折叠
|
||||
/// 进 suppressed)。挂起时携 `Unwind(handler)`(handler 已弹出,恢复时重压再入
|
||||
/// unwind)。
|
||||
pub(crate) fn dispose_above(
|
||||
&mut self, depth: usize, handler: Option<TryHandler>,
|
||||
) -> Result<DisposePhase, String> {
|
||||
pub(crate) fn dispose_above(&mut self, depth: usize, handler: Option<TryHandler>) -> Result<DisposePhase, String> {
|
||||
self.dispose_above_core(depth, DisposeResumeKind::Unwind(handler), self.exception_value)
|
||||
}
|
||||
|
||||
/// 释放栈顶部 `n` 条资源(逃出释放:return/break/continue 完成值逃出作用域时
|
||||
/// 逆序释放被逃出的资源)。`n` 超过栈长时按全量释放。在途 completion 初值为
|
||||
/// None(完成值非 throw),挂起时携 `Escape(completion)` 供恢复后执行。
|
||||
pub(crate) fn dispose_top_n(
|
||||
&mut self, n: usize, completion: Completion,
|
||||
) -> Result<DisposePhase, String> {
|
||||
pub(crate) fn dispose_top_n(&mut self, n: usize, completion: Completion) -> Result<DisposePhase, String> {
|
||||
let depth = self.dispose_stack.len().saturating_sub(n);
|
||||
self.dispose_above_core(depth, DisposeResumeKind::Escape(completion), None)
|
||||
}
|
||||
@@ -896,16 +892,16 @@ impl Vm {
|
||||
let dispose_key = encode_symbol_key(self.realm_id(), WELL_KNOWN_SYMBOL_DISPOSE);
|
||||
let method = if hint == 1 {
|
||||
let async_key = encode_symbol_key(self.realm_id(), WELL_KNOWN_SYMBOL_ASYNC_DISPOSE);
|
||||
let async_method = self
|
||||
.ordinary_get(val_obj, async_key, value)
|
||||
.map_err(|e| self.dispose_exc(e))?;
|
||||
let async_method = self.ordinary_get(val_obj, async_key, value).map_err(|e| self.dispose_exc(e))?;
|
||||
if async_method.is_undefined() {
|
||||
self.ordinary_get(val_obj, dispose_key, value).map_err(|e| self.dispose_exc(e))?
|
||||
self.ordinary_get(val_obj, dispose_key, value)
|
||||
.map_err(|e| self.dispose_exc(e))?
|
||||
} else {
|
||||
async_method
|
||||
}
|
||||
} else {
|
||||
self.ordinary_get(val_obj, dispose_key, value).map_err(|e| self.dispose_exc(e))?
|
||||
self.ordinary_get(val_obj, dispose_key, value)
|
||||
.map_err(|e| self.dispose_exc(e))?
|
||||
};
|
||||
Ok(method)
|
||||
}
|
||||
|
||||
@@ -876,10 +876,7 @@ impl Vm {
|
||||
// 异常穿越释放:逆序释放该作用域内登记的资源(规范序 IteratorClose 先、
|
||||
// DisposeResources 后)。释放方法抛错时新错误替代在途异常继续向外展开;
|
||||
// 异步释放挂起时登记在途状态并让出(恢复方重压 handler 再入本函数)。
|
||||
if matches!(
|
||||
self.dispose_above(handler.dispose_depth, Some(handler))?,
|
||||
DisposePhase::Suspended
|
||||
) {
|
||||
if matches!(self.dispose_above(handler.dispose_depth, Some(handler))?, DisposePhase::Suspended) {
|
||||
return Ok(());
|
||||
}
|
||||
if let Some(finally_pc) = handler.finally_pc {
|
||||
|
||||
@@ -86,12 +86,7 @@ pub(crate) fn worker_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
let url_val = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() };
|
||||
let url = match vm.lookup_str(url_val) {
|
||||
Some(u) => u,
|
||||
None => {
|
||||
return NativeResult::Err(oxide_builtins::error::create_type_error(
|
||||
vm,
|
||||
"Worker url must be a string",
|
||||
))
|
||||
}
|
||||
None => return NativeResult::Err(oxide_builtins::error::create_type_error(vm, "Worker url must be a string")),
|
||||
};
|
||||
|
||||
// 主线程侧读 url 文件(worker 脚本源码)。
|
||||
@@ -120,9 +115,11 @@ pub(crate) fn worker_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
|
||||
// onmessage / onerror / onmessageerror:普通 own 数据属性(非枚举),初值 undefined。
|
||||
let si_onmessage = vm.perm_intern("onmessage");
|
||||
let _ = vm.define_data_property(worker_obj, si_onmessage, JsValue::undefined(), PropAttributes::new(true, false, true));
|
||||
let _ =
|
||||
vm.define_data_property(worker_obj, si_onmessage, JsValue::undefined(), PropAttributes::new(true, false, true));
|
||||
let si_onerror = vm.perm_intern("onerror");
|
||||
let _ = vm.define_data_property(worker_obj, si_onerror, JsValue::undefined(), PropAttributes::new(true, false, true));
|
||||
let _ =
|
||||
vm.define_data_property(worker_obj, si_onerror, JsValue::undefined(), PropAttributes::new(true, false, true));
|
||||
let si_onmessageerror = vm.perm_intern("onmessageerror");
|
||||
let _ = vm.define_data_property(
|
||||
worker_obj,
|
||||
@@ -133,7 +130,12 @@ pub(crate) fn worker_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
|
||||
// workerId:非枚举数据属性(值为 worker 编号,数值表示无 GC 边)。
|
||||
let si_worker_id = vm.perm_intern("workerId");
|
||||
let _ = vm.define_data_property(worker_obj, si_worker_id, JsValue::float(id as f64), PropAttributes::new(true, false, true));
|
||||
let _ = vm.define_data_property(
|
||||
worker_obj,
|
||||
si_worker_id,
|
||||
JsValue::float(id as f64),
|
||||
PropAttributes::new(true, false, true),
|
||||
);
|
||||
|
||||
// 登记 Worker 对象进注册表(GC 根,主线程事件循环据编号反查 onmessage)。
|
||||
vm.worker_objects.insert(id, JsValue::from_js_object(ptr));
|
||||
|
||||
Reference in New Issue
Block a user