From 23db8b5544133cc5791e513300eb7bfd2adb1d3b Mon Sep 17 00:00:00 2001 From: Slavey Karadzhov Date: Sun, 17 Jul 2016 12:47:15 +0200 Subject: [PATCH] Refactoring of the ESP8266 target code to match the latest API. Fixes issue #1211. JerryScript-DCO-1.0-Signed-off-by: Slavey Karadzhov slaff@attachix.com --- targets/esp8266/include/jerry_extapi.h | 14 --- targets/esp8266/source/jerry_extapi.c | 115 +++++++++++++------------ targets/esp8266/source/jerry_run.c | 106 +++++++++++------------ targets/esp8266/user/Makefile | 3 +- targets/esp8266/user/jerry_port.c | 2 + 5 files changed, 115 insertions(+), 125 deletions(-) diff --git a/targets/esp8266/include/jerry_extapi.h b/targets/esp8266/include/jerry_extapi.h index 856a79c587..d81c2d4275 100644 --- a/targets/esp8266/include/jerry_extapi.h +++ b/targets/esp8266/include/jerry_extapi.h @@ -19,20 +19,6 @@ #define JERRY_STANDALONE_EXIT_CODE_OK (0) #define JERRY_STANDALONE_EXIT_CODE_FAIL (1) -#define API_DATA_IS_OBJECT(val_p) \ - ((val_p)->type == JERRY_API_DATA_TYPE_OBJECT) - -#define API_DATA_IS_FUNCTION(val_p) \ - (API_DATA_IS_OBJECT(val_p) && \ - jerry_api_is_function((val_p)->u.v_object)) - -#define JS_VALUE_TO_NUMBER(val_p) \ - ((val_p)->type == JERRY_API_DATA_TYPE_FLOAT32 ? \ - (double) ((val_p)->u.v_float32) : \ - (val_p)->type == JERRY_API_DATA_TYPE_FLOAT64 ? \ - (double) ((val_p)->u.v_float64) : \ - (double) ((val_p)->u.v_uint32)) - #ifdef __cplusplus extern "C" { diff --git a/targets/esp8266/source/jerry_extapi.c b/targets/esp8266/source/jerry_extapi.c index 9698929cb9..b14d2f7a5f 100644 --- a/targets/esp8266/source/jerry_extapi.c +++ b/targets/esp8266/source/jerry_extapi.c @@ -16,7 +16,7 @@ #include #include -#include "jerry-core/jerry.h" +#include "jerry-core/jerry-api.h" #include "jerry_extapi.h" #include "native_esp8266.h" @@ -31,12 +31,11 @@ #define __UNSED__ __attribute__((unused)) #define DELCARE_HANDLER(NAME) \ -static bool \ -NAME ## _handler (const jerry_api_object_t * function_obj_p __UNSED__, \ - const jerry_api_value_t * this_p __UNSED__, \ - jerry_api_value_t * ret_val_p __UNSED__, \ - const jerry_api_value_t args_p[], \ - const jerry_api_length_t args_cnt) +static jerry_value_t \ +NAME ## _handler (const jerry_value_t function_obj_val __UNSED__, \ + const jerry_value_t this_val __UNSED__, \ + const jerry_value_t args_p[], \ + const jerry_length_t args_cnt) #define REGISTER_HANDLER(NAME) \ register_native_function ( # NAME, NAME ## _handler) @@ -45,46 +44,54 @@ NAME ## _handler (const jerry_api_object_t * function_obj_p __UNSED__, \ DELCARE_HANDLER(assert) { if (args_cnt == 1 - && args_p[0].type == JERRY_API_DATA_TYPE_BOOLEAN - && args_p[0].u.v_bool == true) + && jerry_value_is_boolean (args_p[0]) + && jerry_get_boolean_value (args_p[0])) { printf (">> Jerry assert true\r\n"); - return true; + return jerry_create_boolean (true); } printf ("Script assertion failed\n"); exit (JERRY_STANDALONE_EXIT_CODE_FAIL); - return false; + return jerry_create_boolean (false); } DELCARE_HANDLER(print) { - jerry_api_length_t cc; + jerry_length_t cc; if (args_cnt) { - printf(">> print(%d) :", (int)args_cnt); + printf(">> print(%d) :", (int) args_cnt); for (cc=0; cc]"); + continue; + } + + jerry_string_to_char_buffer (args_p[cc], + (jerry_char_t *) buffer, + size); + *(buffer + size) = 0; printf("[%s] ", buffer); + free (buffer); } else { - printf ("(%d) ", args_p[cc].type); + printf ("(%d) ", args_p[cc]); } } printf ("\r\n"); } - return true; + return jerry_create_boolean (true); } @@ -97,27 +104,27 @@ DELCARE_HANDLER(gpio_dir) { return false; } - port = (int)JS_VALUE_TO_NUMBER (&args_p[0]); - value = (int)JS_VALUE_TO_NUMBER (&args_p[1]); + port = (int) jerry_get_number_value (args_p[0]); + value = (int) jerry_get_number_value (args_p[1]); native_gpio_dir (port, value); - return true; + return jerry_create_boolean (true); } /* gpio_dir_handler */ DELCARE_HANDLER(gpio_set) { int port, value; if (args_cnt < 2) { - return false; + return jerry_create_boolean (false); } - port = (int)JS_VALUE_TO_NUMBER (&args_p[0]); - value = (int)JS_VALUE_TO_NUMBER (&args_p[1]); + port = (int) jerry_get_number_value (args_p[0]); + value = (int) jerry_get_number_value (args_p[1]); native_gpio_set (port, value); - return true; + return jerry_create_boolean (true); } /* gpio_dir_handler */ @@ -128,14 +135,11 @@ DELCARE_HANDLER(gpio_get) { return false; } - port = (int)JS_VALUE_TO_NUMBER (&args_p[0]); + port = (int) jerry_get_number_value (args_p[0]); value = native_gpio_get (port) ? 1 : 0; - ret_val_p->type = JERRY_API_DATA_TYPE_FLOAT64; - ret_val_p->u.v_float64 = (double)value; - - return true; + return jerry_create_number ((double) value); } /* gpio_dir_handler */ @@ -145,34 +149,37 @@ static bool register_native_function (const char* name, jerry_external_handler_t handler) { - jerry_api_object_t *global_obj_p; - jerry_api_object_t *reg_func_p; - jerry_api_value_t reg_value; + jerry_value_t global_obj_val; + jerry_value_t reg_func_val; + jerry_value_t prop_name_val; + jerry_value_t res; bool bok; - global_obj_p = jerry_api_get_global (); - reg_func_p = jerry_api_create_external_function (handler); + global_obj_val = jerry_get_global_object (); + reg_func_val = jerry_create_external_function (handler); + bok = true; - if (!(reg_func_p != NULL - && jerry_api_is_function (reg_func_p) - && jerry_api_is_constructor (reg_func_p))) + if (!(jerry_value_is_function (reg_func_val) + && jerry_value_is_constructor (reg_func_val))) { printf ("!!! create_external_function failed !!!\r\n"); - jerry_api_release_object (global_obj_p); + jerry_release_value (reg_func_val); + jerry_release_value (global_obj_val); return false; } - jerry_api_acquire_object (reg_func_p); - reg_value.type = JERRY_API_DATA_TYPE_OBJECT; - reg_value.u.v_object = reg_func_p; + prop_name_val = jerry_create_string ((const jerry_char_t *) name); + res = jerry_set_property (global_obj_val, prop_name_val, reg_func_val); - bok = jerry_api_set_object_field_value (global_obj_p, - (jerry_api_char_t *)name, - ®_value); + if (jerry_value_has_error_flag (res)) + { + bok = false; + } - jerry_api_release_value (®_value); - jerry_api_release_object (reg_func_p); - jerry_api_release_object (global_obj_p); + jerry_release_value (res); + jerry_release_value (prop_name_val); + jerry_release_value (reg_func_val); + jerry_release_value (global_obj_val); if (!bok) { diff --git a/targets/esp8266/source/jerry_run.c b/targets/esp8266/source/jerry_run.c index cb483bdc82..17cc495f9f 100644 --- a/targets/esp8266/source/jerry_run.c +++ b/targets/esp8266/source/jerry_run.c @@ -16,39 +16,33 @@ #include #include -#include "jerry-core/jerry.h" +#include "jerry-core/jerry-api.h" #include "jerry_extapi.h" #include "jerry_run.h" static const char* fn_sys_loop_name = "sysloop"; +jerry_value_t parsed_res; /*---------------------------------------------------------------------------*/ int js_entry (const char *source_p, const size_t source_size) { - const jerry_api_char_t *jerry_src = (const jerry_api_char_t *) source_p; - jerry_completion_code_t ret_code = JERRY_COMPLETION_CODE_OK; - jerry_flag_t flags = JERRY_FLAG_EMPTY; - jerry_api_object_t *err_obj_p = NULL; + const jerry_char_t *jerry_src = (const jerry_char_t *) source_p; + int ret_code = 0; /* JERRY_COMPLETION_CODE_OK */ + jerry_init_flag_t flags = JERRY_INIT_EMPTY; jerry_init (flags); js_register_functions (); - if (!jerry_parse ((jerry_api_char_t *)jerry_src, source_size, &err_obj_p)) + parsed_res = jerry_parse ((jerry_char_t *) jerry_src, source_size, false); + + if (jerry_value_has_error_flag (parsed_res)) { printf ("Error: jerry_parse failed\r\n"); - ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION; - } - else - { - if ((flags & JERRY_FLAG_PARSE_ONLY) == 0) - { - jerry_api_value_t err_value = jerry_api_create_void_value (); - ret_code = jerry_run (&err_value); - } + ret_code = JERRY_ERROR_SYNTAX; } return ret_code; @@ -56,65 +50,67 @@ int js_entry (const char *source_p, const size_t source_size) int js_eval (const char *source_p, const size_t source_size) { - jerry_completion_code_t status; - jerry_api_value_t res; + int status = 0; + jerry_value_t res; - status = jerry_api_eval ((jerry_api_char_t *) source_p, + res = jerry_eval ((jerry_char_t *) source_p, source_size, - false, - false, - &res); + false); + if (jerry_value_has_error_flag (res)) { + status = -1; + } - jerry_api_release_value (&res); + jerry_release_value (res); return status; } int js_loop (uint32_t ticknow) { - jerry_api_object_t *global_obj_p; - jerry_api_value_t sysloop_func; - jerry_api_value_t* val_args; + jerry_value_t global_obj_val; + jerry_value_t sysloop_func; + jerry_value_t val_args[1]; uint16_t val_argv; - jerry_api_value_t res; - bool is_ok; - - global_obj_p = jerry_api_get_global (); - is_ok = jerry_api_get_object_field_value (global_obj_p, - (const jerry_api_char_t*)fn_sys_loop_name, - &sysloop_func); - if (!is_ok) - { + jerry_value_t res; + jerry_value_t prop_name_val; + int ret_code = 0; + + global_obj_val = jerry_get_global_object (); + prop_name_val = jerry_create_string ((const jerry_char_t *) fn_sys_loop_name); + sysloop_func = jerry_get_property (global_obj_val, prop_name_val); + jerry_release_value (prop_name_val); + + if (jerry_value_has_error_flag (sysloop_func)) { printf ("Error: '%s' not defined!!!\r\n", fn_sys_loop_name); - jerry_api_release_object (global_obj_p); + jerry_release_value (sysloop_func); + jerry_release_value (global_obj_val); return -1; } - if (!API_DATA_IS_FUNCTION (&sysloop_func)) - { + if (!jerry_value_is_function (sysloop_func)) { printf ("Error: '%s' is not a function!!!\r\n", fn_sys_loop_name); - jerry_api_release_value (&sysloop_func); - jerry_api_release_object (global_obj_p); + jerry_release_value (sysloop_func); + jerry_release_value (global_obj_val); return -2; } val_argv = 1; - val_args = (jerry_api_value_t*)malloc (sizeof (jerry_api_value_t) * val_argv); - val_args[0].type = JERRY_API_DATA_TYPE_UINT32; - val_args[0].u.v_uint32 = ticknow; - - is_ok = jerry_api_call_function (sysloop_func.u.v_object, - global_obj_p, - &res, - val_args, - val_argv); - jerry_api_release_value (&res); - free (val_args); - - jerry_api_release_value (&sysloop_func); - jerry_api_release_object (global_obj_p); - - return 0; + val_args[0] = jerry_create_number (ticknow); + + res = jerry_call_function (sysloop_func, + global_obj_val, + val_args, + val_argv); + + if (jerry_value_has_error_flag (res)) { + ret_code = -3; + } + + jerry_release_value (res); + jerry_release_value (sysloop_func); + jerry_release_value (global_obj_val); + + return ret_code; } void js_exit (void) diff --git a/targets/esp8266/user/Makefile b/targets/esp8266/user/Makefile index eadf0bb3ac..31e4bbfc94 100644 --- a/targets/esp8266/user/Makefile +++ b/targets/esp8266/user/Makefile @@ -38,7 +38,6 @@ endif # INCLUDES := $(INCLUDES) -I $(PDIR)include -INCLUDES += -I ./ -I ../include -PDIR := ../$(PDIR) +INCLUDES += -I ./ -I ../include -I../../../ sinclude $(PDIR)Makefile diff --git a/targets/esp8266/user/jerry_port.c b/targets/esp8266/user/jerry_port.c index 0b55f48a76..2bc4015799 100644 --- a/targets/esp8266/user/jerry_port.c +++ b/targets/esp8266/user/jerry_port.c @@ -17,6 +17,8 @@ #include #include +#include "jerry-core/jerry-port.h" + /** * Provide console message implementation for the engine. */