From 9c803672ffe83e3a5ac71e650ec33f441307ce8f Mon Sep 17 00:00:00 2001 From: Jan Jongboom Date: Tue, 29 Nov 2016 22:43:03 +0800 Subject: [PATCH] target: mbedos5: Add return value to setTimeout/setInterval and implement clearTimeout/clearInterval (#1457) 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 52978b044..710bc7caf 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 255af2523..0936ca92a 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 d3812cbcb..88031c0d0 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 4953e5001..3e7d9687b 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 f0df78f82..f153873c4 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(); }