From e6be54af38d88d995ea8add00a502ea24f6a5a09 Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Mon, 28 Nov 2016 23:12:19 +0800 Subject: [PATCH] target: mbedos5: Add return value to setTimeout/setInterval and implement clearTimeout/clearInterval In the mbedos5 target the setTimeout and setInterval functions are not on spec, as they return 'undefined' instead of an event ID. Also clearTimeout and clearInterval are not implemented, so scheduled events cannot be canceled. This patch changes the behavior of the set* functions, and implements clear* functions. JerryScript-DCO-1.0-Signed-off-by: Jan Jongboom janjongboom@gmail.com --- .../jerryscript-mbed-drivers/lib_drivers.h | 2 ++ .../jerryscript-mbed-drivers/setInterval-js.h | 1 + .../jerryscript-mbed-drivers/setTimeout-js.h | 1 + .../source/setInterval.cpp | 21 ++++++++++++++++++- .../source/setTimeout.cpp | 20 +++++++++++++++++- 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/lib_drivers.h b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/lib_drivers.h index 52978b0449..710bc7cafd 100644 --- a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/lib_drivers.h +++ b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/lib_drivers.h @@ -28,6 +28,8 @@ DECLARE_JS_WRAPPER_REGISTRATION (base) { REGISTER_GLOBAL_FUNCTION(gc); REGISTER_GLOBAL_FUNCTION(setInterval); REGISTER_GLOBAL_FUNCTION(setTimeout); + REGISTER_GLOBAL_FUNCTION(clearInterval); + REGISTER_GLOBAL_FUNCTION(clearTimeout); REGISTER_CLASS_CONSTRUCTOR(DigitalOut); REGISTER_CLASS_CONSTRUCTOR(I2C); REGISTER_CLASS_CONSTRUCTOR(InterruptIn); diff --git a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setInterval-js.h b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setInterval-js.h index 255af2523d..0936ca92ac 100644 --- a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setInterval-js.h +++ b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setInterval-js.h @@ -18,5 +18,6 @@ #include "jerryscript-mbed-library-registry/wrap_tools.h" DECLARE_GLOBAL_FUNCTION(setInterval); +DECLARE_GLOBAL_FUNCTION(clearInterval); #endif // _JERRYSCRIPT_MBED_DRIVERS_SET_INTERVAL_H diff --git a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setTimeout-js.h b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setTimeout-js.h index d3812cbcba..88031c0d06 100644 --- a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setTimeout-js.h +++ b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/setTimeout-js.h @@ -18,5 +18,6 @@ #include "jerryscript-mbed-library-registry/wrap_tools.h" DECLARE_GLOBAL_FUNCTION(setTimeout); +DECLARE_GLOBAL_FUNCTION(clearTimeout); #endif // _JERRYSCRIPT_MBED_DRIVERS_SET_TIMEOUT_H diff --git a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setInterval.cpp b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setInterval.cpp index 4953e50015..3e7d9687ba 100644 --- a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setInterval.cpp +++ b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setInterval.cpp @@ -31,6 +31,25 @@ DECLARE_GLOBAL_FUNCTION(setInterval) { jerry_acquire_value(args[0]); int interval = int(jerry_get_number_value(args[1])); - mbed::js::EventLoop::getInstance().getQueue().call_every(interval, jerry_call_function, args[0], jerry_create_null(), (jerry_value_t*)NULL, 0); + int id = mbed::js::EventLoop::getInstance().getQueue().call_every(interval, jerry_call_function, args[0], jerry_create_null(), (jerry_value_t*)NULL, 0); + + return jerry_create_number(id); +} + +/** + * clearInterval (native JavaScript function) + * + * Cancel an event that was previously scheduled via setInterval. + * + * @param id ID of the timeout event, returned by setInterval. + */ +DECLARE_GLOBAL_FUNCTION(clearInterval) { + CHECK_ARGUMENT_COUNT(global, clearInterval, (args_count == 1)); + CHECK_ARGUMENT_TYPE_ALWAYS(global, clearInterval, 0, number); + + int id = int(jerry_get_number_value(args[0])); + + mbed::js::EventLoop::getInstance().getQueue().cancel(id); + return jerry_create_undefined(); } diff --git a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setTimeout.cpp b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setTimeout.cpp index f0df78f822..f153873c41 100644 --- a/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setTimeout.cpp +++ b/targets/mbedos5/jerryscript-mbed/jerryscript-mbed-drivers/source/setTimeout.cpp @@ -31,7 +31,25 @@ DECLARE_GLOBAL_FUNCTION(setTimeout) { jerry_acquire_value(args[0]); int interval = int(jerry_get_number_value(args[1])); - mbed::js::EventLoop::getInstance().getQueue().call_in(interval, jerry_call_function, args[0], jerry_create_null(), (jerry_value_t*)NULL, 0); + int id = mbed::js::EventLoop::getInstance().getQueue().call_in(interval, jerry_call_function, args[0], jerry_create_null(), (jerry_value_t*)NULL, 0); + + return jerry_create_number(id); +} + +/** + * clearTimeout (native JavaScript function) + * + * Cancel an event that was previously scheduled via setTimeout. + * + * @param id ID of the timeout event, returned by setTimeout. + */ +DECLARE_GLOBAL_FUNCTION(clearTimeout) { + CHECK_ARGUMENT_COUNT(global, clearTimeout, (args_count == 1)); + CHECK_ARGUMENT_TYPE_ALWAYS(global, clearTimeout, 0, number); + + int id = int(jerry_get_number_value(args[0])); + + mbed::js::EventLoop::getInstance().getQueue().cancel(id); return jerry_create_undefined(); }