Add new.target argument to Promise create (#4606)

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg 2021-02-24 08:50:05 +01:00 committed by GitHub
parent 5c35370327
commit 1cf2989a64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 18 additions and 35 deletions

View File

@ -2195,16 +2195,8 @@ jerry_create_promise (void)
jerry_assert_api_available ();
#if JERRY_BUILTIN_PROMISE
ecma_object_t *old_new_target_p = JERRY_CONTEXT (current_new_target_p);
ecma_value_t promise_value = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED, NULL);
if (old_new_target_p == NULL)
{
JERRY_CONTEXT (current_new_target_p) = ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE);
}
ecma_value_t promise_value = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED);
JERRY_CONTEXT (current_new_target_p) = old_new_target_p;
return promise_value;
#else /* !JERRY_BUILTIN_PROMISE */
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (error_promise_not_supported_p)));

View File

@ -455,7 +455,9 @@ ecma_builtin_promise_dispatch_construct (const ecma_value_t *arguments_list_p, /
return ecma_raise_type_error (ECMA_ERR_MSG ("First parameter must be callable"));
}
return ecma_op_create_promise_object (arguments_list_p[0], ECMA_VALUE_UNDEFINED);
return ecma_op_create_promise_object (arguments_list_p[0],
ECMA_VALUE_UNDEFINED,
JERRY_CONTEXT (current_new_target_p));
} /* ecma_builtin_promise_dispatch_construct */
/**

View File

@ -55,10 +55,7 @@ ecma_async_generator_enqueue (vm_executable_object_t *async_generator_object_p,
task_p->operation_value = ecma_copy_value_if_not_object (value);
task_p->operation_type = (uint8_t) operation;
ecma_object_t *old_new_target_p = JERRY_CONTEXT (current_new_target_p);
JERRY_CONTEXT (current_new_target_p) = ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE);
ecma_value_t result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED);
JERRY_CONTEXT (current_new_target_p) = old_new_target_p;
ecma_value_t result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED, NULL);
task_p->promise = result;
ecma_value_t head = async_generator_object_p->extended_object.u.class_prop.u.head;

View File

@ -424,13 +424,18 @@ ecma_promise_create_resolving_functions (ecma_promise_object_t *promise_p) /**<
*/
ecma_value_t
ecma_op_create_promise_object (ecma_value_t executor, /**< the executor function or ECMA_VALUE_EMPTY */
ecma_value_t parent) /**< parent promise if available */
ecma_value_t parent, /**< parent promise if available */
ecma_object_t *new_target_p) /**< new.target value */
{
JERRY_UNUSED (parent);
JERRY_ASSERT (JERRY_CONTEXT (current_new_target_p) != NULL);
if (new_target_p == NULL)
{
new_target_p = ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE);
}
/* 3. */
ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target_p),
ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (new_target_p,
ECMA_BUILTIN_ID_PROMISE_PROTOTYPE);
if (JERRY_UNLIKELY (proto_p == NULL))
@ -679,12 +684,7 @@ ecma_promise_new_capability (ecma_value_t constructor, /**< constructor function
if (constructor_obj_p == ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE))
{
ecma_object_t *old_new_target_p = JERRY_CONTEXT (current_new_target_p);
JERRY_CONTEXT (current_new_target_p) = constructor_obj_p;
promise = ecma_op_create_promise_object (executor, parent);
JERRY_CONTEXT (current_new_target_p) = old_new_target_p;
promise = ecma_op_create_promise_object (executor, parent, constructor_obj_p);
}
else
{

View File

@ -95,7 +95,8 @@ typedef struct
*/
bool ecma_is_promise (ecma_object_t *obj_p);
ecma_value_t ecma_op_create_promise_object (ecma_value_t executor, ecma_value_t parent);
ecma_value_t ecma_op_create_promise_object (ecma_value_t executor, ecma_value_t parent,
ecma_object_t *new_target_p);
uint16_t ecma_promise_get_flags (ecma_object_t *promise_p);
ecma_value_t ecma_promise_get_result (ecma_object_t *promise_p);
void ecma_reject_promise (ecma_value_t promise, ecma_value_t reason);

View File

@ -898,15 +898,11 @@ opfunc_async_create_and_await (vm_frame_ctx_t *frame_ctx_p, /**< frame context *
ecma_deref_object ((ecma_object_t *) executable_object_p);
ecma_free_value (result);
ecma_object_t *old_new_target_p = JERRY_CONTEXT (current_new_target_p);
JERRY_CONTEXT (current_new_target_p) = promise_p;
result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED);
result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED, promise_p);
JERRY_ASSERT (ecma_is_value_object (result));
executable_object_p->frame_ctx.block_result = result;
JERRY_CONTEXT (current_new_target_p) = old_new_target_p;
return result;
} /* opfunc_async_create_and_await */

View File

@ -2716,12 +2716,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
if (result == ECMA_VALUE_UNDEFINED)
{
ecma_object_t *old_new_target_p = JERRY_CONTEXT (current_new_target_p);
JERRY_CONTEXT (current_new_target_p) = ecma_builtin_get (ECMA_BUILTIN_ID_PROMISE);
result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED);
JERRY_CONTEXT (current_new_target_p) = old_new_target_p;
result = ecma_op_create_promise_object (ECMA_VALUE_EMPTY, ECMA_VALUE_UNDEFINED, NULL);
}
vm_stack_context_type_t context_type = VM_GET_CONTEXT_TYPE (stack_top_p[-1]);