Add notification callback for Promise operations (#4595)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -186,6 +186,17 @@ ecma_process_promise_reaction_job (ecma_job_promise_reaction_t *job_p) /**< the
|
||||
LIT_INTERNAL_MAGIC_PROMISE_CAPABILITY));
|
||||
ecma_promise_capabality_t *capability_p;
|
||||
capability_p = (ecma_promise_capabality_t *) ecma_get_object_from_value (job_p->capability);
|
||||
|
||||
#if JERRY_PROMISE_CALLBACK
|
||||
if (JERRY_UNLIKELY (JERRY_CONTEXT (promise_callback) != NULL))
|
||||
{
|
||||
JERRY_CONTEXT (promise_callback) (JERRY_PROMISE_EVENT_BEFORE_REACTION_JOB,
|
||||
capability_p->header.u.class_prop.u.promise,
|
||||
ECMA_VALUE_UNDEFINED,
|
||||
JERRY_CONTEXT (promise_callback_user_p));
|
||||
}
|
||||
#endif /* JERRY_PROMISE_CALLBACK */
|
||||
|
||||
/* 3. */
|
||||
ecma_value_t handler = job_p->handler;
|
||||
|
||||
@@ -232,6 +243,17 @@ ecma_process_promise_reaction_job (ecma_job_promise_reaction_t *job_p) /**< the
|
||||
}
|
||||
|
||||
ecma_free_value (handler_result);
|
||||
|
||||
#if JERRY_PROMISE_CALLBACK
|
||||
if (JERRY_UNLIKELY (JERRY_CONTEXT (promise_callback) != NULL))
|
||||
{
|
||||
JERRY_CONTEXT (promise_callback) (JERRY_PROMISE_EVENT_AFTER_REACTION_JOB,
|
||||
capability_p->header.u.class_prop.u.promise,
|
||||
ECMA_VALUE_UNDEFINED,
|
||||
JERRY_CONTEXT (promise_callback_user_p));
|
||||
}
|
||||
#endif /* JERRY_PROMISE_CALLBACK */
|
||||
|
||||
ecma_free_promise_reaction_job (job_p);
|
||||
|
||||
return status;
|
||||
@@ -246,6 +268,23 @@ ecma_process_promise_reaction_job (ecma_job_promise_reaction_t *job_p) /**< the
|
||||
static ecma_value_t
|
||||
ecma_process_promise_async_reaction_job (ecma_job_promise_async_reaction_t *job_p) /**< the job to be operated */
|
||||
{
|
||||
#if JERRY_PROMISE_CALLBACK
|
||||
if (JERRY_UNLIKELY (JERRY_CONTEXT (promise_callback) != NULL))
|
||||
{
|
||||
jerry_promise_event_type_t type = JERRY_PROMISE_EVENT_ASYNC_BEFORE_RESOLVE;
|
||||
|
||||
if (ecma_job_queue_get_type (&job_p->header) == ECMA_JOB_PROMISE_ASYNC_REACTION_REJECTED)
|
||||
{
|
||||
type = JERRY_PROMISE_EVENT_ASYNC_BEFORE_REJECT;
|
||||
}
|
||||
|
||||
JERRY_CONTEXT (promise_callback) (type,
|
||||
job_p->executable_object,
|
||||
job_p->argument,
|
||||
JERRY_CONTEXT (promise_callback_user_p));
|
||||
}
|
||||
#endif /* JERRY_PROMISE_CALLBACK */
|
||||
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (job_p->executable_object);
|
||||
vm_executable_object_t *executable_object_p = (vm_executable_object_t *) object_p;
|
||||
|
||||
@@ -284,6 +323,8 @@ ecma_process_promise_async_reaction_job (ecma_job_promise_async_reaction_t *job_
|
||||
}
|
||||
}
|
||||
|
||||
ecma_value_t result;
|
||||
|
||||
if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_DO_AWAIT_OR_YIELD)
|
||||
{
|
||||
job_p->argument = ecma_await_continue (executable_object_p, job_p->argument);
|
||||
@@ -297,9 +338,8 @@ ecma_process_promise_async_reaction_job (ecma_job_promise_async_reaction_t *job_
|
||||
{
|
||||
/* Continue iteration. */
|
||||
JERRY_ASSERT (job_p->argument == ECMA_VALUE_UNDEFINED);
|
||||
|
||||
ecma_free_promise_async_reaction_job (job_p);
|
||||
return ECMA_VALUE_UNDEFINED;
|
||||
result = ECMA_VALUE_UNDEFINED;
|
||||
goto free_job;
|
||||
}
|
||||
|
||||
if (ECMA_AWAIT_GET_STATE (executable_object_p) <= ECMA_AWAIT_YIELD_END)
|
||||
@@ -316,7 +356,7 @@ ecma_process_promise_async_reaction_job (ecma_job_promise_async_reaction_t *job_
|
||||
executable_object_p->extended_object.u.class_prop.extra_info &= ECMA_AWAIT_CLEAR_MASK;
|
||||
}
|
||||
|
||||
ecma_value_t result = opfunc_resume_executable_object (executable_object_p, job_p->argument);
|
||||
result = opfunc_resume_executable_object (executable_object_p, job_p->argument);
|
||||
/* Argument reference has been taken by opfunc_resume_executable_object. */
|
||||
job_p->argument = ECMA_VALUE_UNDEFINED;
|
||||
|
||||
@@ -327,6 +367,25 @@ ecma_process_promise_async_reaction_job (ecma_job_promise_async_reaction_t *job_
|
||||
result = ECMA_VALUE_UNDEFINED;
|
||||
}
|
||||
|
||||
free_job:
|
||||
|
||||
#if JERRY_PROMISE_CALLBACK
|
||||
if (JERRY_UNLIKELY (JERRY_CONTEXT (promise_callback) != NULL))
|
||||
{
|
||||
jerry_promise_event_type_t type = JERRY_PROMISE_EVENT_ASYNC_AFTER_RESOLVE;
|
||||
|
||||
if (ecma_job_queue_get_type (&job_p->header) == ECMA_JOB_PROMISE_ASYNC_REACTION_REJECTED)
|
||||
{
|
||||
type = JERRY_PROMISE_EVENT_ASYNC_AFTER_REJECT;
|
||||
}
|
||||
|
||||
JERRY_CONTEXT (promise_callback) (type,
|
||||
job_p->executable_object,
|
||||
job_p->argument,
|
||||
JERRY_CONTEXT (promise_callback_user_p));
|
||||
}
|
||||
#endif /* JERRY_PROMISE_CALLBACK */
|
||||
|
||||
ecma_free_promise_async_reaction_job (job_p);
|
||||
return result;
|
||||
} /* ecma_process_promise_async_reaction_job */
|
||||
|
||||
Reference in New Issue
Block a user