diff --git a/crates/oxide_test262/src/discovery.rs b/crates/oxide_test262/src/discovery.rs index 0c7bd924..5234117b 100644 --- a/crates/oxide_test262/src/discovery.rs +++ b/crates/oxide_test262/src/discovery.rs @@ -36,14 +36,7 @@ pub(crate) fn is_skipped(meta: &TestMeta) -> Option { // 保持大范围已实现 feature tag 可运行;只排除真正未实现的子特性。 // 其余一切让测试实际运行,依赖运行时跳过逻辑 // ("too many registers"、"not yet implemented" 等)判定失败。 - let excluded_features = [ - "Proxy", - "Intl", - "Atomics", - "cross-realm", - // await-dictionary(Promise.allKeyed/allSettledKeyed)是 2025 proposal,未实现。 - "await-dictionary", - ]; + let excluded_features = ["Proxy", "Intl", "Atomics", "cross-realm"]; for feat in &meta.features { if excluded_features.contains(&feat.as_str()) || feat.starts_with("Intl") { diff --git a/crates/oxide_vm/src/promise/aggregate.rs b/crates/oxide_vm/src/promise/aggregate.rs index cc800e83..43649a6d 100644 --- a/crates/oxide_vm/src/promise/aggregate.rs +++ b/crates/oxide_vm/src/promise/aggregate.rs @@ -407,6 +407,17 @@ pub(super) fn promise_static_all_keyed(vm: &mut Vm, args: &[u8]) -> NativeResult } } +/// `Promise.allSettledKeyed(object)`:输入自身可枚举键的元素全部结算后以 +/// null 原型键控结果对象完成,每元素记 `{status, value|reason}` 记录。 +pub(super) fn promise_static_all_settled_keyed(vm: &mut Vm, args: &[u8]) -> NativeResult { + let ctor = vm.reg(if args.is_empty() { 0 } else { args[0] }); + let promises = if args.len() > 1 { vm.reg(args[1]) } else { JsValue::undefined() }; + match perform_promise_combine_keyed(vm, ctor, promises, KeyedVariant::AllSettled) { + Ok(promise) => NativeResult::Ok(promise), + Err(err) => NativeResult::Err(err), + } +} + /// 聚合静态方法的共享核心:迭代可迭代输入,逐元素调 `C.resolve` 建 promise 并注册反应, /// 按模式在全部/任一结算后交付能力 promise。 /// @@ -578,8 +589,6 @@ fn perform_promise_combine( #[derive(Clone, Copy, PartialEq, Eq)] enum KeyedVariant { All, - // allSettledKeyed 入口尚未挂入构造器静态表,核心实现先行备齐。 - #[expect(dead_code)] AllSettled, } diff --git a/crates/oxide_vm/src/promise/constructor.rs b/crates/oxide_vm/src/promise/constructor.rs index d9b24e77..66877eb4 100644 --- a/crates/oxide_vm/src/promise/constructor.rs +++ b/crates/oxide_vm/src/promise/constructor.rs @@ -12,8 +12,9 @@ use oxide_types::value::JsValue; use crate::vm::{FrameArgs, FrameContinuation, Vm}; use super::aggregate::{ - promise_static_all, promise_static_all_keyed, promise_static_all_settled, promise_static_any, promise_static_race, - promise_static_reject, promise_static_resolve, promise_static_try, promise_static_with_resolvers, + promise_static_all, promise_static_all_keyed, promise_static_all_settled, promise_static_all_settled_keyed, + promise_static_any, promise_static_race, promise_static_reject, promise_static_resolve, promise_static_try, + promise_static_with_resolvers, }; use super::reactions::{promise_catch, promise_finally, promise_then}; use super::{is_constructor_value, PromiseState, PromiseStateKind}; @@ -286,6 +287,7 @@ impl Vm { ("race", promise_static_race as *const (), 1), ("allSettled", promise_static_all_settled as *const (), 1), ("allKeyed", promise_static_all_keyed as *const (), 1), + ("allSettledKeyed", promise_static_all_settled_keyed as *const (), 1), ("any", promise_static_any as *const (), 1), ("withResolvers", promise_static_with_resolvers as *const (), 0), ("try", promise_static_try as *const (), 1),