2020#include "ecma-objects.h"
2121#include "ecma-promise-object.h"
2222#include "jcontext.h"
23+ #include "opcodes.h"
2324
2425#if ENABLED (JERRY_BUILTIN_PROMISE )
2526
@@ -46,6 +47,16 @@ typedef struct
4647 ecma_value_t argument ; /**< argument for the reaction */
4748} ecma_job_promise_reaction_t ;
4849
50+ /**
51+ * Description of the PromiseAsyncReactionJob
52+ */
53+ typedef struct
54+ {
55+ ecma_job_queue_item_t header ; /**< job queue item header */
56+ ecma_value_t executable_object ; /**< executable object */
57+ ecma_value_t argument ; /**< argument for the reaction */
58+ } ecma_job_promise_async_reaction_t ;
59+
4960/**
5061 * Description of the PromiseResolveThenableJob
5162 */
@@ -103,6 +114,21 @@ ecma_free_promise_reaction_job (ecma_job_promise_reaction_t *job_p) /**< points
103114 jmem_heap_free_block (job_p , sizeof (ecma_job_promise_reaction_t ));
104115} /* ecma_free_promise_reaction_job */
105116
117+ /**
118+ * Free the heap and the member of the PromiseAsyncReactionJob.
119+ */
120+ static void
121+ ecma_free_promise_async_reaction_job (ecma_job_promise_async_reaction_t * job_p ) /**< points to the
122+ * PromiseAsyncReactionJob */
123+ {
124+ JERRY_ASSERT (job_p != NULL );
125+
126+ ecma_free_value (job_p -> executable_object );
127+ ecma_free_value (job_p -> argument );
128+
129+ jmem_heap_free_block (job_p , sizeof (ecma_job_promise_async_reaction_t ));
130+ } /* ecma_free_promise_async_reaction_job */
131+
106132/**
107133 * Free the heap and the member of the PromiseResolveThenableJob.
108134 */
@@ -196,6 +222,29 @@ ecma_process_promise_reaction_job (ecma_job_promise_reaction_t *job_p) /**< the
196222 return status ;
197223} /* ecma_process_promise_reaction_job */
198224
225+ /**
226+ * The processor for PromiseAsyncReactionJob.
227+ *
228+ * @return ecma value
229+ * Returned value must be freed with ecma_free_value
230+ */
231+ static ecma_value_t
232+ ecma_process_promise_async_reaction_job (ecma_job_promise_async_reaction_t * job_p ) /**< the job to be operated */
233+ {
234+ ecma_object_t * object_p = ecma_get_object_from_value (job_p -> executable_object );
235+ vm_executable_object_t * executable_object_p = (vm_executable_object_t * ) object_p ;
236+
237+ if (ecma_job_queue_get_type (& job_p -> header ) == ECMA_JOB_PROMISE_ASYNC_REACTION_REJECTED )
238+ {
239+ executable_object_p -> frame_ctx .byte_code_p = opfunc_resume_executable_object_with_throw ;
240+ }
241+
242+ ecma_value_t result = opfunc_resume_executable_object (executable_object_p , job_p -> argument );
243+ ecma_free_promise_async_reaction_job (job_p );
244+
245+ return result ;
246+ } /* ecma_process_promise_async_reaction_job */
247+
199248/**
200249 * Process the PromiseResolveThenableJob.
201250 *
@@ -273,7 +322,7 @@ ecma_enqueue_job (ecma_job_queue_item_t *job_p) /**< the job */
273322} /* ecma_enqueue_job */
274323
275324/**
276- * Enqueue a PromiseReactionJob into the jobqueue .
325+ * Enqueue a PromiseReactionJob into the job queue .
277326 */
278327void
279328ecma_enqueue_promise_reaction_job (ecma_value_t capability , /**< capability object */
@@ -291,7 +340,25 @@ ecma_enqueue_promise_reaction_job (ecma_value_t capability, /**< capability obje
291340} /* ecma_enqueue_promise_reaction_job */
292341
293342/**
294- * Enqueue a PromiseResolveThenableJob into the jobqueue.
343+ * Enqueue a PromiseAsyncReactionJob into the job queue.
344+ */
345+ void
346+ ecma_enqueue_promise_async_reaction_job (ecma_value_t executable_object , /**< executable object */
347+ ecma_value_t argument , /**< argument */
348+ bool is_rejected ) /**< is_fulfilled */
349+ {
350+ ecma_job_promise_async_reaction_t * job_p ;
351+ job_p = (ecma_job_promise_async_reaction_t * ) jmem_heap_alloc_block (sizeof (ecma_job_promise_async_reaction_t ));
352+ job_p -> header .next_and_type = (is_rejected ? ECMA_JOB_PROMISE_ASYNC_REACTION_REJECTED
353+ : ECMA_JOB_PROMISE_ASYNC_REACTION_FULFILLED );
354+ job_p -> executable_object = ecma_copy_value (executable_object );
355+ job_p -> argument = ecma_copy_value (argument );
356+
357+ ecma_enqueue_job (& job_p -> header );
358+ } /* ecma_enqueue_promise_async_reaction_job */
359+
360+ /**
361+ * Enqueue a PromiseResolveThenableJob into the job queue.
295362 */
296363void
297364ecma_enqueue_promise_resolve_thenable_job (ecma_value_t promise , /**< promise to be resolved */
@@ -338,6 +405,12 @@ ecma_process_all_enqueued_jobs (void)
338405 ret = ecma_process_promise_reaction_job ((ecma_job_promise_reaction_t * ) job_p );
339406 break ;
340407 }
408+ case ECMA_JOB_PROMISE_ASYNC_REACTION_FULFILLED :
409+ case ECMA_JOB_PROMISE_ASYNC_REACTION_REJECTED :
410+ {
411+ ret = ecma_process_promise_async_reaction_job ((ecma_job_promise_async_reaction_t * ) job_p );
412+ break ;
413+ }
341414 default :
342415 {
343416 JERRY_ASSERT (ecma_job_queue_get_type (job_p ) == ECMA_JOB_PROMISE_THENABLE );
@@ -369,6 +442,12 @@ ecma_free_all_enqueued_jobs (void)
369442 ecma_free_promise_reaction_job ((ecma_job_promise_reaction_t * ) job_p );
370443 break ;
371444 }
445+ case ECMA_JOB_PROMISE_ASYNC_REACTION_FULFILLED :
446+ case ECMA_JOB_PROMISE_ASYNC_REACTION_REJECTED :
447+ {
448+ ecma_free_promise_async_reaction_job ((ecma_job_promise_async_reaction_t * ) job_p );
449+ break ;
450+ }
372451 default :
373452 {
374453 JERRY_ASSERT (ecma_job_queue_get_type (job_p ) == ECMA_JOB_PROMISE_THENABLE );
0 commit comments