diff --git a/jerry-core/ecma/operations/ecma-jobqueue.c b/jerry-core/ecma/operations/ecma-jobqueue.c new file mode 100644 index 0000000000..b4dc230b8f --- /dev/null +++ b/jerry-core/ecma/operations/ecma-jobqueue.c @@ -0,0 +1,56 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "ecma-jobqueue.h" +#include "jerry-port.h" + +#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmajobqueue ECMA Job Queue related routines + * @{ + */ + +/** + * The processor for PromiseReactionJob + */ +static ecma_value_t __attribute__ ((unused)) +ecma_job_process_promise_reaction_job (void *job_p) /**< the job to be operated */ +{ + JERRY_UNUSED (job_p); + /** TODO: implement the function body */ + return ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); +} /* ecma_job_process_promise_reaction_job */ + +/** + * The processor for PromiseResolveThenableJob + */ +static ecma_value_t __attribute__ ((unused)) +ecma_job_process_promise_thenable_job (void *job_p) /**< the job to be operated */ +{ + JERRY_UNUSED (job_p); + /** TODO: implement the function body */ + return ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); +} /* ecma_job_process_promise_thenable_job */ + +/** + * @} + * @} + */ +#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */ diff --git a/jerry-core/ecma/operations/ecma-jobqueue.h b/jerry-core/ecma/operations/ecma-jobqueue.h new file mode 100644 index 0000000000..6464503e95 --- /dev/null +++ b/jerry-core/ecma/operations/ecma-jobqueue.h @@ -0,0 +1,33 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ECMA_JOB_QUEUE_H +#define ECMA_JOB_QUEUE_H + +#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmajobqueue ECMA Job Queue related routines + * @{ + */ + +/** + * @} + * @} + */ +#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */ +#endif /* !ECMA_JOB_QUEUE_H */ diff --git a/jerry-core/jerry-port.h b/jerry-core/jerry-port.h index 826b4bc144..011a5d741b 100644 --- a/jerry-core/jerry-port.h +++ b/jerry-core/jerry-port.h @@ -17,6 +17,7 @@ #define JERRY_PORT_H #include +#include #include #ifdef __cplusplus @@ -139,6 +140,14 @@ bool jerry_port_get_time_zone (jerry_time_zone_t *tz_p); */ double jerry_port_get_current_time (void); +#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN + +typedef uint32_t (*jerry_job_handler_t) (void *); + +void jerry_port_jobqueue_enqueue (jerry_job_handler_t handler, void *job_p); + +#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */ + /** * @} */ diff --git a/jerry-core/profiles/es5.1.profile b/jerry-core/profiles/es5.1.profile index 2b8b2d4654..2a554c0e39 100644 --- a/jerry-core/profiles/es5.1.profile +++ b/jerry-core/profiles/es5.1.profile @@ -1,3 +1,4 @@ CONFIG_DISABLE_ES2015_ARRAYBUFFER_BUILTIN CONFIG_DISABLE_ES2015_BUILTIN +CONFIG_DISABLE_ES2015_PROMISE_BUILTIN CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN diff --git a/jerry-core/profiles/minimal.profile b/jerry-core/profiles/minimal.profile index 9cf71b6f9f..33d5185777 100644 --- a/jerry-core/profiles/minimal.profile +++ b/jerry-core/profiles/minimal.profile @@ -5,6 +5,7 @@ CONFIG_DISABLE_DATE_BUILTIN CONFIG_DISABLE_ERROR_BUILTINS CONFIG_DISABLE_ES2015_ARRAYBUFFER_BUILTIN CONFIG_DISABLE_ES2015_BUILTIN +CONFIG_DISABLE_ES2015_PROMISE_BUILTIN CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN CONFIG_DISABLE_JSON_BUILTIN CONFIG_DISABLE_MATH_BUILTIN diff --git a/targets/default/jerry-port-default-jobqueue.c b/targets/default/jerry-port-default-jobqueue.c new file mode 100644 index 0000000000..354904bb3e --- /dev/null +++ b/targets/default/jerry-port-default-jobqueue.c @@ -0,0 +1,141 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "jerryscript.h" +#include "jerry-port.h" +#include "jerry-port-default.h" +#include "jmem.h" +#include "jrt.h" + +#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN + +typedef struct jerry_port_queueitem_t jerry_port_queueitem_t; + +/** + * Description of the queue item. + */ +struct jerry_port_queueitem_t +{ + jerry_port_queueitem_t *next_p; /**< points to next item */ + jerry_job_handler_t handler; /**< the handler for the job*/ + void *job_p; /**< points to the job */ +}; + +/** + * Description of a job queue (FIFO) + */ +typedef struct +{ + jerry_port_queueitem_t *head_p; /**< points to the head item of the queue */ + jerry_port_queueitem_t *tail_p; /**< points to the tail item of the queue*/ +} jerry_port_jobqueue_t; + +static jerry_port_jobqueue_t queue; + +/** + * Initialize the job queue + */ +void jerry_port_jobqueue_init (void) +{ + queue.head_p = NULL; + queue.tail_p = NULL; +} /* jerry_port_jobqueue_init */ + +/** + * Enqueue a job + */ +void jerry_port_jobqueue_enqueue (jerry_job_handler_t handler, /**< the handler for the job */ + void *job_p) /**< the job */ +{ + jerry_port_queueitem_t *item_p = jmem_heap_alloc_block (sizeof (jerry_port_queueitem_t)); + item_p->job_p = job_p; + item_p->handler = handler; + + if (queue.head_p == NULL) + { + JERRY_ASSERT (queue.tail_p == NULL); + + queue.head_p = item_p; + item_p->next_p = NULL; + queue.tail_p = item_p; + + return; + } + + JERRY_ASSERT (queue.tail_p != NULL); + + queue.tail_p->next_p = item_p; + queue.tail_p = item_p; +} /* jerry_port_jobqueue_enqueue */ + +/** + * Dequeue and get the job. + * @return pointer to jerry_port_queueitem_t + * It should be freed with jmem_heap_free_block + */ +static jerry_port_queueitem_t * +jerry_port_jobqueue_dequeue (void) +{ + if (queue.head_p == NULL) + { + JERRY_ASSERT (queue.tail_p == NULL); + + return NULL; + } + + JERRY_ASSERT (queue.tail_p != NULL); + + jerry_port_queueitem_t *item_p = queue.head_p; + queue.head_p = queue.head_p->next_p; + + return item_p; +} /* jerry_port_jobqueue_dequeue */ + +/** + * Start the jobqueue. + * @return jerry value + * If exception happens in the handler, stop the queue + * and return the exception. + * Otherwise, return undefined + */ +jerry_value_t +jerry_port_jobqueue_run (void) +{ + jerry_value_t ret; + + while (true) + { + jerry_port_queueitem_t *item_p = jerry_port_jobqueue_dequeue (); + + if (item_p == NULL) + { + return jerry_create_undefined (); + } + + void *job_p = item_p->job_p; + jerry_job_handler_t handler = item_p->handler; + jmem_heap_free_block (item_p, sizeof (jerry_port_queueitem_t)); + ret = handler (job_p); + + if (jerry_value_has_error_flag (ret)) + { + return ret; + } + + jerry_release_value (ret); + } +} /* jerry_port_jobqueue_run */ + +#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */ diff --git a/targets/default/jerry-port-default.h b/targets/default/jerry-port-default.h index 8cd6153819..2126208a1b 100644 --- a/targets/default/jerry-port-default.h +++ b/targets/default/jerry-port-default.h @@ -16,6 +16,7 @@ #ifndef JERRY_PORT_DEFAULT_H #define JERRY_PORT_DEFAULT_H +#include "jerryscript.h" #include "jerry-port.h" #include @@ -36,6 +37,11 @@ bool jerry_port_default_is_abort_on_fail (void); jerry_log_level_t jerry_port_default_get_log_level (void); void jerry_port_default_set_log_level (jerry_log_level_t level); +#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN +void jerry_port_jobqueue_init (void); +jerry_value_t jerry_port_jobqueue_run (void); +#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */ + /** * @} */