feat: 挂载 Promise.allSettledKeyed 入口并放行 keyed 语料

This commit is contained in:
2026-09-24 09:43:22 +00:00
parent 70e03c6a62
commit 0895ba2645
3 changed files with 16 additions and 12 deletions
+1 -8
View File
@@ -36,14 +36,7 @@ pub(crate) fn is_skipped(meta: &TestMeta) -> Option<String> {
// 保持大范围已实现 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") {
+11 -2
View File
@@ -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,
}
+4 -2
View File
@@ -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),