Skip to content

Commit 11759e3

Browse files
committed
Implement Promise.allSettled and add tests
1 parent 529b5e5 commit 11759e3

File tree

4 files changed

+695
-65
lines changed

4 files changed

+695
-65
lines changed

src/core.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,6 +2491,10 @@ fn evaluate_var(env: &JSObjectDataPtr, name: &str) -> Result<Value, JSError> {
24912491
Ok(Value::Function("__internal_resolve_promise".to_string()))
24922492
} else if name == "__internal_reject_promise" {
24932493
Ok(Value::Function("__internal_reject_promise".to_string()))
2494+
} else if name == "__internal_promise_allsettled_resolve" {
2495+
Ok(Value::Function("__internal_promise_allsettled_resolve".to_string()))
2496+
} else if name == "__internal_promise_allsettled_reject" {
2497+
Ok(Value::Function("__internal_promise_allsettled_reject".to_string()))
24942498
} else if name == "NaN" {
24952499
Ok(Value::Number(f64::NAN))
24962500
} else if name == "Infinity" {

src/js_function.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,44 @@ pub fn handle_global_function(func_name: &str, args: &[Expr], env: &JSObjectData
391391
}),
392392
}
393393
}
394+
"__internal_promise_allsettled_resolve" => {
395+
if args.len() < 3 {
396+
return Err(JSError::TypeError {
397+
message: "__internal_promise_allsettled_resolve requires 3 arguments".to_string(),
398+
});
399+
}
400+
let idx = evaluate_expr(env, &args[0])?;
401+
let value = evaluate_expr(env, &args[1])?;
402+
let shared_state = evaluate_expr(env, &args[2])?;
403+
404+
if let Value::Number(idx_val) = idx {
405+
crate::js_promise::__internal_promise_allsettled_resolve(idx_val, value, shared_state);
406+
Ok(Value::Undefined)
407+
} else {
408+
Err(JSError::TypeError {
409+
message: "First argument must be a number".to_string(),
410+
})
411+
}
412+
}
413+
"__internal_promise_allsettled_reject" => {
414+
if args.len() < 3 {
415+
return Err(JSError::TypeError {
416+
message: "__internal_promise_allsettled_reject requires 3 arguments".to_string(),
417+
});
418+
}
419+
let idx = evaluate_expr(env, &args[0])?;
420+
let reason = evaluate_expr(env, &args[1])?;
421+
let shared_state = evaluate_expr(env, &args[2])?;
422+
423+
if let Value::Number(idx_val) = idx {
424+
crate::js_promise::__internal_promise_allsettled_reject(idx_val, reason, shared_state);
425+
Ok(Value::Undefined)
426+
} else {
427+
Err(JSError::TypeError {
428+
message: "First argument must be a number".to_string(),
429+
})
430+
}
431+
}
394432

395433
_ => Err(JSError::EvaluationError {
396434
message: format!("Global function {} is not implemented", func_name),

0 commit comments

Comments
 (0)