diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index b0e285eb7c..2dd5f05a55 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -222,6 +222,9 @@ jerry_cleanup (void) jmem_heap_free_block (this_p, sizeof (jerry_context_data_header_t) + this_p->manager_p->bytes_needed); } +#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN + ecma_free_all_enqueued_jobs (); +#endif /* CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */ ecma_finalize (); jmem_finalize (); jerry_make_api_unavailable (); diff --git a/jerry-core/ecma/operations/ecma-jobqueue.c b/jerry-core/ecma/operations/ecma-jobqueue.c index c5b1ca81d4..59b5c8ac73 100644 --- a/jerry-core/ecma/operations/ecma-jobqueue.c +++ b/jerry-core/ecma/operations/ecma-jobqueue.c @@ -346,6 +346,23 @@ ecma_process_all_enqueued_jobs (void) return ret; } /* ecma_process_all_enqueued_jobs */ +/** + * Release enqueued Promise jobs. + */ +void +ecma_free_all_enqueued_jobs (void) +{ + while (JERRY_CONTEXT (job_queue_head_p) != NULL) + { + ecma_job_queueitem_t *item_p = JERRY_CONTEXT (job_queue_head_p); + JERRY_CONTEXT (job_queue_head_p) = item_p->next_p; + void *job_p = item_p->job_p; + jmem_heap_free_block (item_p, sizeof (ecma_job_queueitem_t)); + + ecma_free_promise_reaction_job (job_p); + } +} /* ecma_free_all_enqueued_jobs */ + /** * @} * @} diff --git a/jerry-core/ecma/operations/ecma-jobqueue.h b/jerry-core/ecma/operations/ecma-jobqueue.h index 76dcb4b2e7..378a957125 100644 --- a/jerry-core/ecma/operations/ecma-jobqueue.h +++ b/jerry-core/ecma/operations/ecma-jobqueue.h @@ -44,6 +44,7 @@ void ecma_job_queue_init (void); void ecma_enqueue_promise_reaction_job (ecma_value_t reaction, ecma_value_t argument); void ecma_enqueue_promise_resolve_thenable_job (ecma_value_t promise, ecma_value_t thenable, ecma_value_t then); +void ecma_free_all_enqueued_jobs (void); ecma_value_t ecma_process_all_enqueued_jobs (void);