From f60e16d9d567d5c84e4160805dc9e002d747e123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Osztrogon=C3=A1c?= Date: Thu, 16 Jul 2020 16:05:48 +0200 Subject: [PATCH] Fix GetCapabilitiesExecutor function (#4006) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: - Remove false assert, executor can be invoked by 0 or 1 parameters too - Update steps and spec references Already covered by test262 (ESnext) tests: - built-ins/Promise/*/capability-executor-called-twice.js - built-ins/Promise/*/capability-executor-not-callable.js JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác csaba.osztrogonac@h-lab.eu --- .../ecma/operations/ecma-promise-object.c | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/jerry-core/ecma/operations/ecma-promise-object.c b/jerry-core/ecma/operations/ecma-promise-object.c index 623c60014..ebe8d3ba3 100644 --- a/jerry-core/ecma/operations/ecma-promise-object.c +++ b/jerry-core/ecma/operations/ecma-promise-object.c @@ -621,10 +621,12 @@ ecma_promise_all_handler_cb (const ecma_value_t function_obj, /**< the function } /* ecma_promise_all_handler_cb */ /** - * 25.4.1.5.1 GetCapabilitiesExecutor Functions + * GetCapabilitiesExecutor Functions * * Checks and sets a promiseCapability's resolve and reject properties. * + * See also: ES11 25.6.1.5.1 + * * @return ECMA_VALUE_UNDEFINED or TypeError * returned value must be freed with ecma_free_value */ @@ -635,41 +637,41 @@ ecma_op_get_capabilities_executor_cb (const ecma_value_t function_obj, /**< the const ecma_length_t args_count) /**< argument number */ { JERRY_UNUSED (this_val); - JERRY_ASSERT (args_count >= 2); + /* 1. */ ecma_promise_capability_executor_t *executor_p; executor_p = (ecma_promise_capability_executor_t *) ecma_get_object_from_value (function_obj); - /* 2. */ + /* 2-3. */ ecma_object_t *capability_obj_p = ecma_get_object_from_value (executor_p->capability); JERRY_ASSERT (ecma_object_class_is (capability_obj_p, LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY)); ecma_promise_capabality_t *capability_p = (ecma_promise_capabality_t *) capability_obj_p; - /* 3. */ + /* 4. */ if (!ecma_is_value_undefined (capability_p->resolve)) { return ecma_raise_type_error (ECMA_ERR_MSG ("Resolve must be undefined")); } - /* 4. */ + /* 5. */ if (!ecma_is_value_undefined (capability_p->reject)) { return ecma_raise_type_error (ECMA_ERR_MSG ("Reject must be undefined")); } - /* 5. */ - capability_p->resolve = args_p[0]; /* 6. */ - capability_p->reject = args_p[1]; - + capability_p->resolve = args_count > 0 ? args_p[0] : ECMA_VALUE_UNDEFINED; /* 7. */ + capability_p->reject = args_count > 1 ? args_p[1] : ECMA_VALUE_UNDEFINED; + + /* 8. */ return ECMA_VALUE_UNDEFINED; } /* ecma_op_get_capabilities_executor_cb */ /** * Create a new PromiseCapability. * - * See also: ES2015 25.4.1.5 + * See also: ES11 25.6.1.5 * * @return NULL - if the operation raises error * new PromiseCapability object - otherwise @@ -697,17 +699,17 @@ ecma_promise_new_capability (ecma_value_t constructor) capability_p->resolve = ECMA_VALUE_UNDEFINED; capability_p->reject = ECMA_VALUE_UNDEFINED; - /* 4. */ + /* 4-5. */ ecma_object_t *executor_p = ecma_create_object (ecma_builtin_get (ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE), sizeof (ecma_promise_capability_executor_t), ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION); - /* 5. */ + /* 6. */ ecma_promise_capability_executor_t *executor_func_p = (ecma_promise_capability_executor_t *) executor_p; executor_func_p->header.u.external_handler_cb = ecma_op_get_capabilities_executor_cb; executor_func_p->capability = ecma_make_object_value (capability_obj_p); - /* 6. */ + /* 7. */ ecma_value_t executor = ecma_make_object_value (executor_p); ecma_value_t promise = ecma_op_function_construct (constructor_obj_p, constructor_obj_p, @@ -715,7 +717,6 @@ ecma_promise_new_capability (ecma_value_t constructor) 1); ecma_deref_object (executor_p); - /* 7. */ if (ECMA_IS_VALUE_ERROR (promise)) { ecma_deref_object (capability_obj_p);