mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
feat: 挂载 Promise.allSettledKeyed 入口并放行 keyed 语料
This commit is contained in:
@@ -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") {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user