From 38a6b303ad8c61cee099033303d50e3741b6ec77 Mon Sep 17 00:00:00 2001 From: "Davit Markarian (UDXS)" Date: Tue, 3 Mar 2020 17:27:03 +0100 Subject: [PATCH 01/10] Added submodule lib/jerryscript --- .gitmodules | 3 +++ lib/jerryscript | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/jerryscript diff --git a/.gitmodules b/.gitmodules index 898c0cb0..ac8bef09 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "lib/libpebble2"] path = lib/libpebble2 url = ../../pebble-dev/libpebble2 +[submodule "lib/jerryscript"] + path = lib/jerryscript + url = https://github.com/pebble/jerryscript.git diff --git a/lib/jerryscript b/lib/jerryscript new file mode 160000 index 00000000..76bbb088 --- /dev/null +++ b/lib/jerryscript @@ -0,0 +1 @@ +Subproject commit 76bbb088e91d36ee19349b06127eb0cbd5eea94f From 6abeccfc1f4b1d85125e070d7732f0e834a31111 Mon Sep 17 00:00:00 2001 From: "Davit Markarian (UDXS)" Date: Wed, 4 Mar 2020 22:06:28 +0100 Subject: [PATCH 02/10] Added JerryScript build and configuration --- .gitignore | 3 +++ Makefile | 2 ++ config.mk | 1 + rcore/api_func_symbols.h | 1 + rcore/appmanager.h | 2 -- rcore/appmanager_app_runloop.c | 5 ----- rwatch/js/rocky_jerry.h | 34 ++++++++++++++++++++++++++++++++++ rwatch/js/rocky_js.h | 14 ++++++++++++++ 8 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 rwatch/js/rocky_jerry.h create mode 100644 rwatch/js/rocky_js.h diff --git a/.gitignore b/.gitignore index aefef5d5..7cfed59d 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,9 @@ #Kate .kate-swp +#Visual Studio Code +.vscode + *~ build/* diff --git a/Makefile b/Makefile index ea03aa28..3610da87 100644 --- a/Makefile +++ b/Makefile @@ -247,6 +247,8 @@ $(VIRTUALENV): Utilities/requirements.txt $(QUIET)$(PYTHON3) -m virtualenv $@ $(call SAY,PIP INSTALL $@) $(QUIET)$(VIRTUALENV)/bin/pip3 install -r $< + $(QUIET)$(VPYTHON3) libs/jerryscript/tools/srcgenerator.py --output-dir $(BUILD)/jerryscript + clean: rm -rf $(BUILD) diff --git a/config.mk b/config.mk index 05d4b95b..793ed482 100644 --- a/config.mk +++ b/config.mk @@ -28,6 +28,7 @@ CFLAGS_all += -Irwatch/ui/animation CFLAGS_all += -Irwatch/input CFLAGS_all += -Irwatch/graphics CFLAGS_all += -Irwatch/event +CFLAGS_all += -Irwatch/js CFLAGS_all += -Ihw/platform/qemu CFLAGS_all += -DNGFX_IS_CORE diff --git a/rcore/api_func_symbols.h b/rcore/api_func_symbols.h index 3c3723de..27f8bc30 100644 --- a/rcore/api_func_symbols.h +++ b/rcore/api_func_symbols.h @@ -3,6 +3,7 @@ #include "librebble.h" #include "graphics_wrapper.h" #include "battery_state_service.h" +#include "rockyjs.h" GBitmap *gbitmap_create_with_resource_proxy(uint32_t resource_id); bool persist_exists(void); diff --git a/rcore/appmanager.h b/rcore/appmanager.h index dd611506..c129e304 100644 --- a/rcore/appmanager.h +++ b/rcore/appmanager.h @@ -187,6 +187,4 @@ TickType_t appmanager_timer_get_next_expiry(app_running_thread *thread); App *appmanager_get_app(char *app_name); void appmanager_app_loader_init(void); -void rocky_event_loop_with_resource(uint16_t resource_id); - void timer_init(void); diff --git a/rcore/appmanager_app_runloop.c b/rcore/appmanager_app_runloop.c index 34c1541f..80415921 100644 --- a/rcore/appmanager_app_runloop.c +++ b/rcore/appmanager_app_runloop.c @@ -86,11 +86,6 @@ bool appmanager_is_app_shutting_down(void) return _this_thread->status == AppThreadUnloading; } -void rocky_event_loop_with_resource(uint16_t resource_id) -{ - app_event_loop(); -} - static void _draw(uint8_t force_draw) { /* Request a draw. This is mostly from an app invalidating something */ diff --git a/rwatch/js/rocky_jerry.h b/rwatch/js/rocky_jerry.h new file mode 100644 index 00000000..60d741ff --- /dev/null +++ b/rwatch/js/rocky_jerry.h @@ -0,0 +1,34 @@ +#pragma once + +/* rockyjs.h + * + * Rocky.js (On-watch JavaScript) Implementation + * JerryScript Configuration + * + * RebbleOS + * + * Author: Davit Markarian + */ + +#include "jerryscript-config.h" + +// RebbleOS provides allocation functions. +#define JERRY_SYSTEM_ALLOCATOR 1 +// System Allocation requires using full 32-bit pointers. +# define JERRY_CPOINTER_32_BIT 0 + +// RebbleOS works with soft-floats. In the interest of speed, JerryScript is told to use less precise 32-bit floats. +# define JERRY_NUMBER_TYPE_FLOAT64 0 + +// Rocky.js runs precompiled bytecode, rather than raw JS source. +# define JERRY_SNAPSHOT_EXEC 1 +// This should save some flash since we don't need to parse JS source. Note: this breaks "eval". +# define JERRY_PARSER 0 + +// Needed to periodically handle events. +# define JERRY_VM_EXEC_STOP 1 + +// TODO: Evaluate the need for certain features and builtins, removing as necessary. +// TODO: Tune heap/stack/GC limits for better performance. + +#include "jerryscript.h" \ No newline at end of file diff --git a/rwatch/js/rocky_js.h b/rwatch/js/rocky_js.h new file mode 100644 index 00000000..ffe8fc4c --- /dev/null +++ b/rwatch/js/rocky_js.h @@ -0,0 +1,14 @@ +#pragma once + +/* rockyjs.h + * + * Rocky.js (On-watch JavaScript) Implementation + * + * RebbleOS + * + * Author: Davit Markarian + */ + +#include + +void rocky_event_loop_with_resource(uint32_t resource_id); \ No newline at end of file From 997ef10daed20011526e2c7a16132fb4cbbbe7ff Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Fri, 6 Mar 2020 19:38:15 +0100 Subject: [PATCH 03/10] Canvas Started --- rwatch/js/rocky_canvas.c | 4 ++ rwatch/js/rocky_canvas.h | 92 ++++++++++++++++++++++++++++++++++++++++ rwatch/js/rocky_js.c | 3 ++ rwatch/js/rocky_lib.c | 0 4 files changed, 99 insertions(+) create mode 100644 rwatch/js/rocky_canvas.c create mode 100644 rwatch/js/rocky_canvas.h create mode 100644 rwatch/js/rocky_js.c create mode 100644 rwatch/js/rocky_lib.c diff --git a/rwatch/js/rocky_canvas.c b/rwatch/js/rocky_canvas.c new file mode 100644 index 00000000..04485cbc --- /dev/null +++ b/rwatch/js/rocky_canvas.c @@ -0,0 +1,4 @@ +#include +#include "rocky_canvas.h" + +bool rocky_font_parse(char* fontStr, RockyCanvasFont* outFont); diff --git a/rwatch/js/rocky_canvas.h b/rwatch/js/rocky_canvas.h new file mode 100644 index 00000000..aab8b59f --- /dev/null +++ b/rwatch/js/rocky_canvas.h @@ -0,0 +1,92 @@ +#include "rebbleos.h" + +typedef uint8_t RockyCanvasFontSize; + +typedef enum +{ + RockyCanvasFontVariant_Normal, + RockyCanvasFontVariant_Light, + RockyCanvasFontVariant_Bold, + RockyCanvasFontVariant_Bolder +} RockyCanvasFontWeight; + +typedef enum +{ + RockyCanvasFontVariant_Default, + RockyCanvasFontVariant_Numbers +} RockyCanvasFontVariant; + +typedef enum +{ + RockyCanvasFontFamily_Gothic, + RockyCanvasFontFamily_Bitham, + RockyCanvasFontFamily_Bitham_numeric, + RockyCanvasFontFamily_Roboto, + RockyCanvasFontFamily_Roboto_subset, + RockyCanvasFontFamily_Droid_serif, + RockyCanvasFontFamily_Leco_numbers, + RockyCanvasFontFamily_Leco_numbers_am_pm, +} RockyCanvasFontFamily; + +// px [Weight] [Variant] +typedef struct +{ + RockyCanvasFontSize size; + RockyCanvasFontVariant weight; + RockyCanvasFontVariant variant; + RockyCanvasFontFamily family; +} RockyCanvasFont; + +bool rocky_font_parse(char* fontStr, RockyCanvasFont* outFont); + +typedef enum +{ + RockyCanvasPathPartType +} RockyCanvasPathPartType; + +typedef struct +{ + RockyCanvasPathPartType type; + union { + struct + { // Arc + int32_t x; + int32_t y; + int32_t radius; + float startAngle; + float endAngle; + }, + struct + { // Rectangle + int32_t x; + int32_t y; + int32_t width; + int32_t height; + }, + struct // Point (moveTo/lineTo) + { + int32_t x; + int32_t y; + } + }; +} RockyCanvasPathPart; + +typedef struct +{ + int32_t currentX; + int32_t currentY; + list_head parts; +} RockyCanvasPath; + +typedef struct +{ + RockyCanvasPath path; + +} RockyCanvasState; + +typedef struct +{ + RockyCanvasState current; + uint8_t top; + RockyCanvasState[8] saved; // Do people even use canvas save/restore? Either way, 8 states should be enough. +} RockyCanvasContext; \ No newline at end of file diff --git a/rwatch/js/rocky_js.c b/rwatch/js/rocky_js.c new file mode 100644 index 00000000..f9f82e0f --- /dev/null +++ b/rwatch/js/rocky_js.c @@ -0,0 +1,3 @@ +#include "rocky_jerry.h" + +void rocky_event_loop(); \ No newline at end of file diff --git a/rwatch/js/rocky_lib.c b/rwatch/js/rocky_lib.c new file mode 100644 index 00000000..e69de29b From 2e41ae8f6bf827e29f7932be98aa58735195208d Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Sat, 7 Mar 2020 12:25:55 +0100 Subject: [PATCH 04/10] WIP: Porting Jerrysript. Getting it to build --- AUTHORS | 1 + Makefile | 3 +- config.mk | 1 + hw/platform/snowy/config.mk | 27 ++++++++++++++ rcore/api_func_symbols.h | 2 +- rwatch/js/rocky_canvas.h | 24 ++++++------- rwatch/js/rocky_jerry.h | 9 +++-- rwatch/js/rocky_js.c | 13 ++++++- rwatch/js/rocky_port.c | 70 +++++++++++++++++++++++++++++++++++++ rwatch/js/rocky_port.h | 18 ++++++++++ rwatch/js/rocky_setjmp.c | 13 +++++++ 11 files changed, 160 insertions(+), 21 deletions(-) create mode 100644 rwatch/js/rocky_port.c create mode 100644 rwatch/js/rocky_port.h create mode 100644 rwatch/js/rocky_setjmp.c diff --git a/AUTHORS b/AUTHORS index 3451d06d..f6562dec 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,5 +3,6 @@ The RebbleOS Authors are: Barry Carter Joshua Wise NiVZ + Davit Markarian (UDXS) If you contribute code to RebbleOS, please add your name to this file. diff --git a/Makefile b/Makefile index 97c3577b..cc3e969e 100644 --- a/Makefile +++ b/Makefile @@ -237,6 +237,7 @@ $(BUILD)/version.c: $(QUIET)git shortlog -s | cut -c8- | sort -f | sed -e 's/\(.*\)/ "\1",/' >> $@ $(QUIET)echo " 0" >> $@ $(QUIET)echo "};" >> $@ + $(QUIET)$(PYTHON3) lib/jerryscript/tools/srcgenerator.py --output-dir $(BUILD)/jerryscript --jerry-libm --jerry-core .PHONY: $(BUILD)/version.c @@ -247,8 +248,6 @@ $(VIRTUALENV): Utilities/requirements.txt $(QUIET)$(PYTHON3) -m virtualenv $@ $(call SAY,PIP INSTALL $@) $(QUIET)$(VIRTUALENV)/bin/pip3 install -r $< - $(QUIET)$(VPYTHON3) libs/jerryscript/tools/srcgenerator.py --output-dir $(BUILD)/jerryscript - clean: rm -rf $(BUILD) diff --git a/config.mk b/config.mk index 793ed482..f0ebcd0a 100644 --- a/config.mk +++ b/config.mk @@ -153,6 +153,7 @@ SRCS_all += rwatch/ui/notifications/notification_window.c SRCS_all += rwatch/ui/notifications/battery_overlay.c SRCS_all += rwatch/ui/notifications/mini_message.c SRCS_all += rwatch/ui/vibes.c +SRCS_all += rwatch/js/rocky_js.c SRCS_all += Watchfaces/simple.c SRCS_all += Watchfaces/nivz.c diff --git a/hw/platform/snowy/config.mk b/hw/platform/snowy/config.mk index b58703fe..0ec08993 100644 --- a/hw/platform/snowy/config.mk +++ b/hw/platform/snowy/config.mk @@ -11,6 +11,33 @@ SRCS_snowy += hw/platform/snowy/snowy.c SRCS_snowy += hw/platform/snowy/snowy_bluetooth.c SRCS_snowy += Resources/snowy_fpga.bin +SRCS_snowy += build/jerryscript/jerryscript.c +SRCS_snowy += build/jerryscript/jerryscript-libm.c + +# Note: rocky_js.c is added to all platforms. +SRCS_snowy += rwatch/js/rocky_canvas.c +SRCS_snowy += rwatch/js/rocky_lib.c +SRCS_snowy += rwatch/js/rocky_setjmp.c +SRCS_snowy += rwatch/js/rocky_port.c + +CFLAGS_snowy += -Ilib/jerryscript/jerry-core +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/api +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/include +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/debugger +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/base +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/builtin-objects +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/builtin-objects/typedarray +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/operations +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/jcontext +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/jmem +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/jrt +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/lit +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/parser/js +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/parser/regexp +CFLAGS_snowy += -Ilib/jerryscript/jerry-core/vm +CFLAGS_snowy += -Ilib/jerryscript/jerry-libm +CFLAGS_snowy += -Ibuild/jerryscript + LDFLAGS_snowy = $(LDFLAGS_snowy_family) LIBS_snowy = $(LIBS_snowy_family) diff --git a/rcore/api_func_symbols.h b/rcore/api_func_symbols.h index 27f8bc30..972f1cae 100644 --- a/rcore/api_func_symbols.h +++ b/rcore/api_func_symbols.h @@ -3,7 +3,7 @@ #include "librebble.h" #include "graphics_wrapper.h" #include "battery_state_service.h" -#include "rockyjs.h" +#include "rocky_js.h" GBitmap *gbitmap_create_with_resource_proxy(uint32_t resource_id); bool persist_exists(void); diff --git a/rwatch/js/rocky_canvas.h b/rwatch/js/rocky_canvas.h index aab8b59f..c2128036 100644 --- a/rwatch/js/rocky_canvas.h +++ b/rwatch/js/rocky_canvas.h @@ -37,37 +37,33 @@ typedef struct RockyCanvasFontFamily family; } RockyCanvasFont; -bool rocky_font_parse(char* fontStr, RockyCanvasFont* outFont); +bool rocky_font_parse(char *fontStr, RockyCanvasFont *outFont); typedef enum { - RockyCanvasPathPartType + RockyCanvasPathPartType_Arc } RockyCanvasPathPartType; typedef struct { RockyCanvasPathPartType type; + int32_t x; + int32_t y; union { struct { // Arc - int32_t x; - int32_t y; int32_t radius; float startAngle; float endAngle; - }, - struct + }; + struct { // Rectangle - int32_t x; - int32_t y; int32_t width; int32_t height; - }, - struct // Point (moveTo/lineTo) + }; + struct // Point (moveTo/lineTo) { - int32_t x; - int32_t y; - } + }; }; } RockyCanvasPathPart; @@ -88,5 +84,5 @@ typedef struct { RockyCanvasState current; uint8_t top; - RockyCanvasState[8] saved; // Do people even use canvas save/restore? Either way, 8 states should be enough. + RockyCanvasState saved[8]; // Do people even use canvas save/restore? Either way, 8 states should be enough. } RockyCanvasContext; \ No newline at end of file diff --git a/rwatch/js/rocky_jerry.h b/rwatch/js/rocky_jerry.h index 60d741ff..781d524f 100644 --- a/rwatch/js/rocky_jerry.h +++ b/rwatch/js/rocky_jerry.h @@ -10,15 +10,13 @@ * Author: Davit Markarian */ -#include "jerryscript-config.h" - // RebbleOS provides allocation functions. #define JERRY_SYSTEM_ALLOCATOR 1 // System Allocation requires using full 32-bit pointers. # define JERRY_CPOINTER_32_BIT 0 // RebbleOS works with soft-floats. In the interest of speed, JerryScript is told to use less precise 32-bit floats. -# define JERRY_NUMBER_TYPE_FLOAT64 0 +// # define JERRY_NUMBER_TYPE_FLOAT64 0 // Rocky.js runs precompiled bytecode, rather than raw JS source. # define JERRY_SNAPSHOT_EXEC 1 @@ -28,7 +26,12 @@ // Needed to periodically handle events. # define JERRY_VM_EXEC_STOP 1 +# define JERRY_ES2015 0 + // TODO: Evaluate the need for certain features and builtins, removing as necessary. // TODO: Tune heap/stack/GC limits for better performance. +#include "jerryscript-config.h" + +#include "rocky_port.h" #include "jerryscript.h" \ No newline at end of file diff --git a/rwatch/js/rocky_js.c b/rwatch/js/rocky_js.c index f9f82e0f..6f2d9e34 100644 --- a/rwatch/js/rocky_js.c +++ b/rwatch/js/rocky_js.c @@ -1,3 +1,14 @@ +#include "rebbleos.h" +#include "rocky_js.h" + +#if defined(REBBLE_PLATFORM_SNOWY) || defined(REBBLE_PLATFORM_SNOWY) #include "rocky_jerry.h" +void rocky_event_loop_with_resource(uint32_t resource_id) { -void rocky_event_loop(); \ No newline at end of file +} +#else +void rocky_event_loop_with_resource(uint32_t resource_id) { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Attempted to execute Rocky.js with resource %u. Rocky is not available on this platform. Exiting.", resource_id); + return; +} +#endif \ No newline at end of file diff --git a/rwatch/js/rocky_port.c b/rwatch/js/rocky_port.c new file mode 100644 index 00000000..281e4faa --- /dev/null +++ b/rwatch/js/rocky_port.c @@ -0,0 +1,70 @@ +#include "rebbleos.h" +#include "rocky_port.h" + +void jerry_port_fatal(jerry_fatal_code_t code) +{ + SYS_LOG("rocky", APP_LOG_LEVEL_ERROR, "VM Fatal Error Code %d", code); +} + +void jerry_port_log(jerry_log_level_t level, const char *fmt, ...) +{ + LogLevel rLevel; + switch (level) + { + case JERRY_LOG_LEVEL_ERROR: + rLevel = APP_LOG_LEVEL_ERROR; + break; + case JERRY_LOG_LEVEL_WARNING: + rLevel = APP_LOG_LEVEL_WARNING; + break; + case JERRY_LOG_LEVEL_DEBUG: + rLevel = APP_LOG_LEVEL_DEBUG; + break; + case JERRY_LOG_LEVEL_TRACE: + rLevel = APP_LOG_LEVEL_DEBUG_VERBOSE; + break; + default: + rLevel = APP_LOG_LEVEL_INFO; + } + + SYS_LOG("rocky", rLevel, "JerryScript log with level %d. NOTE: Logging unavailable", level); +} +void jerry_port_print_char(char c) +{ + SYS_LOG("rocky", APP_LOG_LEVEL_INFO, "JerryScript char: %c", c); +} + +uint8_t *jerry_port_read_source(const char *file_name_p, size_t *out_size_p) +{ + return NULL; +} +void jerry_port_release_source(uint8_t *buffer_p) +{ + free(buffer_p); +} +size_t jerry_port_normalize_path(const char *in_path_p, char *out_buf_p, size_t out_buf_size, char *base_file_p) +{ + return 0; +} +jerry_value_t jerry_port_get_native_module(jerry_value_t name){ + return jerry_create_undefined(); +} + +double jerry_port_get_local_time_zone_adjustment(double unix_ms, bool is_utc) +{ + return 0; +} +double jerry_port_get_current_time() +{ + return 0; +} + +struct jerry_context_t *jerry_port_get_current_context() +{ + return NULL; +} + +void jerry_port_sleep(uint32_t sleep_time) +{ + APP_LOG("rocky", APP_LOG_LEVEL_WARNING, "Sleep not available"); +} \ No newline at end of file diff --git a/rwatch/js/rocky_port.h b/rwatch/js/rocky_port.h new file mode 100644 index 00000000..aeef1959 --- /dev/null +++ b/rwatch/js/rocky_port.h @@ -0,0 +1,18 @@ +#include "jerryscript-port.h" + +void jerry_port_fatal(jerry_fatal_code_t code); + +void jerry_port_log(jerry_log_level_t level, const char *fmt, ...); +void jerry_port_print_char(char c); + +uint8_t *jerry_port_read_source(const char *file_name_p, size_t *out_size_p); +void jerry_port_release_source(uint8_t *buffer_p); +size_t jerry_port_normalize_path(const char *in_path_p, char *out_buf_p, size_t out_buf_size, char *base_file_p); +jerry_value_t jerry_port_get_native_module(jerry_value_t name); + +double jerry_port_get_local_time_zone_adjustment(double unix_ms, bool is_utc); +double jerry_port_get_current_time(); + +struct jerry_context_t *jerry_port_get_current_context(); + +void jerry_port_sleep(uint32_t sleep_time); diff --git a/rwatch/js/rocky_setjmp.c b/rwatch/js/rocky_setjmp.c new file mode 100644 index 00000000..ef436bbf --- /dev/null +++ b/rwatch/js/rocky_setjmp.c @@ -0,0 +1,13 @@ +#include +#include + +int setjmp(jmp_buf env) +{ + KERN_LOG("rocky", APP_LOG_LEVEL_ERROR, "Called setjmp. This should not be possible. Expect instability."); + return 0; +} + +void longjmp(jmp_buf env, int val) +{ + KERN_LOG("rocky", APP_LOG_LEVEL_ERROR, "Called longjmp. This should not be possible. Definitely unstable."); +} \ No newline at end of file From f9fd44a00d7c0f069ba59c88f61c7ca853d8952e Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Sat, 7 Mar 2020 16:59:50 +0100 Subject: [PATCH 05/10] Removed submodule lib/jerryscript --- .gitmodules | 2 +- lib/jerryscript | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 160000 lib/jerryscript diff --git a/.gitmodules b/.gitmodules index ac8bef09..7a13c5dc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,4 +12,4 @@ url = ../../pebble-dev/libpebble2 [submodule "lib/jerryscript"] path = lib/jerryscript - url = https://github.com/pebble/jerryscript.git + url = https://github.com/jerryscript-project/jerryscript.git diff --git a/lib/jerryscript b/lib/jerryscript deleted file mode 160000 index 76bbb088..00000000 --- a/lib/jerryscript +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 76bbb088e91d36ee19349b06127eb0cbd5eea94f From fb1ae099fb9c441dde8a2a15d14e40788edbfa5e Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Sat, 7 Mar 2020 19:07:51 +0100 Subject: [PATCH 06/10] Semi-working App Loading --- Makefile | 1 + hw/platform/snowy/config.mk | 4 +- lib/jerryscript | 1 + rcore/appmanager.h | 2 + rwatch/js/jerryscript-config.h | 690 ++++++++++++++++++++ rwatch/js/rocky_canvas.h | 11 + rwatch/js/{rocky_jerry.h => rocky_config.h} | 18 +- rwatch/js/rocky_js.c | 93 ++- rwatch/js/rocky_js.h | 1 - rwatch/js/rocky_port.c | 16 +- rwatch/js/rocky_port.h | 11 + 11 files changed, 823 insertions(+), 25 deletions(-) create mode 160000 lib/jerryscript create mode 100644 rwatch/js/jerryscript-config.h rename rwatch/js/{rocky_jerry.h => rocky_config.h} (58%) diff --git a/Makefile b/Makefile index cc3e969e..c65878f8 100644 --- a/Makefile +++ b/Makefile @@ -238,6 +238,7 @@ $(BUILD)/version.c: $(QUIET)echo " 0" >> $@ $(QUIET)echo "};" >> $@ $(QUIET)$(PYTHON3) lib/jerryscript/tools/srcgenerator.py --output-dir $(BUILD)/jerryscript --jerry-libm --jerry-core + $(QUIET)rm build/jerryscript/jerryscript-config.h .PHONY: $(BUILD)/version.c diff --git a/hw/platform/snowy/config.mk b/hw/platform/snowy/config.mk index 0ec08993..6aed4f8c 100644 --- a/hw/platform/snowy/config.mk +++ b/hw/platform/snowy/config.mk @@ -11,10 +11,10 @@ SRCS_snowy += hw/platform/snowy/snowy.c SRCS_snowy += hw/platform/snowy/snowy_bluetooth.c SRCS_snowy += Resources/snowy_fpga.bin -SRCS_snowy += build/jerryscript/jerryscript.c -SRCS_snowy += build/jerryscript/jerryscript-libm.c # Note: rocky_js.c is added to all platforms. +SRCS_snowy += build/jerryscript/jerryscript.c +SRCS_snowy += build/jerryscript/jerryscript-libm.c SRCS_snowy += rwatch/js/rocky_canvas.c SRCS_snowy += rwatch/js/rocky_lib.c SRCS_snowy += rwatch/js/rocky_setjmp.c diff --git a/lib/jerryscript b/lib/jerryscript new file mode 160000 index 00000000..6c3a42ec --- /dev/null +++ b/lib/jerryscript @@ -0,0 +1 @@ +Subproject commit 6c3a42ec4802712d5182281d437b96cec7e1b49d diff --git a/rcore/appmanager.h b/rcore/appmanager.h index c129e304..55ebe1f6 100644 --- a/rcore/appmanager.h +++ b/rcore/appmanager.h @@ -16,6 +16,7 @@ #include "node_list.h" #include #include "uuid.h" +#include "jerryscript.h" // TODO Make this dynamic. hacky #define NUM_APPS 3 @@ -148,6 +149,7 @@ typedef struct app_running_thread_t { struct CoreTimer *timer_head; qarena_t *arena; struct n_GContext *graphics_context; + jerry_context_t *js_context; } app_running_thread; /* in appmanager.c */ diff --git a/rwatch/js/jerryscript-config.h b/rwatch/js/jerryscript-config.h new file mode 100644 index 00000000..4234c882 --- /dev/null +++ b/rwatch/js/jerryscript-config.h @@ -0,0 +1,690 @@ +// THIS FILE CAME FROM JERRYSCRIPT BUILD. DO NOT EDIT. TO CHANGE CONFIG, EDIT rocky_config.h +#include "rocky_config.h" + +/* 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 JERRYSCRIPT_CONFIG_H +#define JERRYSCRIPT_CONFIG_H + +// @JERRY_BUILD_CFG@ + +/** + * Built-in configurations + * + * Allowed values for built-in defines: + * 0: Disable the given built-in. + * 1: Enable the given built-in. + */ +/* + * By default all built-ins are enabled if they are not defined. + */ +#ifndef JERRY_BUILTINS +# define JERRY_BUILTINS 1 +#endif /* !defined (JERRY_BUILTINS) */ + +#ifndef JERRY_BUILTIN_ANNEXB +# define JERRY_BUILTIN_ANNEXB JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_ANNEXB) */ + +#ifndef JERRY_BUILTIN_ARRAY +# define JERRY_BUILTIN_ARRAY JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_ARRAY) */ + +#ifndef JERRY_BUILTIN_DATE +# define JERRY_BUILTIN_DATE JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_DATE) */ + +#ifndef JERRY_BUILTIN_ERRORS +# define JERRY_BUILTIN_ERRORS JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_ERRORS) */ + +#ifndef JERRY_BUILTIN_BOOLEAN +# define JERRY_BUILTIN_BOOLEAN JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_BOOLEAN) */ + +#ifndef JERRY_BUILTIN_JSON +# define JERRY_BUILTIN_JSON JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_JSON) */ + +#ifndef JERRY_BUILTIN_MATH +# define JERRY_BUILTIN_MATH JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_MATH) */ + +#ifndef JERRY_BUILTIN_NUMBER +# define JERRY_BUILTIN_NUMBER JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_NUMBER) */ + +#ifndef JERRY_BUILTIN_REGEXP +# define JERRY_BUILTIN_REGEXP JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_REGEXP) */ + +#ifndef JERRY_BUILTIN_STRING +# define JERRY_BUILTIN_STRING JERRY_BUILTINS +#endif /* !defined (JERRY_BUILTIN_STRING) */ + +/** + * ES2015 (a.k.a es6) related features, by default all of them are enabled. + */ +#ifndef JERRY_ES2015 +# define JERRY_ES2015 1 +#endif /* !defined (JERRY_ES2015) */ + +#ifndef JERRY_ES2015_BUILTIN_DATAVIEW +# define JERRY_ES2015_BUILTIN_DATAVIEW JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_DATAVIEW) */ + +#ifndef JERRY_ES2015_BUILTIN_MAP +# define JERRY_ES2015_BUILTIN_MAP JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_MAP) */ + +#ifndef JERRY_ES2015_BUILTIN_SET +# define JERRY_ES2015_BUILTIN_SET JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_SET) */ + +#ifndef JERRY_ES2015_BUILTIN_WEAKMAP +# define JERRY_ES2015_BUILTIN_WEAKMAP JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_WEAKMAP) */ + +#ifndef JERRY_ES2015_BUILTIN_WEAKSET +# define JERRY_ES2015_BUILTIN_WEAKSET JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_WEAKSET) */ + +#ifndef JERRY_ES2015_BUILTIN_PROMISE +# define JERRY_ES2015_BUILTIN_PROMISE JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_PROMISE) */ + +#ifndef JERRY_ES2015_BUILTIN_PROXY +# define JERRY_ES2015_BUILTIN_PROXY JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_PROXY) */ + +#ifndef JERRY_ES2015_BUILTIN_REFLECT +# define JERRY_ES2015_BUILTIN_REFLECT JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_REFLECT) */ + +#ifndef JERRY_ES2015_BUILTIN_TYPEDARRAY +# define JERRY_ES2015_BUILTIN_TYPEDARRAY JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_BUILTIN_TYPEDARRAY) */ + +#ifndef JERRY_ES2015_MODULE_SYSTEM +# define JERRY_ES2015_MODULE_SYSTEM JERRY_ES2015 +#endif /* !defined (JERRY_ES2015_MODULE_SYSTEM) */ + +/** + * Engine internal and misc configurations. + */ + +/** + * Specifies the compressed pointer representation + * + * Allowed values: + * 0: use 16 bit representation + * 1: use 32 bit representation + * + * Default value: 0 + * For more details see: jmem/jmem.h + */ +#ifndef JERRY_CPOINTER_32_BIT +# define JERRY_CPOINTER_32_BIT 0 +#endif /* !defined (JERRY_CPOINTER_32_BIT) */ + +/** + * Enable/Disable the engine's JavaScript debugger interface + * + * Allowed values: + * 0: Disable the debugger parts. + * 1: Enable the debugger. + */ +#ifndef JERRY_DEBUGGER +# define JERRY_DEBUGGER 0 +#endif /* !defined (JERRY_DEBUGGER) */ + +/** + * Enable/Disable built-in error messages for error objects. + * + * Allowed values: + * 0: Disable error messages. + * 1: Enable error message. + * + * Default value: 0 + */ +#ifndef JERRY_ERROR_MESSAGES +# define JERRY_ERROR_MESSAGES 0 +#endif /* !defined (JERRY_ERROR_MESSAGES) */ + +/** + * Enable/Disable external context. + * + * Allowed values: + * 0: Disable external context. + * 1: Enable external context support. + * + * Default value: 0 + */ +#ifndef JERRY_EXTERNAL_CONTEXT +# define JERRY_EXTERNAL_CONTEXT 0 +#endif /* !defined (JERRY_EXTERNAL_CONTEXT) */ + +/** + * Maximum size of heap in kilobytes + * + * Default value: 512 KiB + */ +#ifndef JERRY_GLOBAL_HEAP_SIZE +# define JERRY_GLOBAL_HEAP_SIZE (512) +#endif /* !defined (JERRY_GLOBAL_HEAP_SIZE) */ + +/** + * The allowed heap usage limit until next garbage collection, in bytes. + * + * If value is 0, the default is 1/32 of JERRY_HEAP_SIZE + */ +#ifndef JERRY_GC_LIMIT +# define JERRY_GC_LIMIT 0 +#endif /* !defined (JERRY_GC_LIMIT) */ + +/** + * Maximum stack usage size in kilobytes + * + * Note: This feature cannot be used when 'detect_stack_use_after_return=1' ASAN option is enabled. + * For more detailed description: + * - https://github.com/google/sanitizers/wiki/AddressSanitizerUseAfterReturn#compatibility + * + * Default value: 0, unlimited + */ +#ifndef JERRY_STACK_LIMIT +# define JERRY_STACK_LIMIT (0) +#endif /* !defined (JERRY_STACK_LIMIT) */ + +/** + * Maximum depth of recursion during GC mark phase + * + * Default value: 8 + */ +#ifndef JERRY_GC_MARK_LIMIT +# define JERRY_GC_MARK_LIMIT (8) +#endif /* !defined (JERRY_GC_MARK_LIMIT) */ + +/** + * Enable/Disable property lookup cache. + * + * Allowed values: + * 0: Disable lookup cache. + * 1: Enable lookup cache. + * + * Default value: 1 + */ +#ifndef JERRY_LCACHE +# define JERRY_LCACHE 1 +#endif /* !defined (JERRY_LCACHE) */ + +/** + * Enable/Disable line-info management inside the engine. + * + * Allowed values: + * 0: Disable line-info in the engine. + * 1: Enable line-info management. + * + * Default value: 0 + */ +#ifndef JERRY_LINE_INFO +# define JERRY_LINE_INFO 0 +#endif /* !defined (JERRY_LINE_INFO) */ + +/** + * Enable/Disable logging inside the engine. + * + * Allowed values: + * 0: Disable internal logging. + * 1: Enable internal logging. + * + * Default value: 0 + */ +#ifndef JERRY_LOGGING +# define JERRY_LOGGING 0 +#endif /* !defined (JERRY_LOGGING) */ + +/** + * Enable/Disable gc call before every allocation. + * + * Allowed values: + * 0: Disable gc call before each allocation. + * 1: Enable and force gc call before each allocation. + * + * Default value: 0 + * Warning!: This is an advanced option and will slow down the engine! + * Only enable it for debugging purposes. + */ +#ifndef JERRY_MEM_GC_BEFORE_EACH_ALLOC +# define JERRY_MEM_GC_BEFORE_EACH_ALLOC 0 +#endif /* !defined (JERRY_MEM_GC_BEFORE_EACH_ALLOC) */ + +/** + * Enable/Disable the collection if run-time memory statistics. + * + * Allowed values: + * 0: Disable run-time memory information collection. + * 1: Enable run-time memory statistics collection. + * + * Default value: 0 + */ +#ifndef JERRY_MEM_STATS +# define JERRY_MEM_STATS 0 +#endif /* !defined (JERRY_MEM_STATS) */ + +/** + * Use 32-bit/64-bit float for ecma-numbers + * This option is for expert use only! + * + * Allowed values: + * 1: use 64-bit floating point number mode + * 0: use 32-bit floating point number mode + * + * Default value: 1 + */ +#ifndef JERRY_NUMBER_TYPE_FLOAT64 +# define JERRY_NUMBER_TYPE_FLOAT64 1 +#endif /* !defined (JERRY_NUMBER_TYPE_FLOAT64 */ + +/** + * Enable/Disable the JavaScript parser. + * + * Allowed values: + * 0: Disable the JavaScript parser and all related functionallity. + * 1: Enable the JavaScript parser. + * + * Default value: 1 + */ +#ifndef JERRY_PARSER +# define JERRY_PARSER 1 +#endif /* !defined (JERRY_PARSER) */ + +/** + * Enable/Disable JerryScript byte code dump functions during parsing. + * To dump the JerryScript byte code the engine must be initialized with opcodes + * display flag. This option does not influence RegExp byte code dumps. + * + * Allowed values: + * 0: Disable all bytecode dump functions. + * 1: Enable bytecode dump functions. + * + * Default value: 0 + */ +#ifndef JERRY_PARSER_DUMP_BYTE_CODE +# define JERRY_PARSER_DUMP_BYTE_CODE 0 +#endif /* defined (JERRY_PARSER_DUMP_BYTE_CODE) */ + +/** + * Enable/Disable ECMA property hashmap. + * + * Allowed values: + * 0: Disable property hasmap. + * 1: Enable property hashmap. + * + * Default value: 1 + */ +#ifndef JERRY_PROPRETY_HASHMAP +# define JERRY_PROPRETY_HASHMAP 1 +#endif /* !defined (JERRY_PROPRETY_HASHMAP) */ + +/** + * Enable/Disable byte code dump functions for RegExp objects. + * To dump the RegExp byte code the engine must be initialized with + * regexp opcodes display flag. This option does not influence the + * JerryScript byte code dumps. + * + * Allowed values: + * 0: Disable all bytecode dump functions. + * 1: Enable bytecode dump functions. + * + * Default value: 0 + */ +#ifndef JERRY_REGEXP_DUMP_BYTE_CODE +# define JERRY_REGEXP_DUMP_BYTE_CODE 0 +#endif /* !defined (JERRY_REGEXP_DUMP_BYTE_CODE) */ + +/** + * Enables/disables the RegExp strict mode + * + * Default value: 0 + */ +#ifndef JERRY_REGEXP_STRICT_MODE +# define JERRY_REGEXP_STRICT_MODE 0 +#endif /* !defined (JERRY_REGEXP_STRICT_MODE) */ + +/** + * Enable/Disable the snapshot execution functions. + * + * Allowed values: + * 0: Disable snapshot execution. + * 1: Enable snapshot execution. + * + * Default value: 0 + */ +#ifndef JERRY_SNAPSHOT_EXEC +# define JERRY_SNAPSHOT_EXEC 0 +#endif /* !defined (JERRY_SNAPSHOT_EXEC) */ + +/** + * Enable/Disable the snapshot save functions. + * + * Allowed values: + * 0: Disable snapshot save functions. + * 1: Enable snapshot save functions. + */ +#ifndef JERRY_SNAPSHOT_SAVE +# define JERRY_SNAPSHOT_SAVE 0 +#endif /* !defined (JERRY_SNAPSHOT_SAVE) */ + +/** + * Enable/Disable usage of system allocator. + * + * Allowed values: + * 0: Disable usage of system allocator. + * 1: Enable usage of system allocator. + * + * Default value: 0 + */ +#ifndef JERRY_SYSTEM_ALLOCATOR +# define JERRY_SYSTEM_ALLOCATOR 0 +#endif /* !defined (JERRY_SYSTEM_ALLOCATOR) */ + +/** + * Enables/disables the unicode case conversion in the engine. + * By default Unicode case conversion is enabled. + */ +#ifndef JERRY_UNICODE_CASE_CONVERSION +# define JERRY_UNICODE_CASE_CONVERSION 1 +#endif /* !defined (JERRY_UNICODE_CASE_CONVERSION) */ + +/** + * Configures if the internal memory allocations are exposed to Valgrind or not. + * + * Allowed values: + * 0: Disable the Valgrind specific memory allocation notifications. + * 1: Enable the Valgrind specific allocation notifications. + */ +#ifndef JERRY_VALGRIND +# define JERRY_VALGRIND 0 +#endif /* !defined (JERRY_VALGRIND) */ + +/** + * Enable/Disable the vm execution stop callback function. + * + * Allowed values: + * 0: Disable vm exec stop callbacks. + * 1: Enable vm exec stop callback functionality. + */ +#ifndef JERRY_VM_EXEC_STOP +# define JERRY_VM_EXEC_STOP 0 +#endif /* !defined (JERRY_VM_EXEC_STOP) */ + +/** + * Advanced section configurations. + */ + +/** + * Allow configuring attributes on a few constant data inside the engine. + * + * One of the main usages: + * Normally compilers store const(ant)s in ROM. Thus saving RAM. + * But if your compiler does not support it then the directive below can force it. + * + * For the moment it is mainly meant for the following targets: + * - ESP8266 + * + * Example configuration for moving (some) constatns into a given section: + * # define JERRY_ATTR_CONST_DATA __attribute__((section(".rodata.const"))) + */ +#ifndef JERRY_ATTR_CONST_DATA +# define JERRY_ATTR_CONST_DATA +#endif /* !defined (JERRY_ATTR_CONST_DATA) */ + +/** + * The JERRY_ATTR_GLOBAL_HEAP allows adding extra attributes for the Jerry global heap. + * + * Example on how to move the global heap into it's own section: + * #define JERRY_ATTR_GLOBAL_HEAP __attribute__((section(".text.globalheap"))) + */ +#ifndef JERRY_ATTR_GLOBAL_HEAP +# define JERRY_ATTR_GLOBAL_HEAP +#endif /* !defined (JERRY_ATTR_GLOBAL_HEAP) */ + +/** + * Sanity check for macros to see if the values are 0 or 1 + * + * If a new feature is added this should be updated. + */ +/** + * Check base builtins. + */ +#if !defined (JERRY_BUILTIN_ANNEXB) \ +|| ((JERRY_BUILTIN_ANNEXB != 0) && (JERRY_BUILTIN_ANNEXB != 1)) +# error "Invalid value for JERRY_BUILTIN_ANNEXB macro." +#endif +#if !defined (JERRY_BUILTIN_ARRAY) \ +|| ((JERRY_BUILTIN_ARRAY != 0) && (JERRY_BUILTIN_ARRAY != 1)) +# error "Invalid value for JERRY_BUILTIN_ARRAY macro." +#endif +#if !defined (JERRY_BUILTIN_BOOLEAN) \ +|| ((JERRY_BUILTIN_BOOLEAN != 0) && (JERRY_BUILTIN_BOOLEAN != 1)) +# error "Invalid value for JERRY_BUILTIN_BOOLEAN macro." +#endif +#if !defined (JERRY_BUILTIN_DATE) \ +|| ((JERRY_BUILTIN_DATE != 0) && (JERRY_BUILTIN_DATE != 1)) +# error "Invalid value for JERRY_BUILTIN_DATE macro." +#endif +#if !defined (JERRY_BUILTIN_ERRORS) \ +|| ((JERRY_BUILTIN_ERRORS != 0) && (JERRY_BUILTIN_ERRORS != 1)) +# error "Invalid value for JERRY_BUILTIN_ERRORS macro." +#endif +#if !defined (JERRY_BUILTIN_JSON) \ +|| ((JERRY_BUILTIN_JSON != 0) && (JERRY_BUILTIN_JSON != 1)) +# error "Invalid value for JERRY_BUILTIN_JSON macro." +#endif +#if !defined (JERRY_BUILTIN_MATH) \ +|| ((JERRY_BUILTIN_MATH != 0) && (JERRY_BUILTIN_MATH != 1)) +# error "Invalid value for JERRY_BUILTIN_MATH macro." +#endif +#if !defined (JERRY_BUILTIN_NUMBER) \ +|| ((JERRY_BUILTIN_NUMBER != 0) && (JERRY_BUILTIN_NUMBER != 1)) +# error "Invalid value for JERRY_BUILTIN_NUMBER macro." +#endif +#if !defined (JERRY_BUILTIN_REGEXP) \ +|| ((JERRY_BUILTIN_REGEXP != 0) && (JERRY_BUILTIN_REGEXP != 1)) +# error "Invalid value for JERRY_BUILTIN_REGEXP macro." +#endif +#if !defined (JERRY_BUILTIN_STRING) \ +|| ((JERRY_BUILTIN_STRING != 0) && (JERRY_BUILTIN_STRING != 1)) +# error "Invalid value for JERRY_BUILTIN_STRING macro." +#endif +#if !defined (JERRY_BUILTINS) \ +|| ((JERRY_BUILTINS != 0) && (JERRY_BUILTINS != 1)) +# error "Invalid value for JERRY_BUILTINS macro." +#endif + +/** + * Check ES2015 features + */ +#if !defined (JERRY_ES2015) \ +|| ((JERRY_ES2015 != 0) && (JERRY_ES2015 != 1)) +# error "Invalid value for JERRY_ES2015 macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_DATAVIEW) \ +|| ((JERRY_ES2015_BUILTIN_DATAVIEW != 0) && (JERRY_ES2015_BUILTIN_DATAVIEW != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_DATAVIEW macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_MAP) \ +|| ((JERRY_ES2015_BUILTIN_MAP != 0) && (JERRY_ES2015_BUILTIN_MAP != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_MAP macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_REFLECT) \ +|| ((JERRY_ES2015_BUILTIN_REFLECT != 0) && (JERRY_ES2015_BUILTIN_REFLECT != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_REFLECT macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_SET) \ +|| ((JERRY_ES2015_BUILTIN_SET != 0) && (JERRY_ES2015_BUILTIN_SET != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_SET macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_WEAKMAP) \ +|| ((JERRY_ES2015_BUILTIN_WEAKMAP != 0) && (JERRY_ES2015_BUILTIN_WEAKMAP != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_WEAKMAP macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_WEAKSET) \ +|| ((JERRY_ES2015_BUILTIN_WEAKSET != 0) && (JERRY_ES2015_BUILTIN_WEAKSET != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_WEAKSET macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_PROMISE) \ +|| ((JERRY_ES2015_BUILTIN_PROMISE != 0) && (JERRY_ES2015_BUILTIN_PROMISE != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_PROMISE macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_PROXY) \ +|| ((JERRY_ES2015_BUILTIN_PROXY != 0) && (JERRY_ES2015_BUILTIN_PROXY != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_PROXY macro." +#endif +#if !defined (JERRY_ES2015_BUILTIN_TYPEDARRAY) \ +|| ((JERRY_ES2015_BUILTIN_TYPEDARRAY != 0) && (JERRY_ES2015_BUILTIN_TYPEDARRAY != 1)) +# error "Invalid value for JERRY_ES2015_BUILTIN_TYPEDARRAY macro." +#endif +#if !defined (JERRY_ES2015_MODULE_SYSTEM) \ +|| ((JERRY_ES2015_MODULE_SYSTEM != 0) && (JERRY_ES2015_MODULE_SYSTEM != 1)) +# error "Invalid value for JERRY_ES2015_MODULE_SYSTEM macro." +#endif + +/** + * Internal options. + */ +#if !defined (JERRY_CPOINTER_32_BIT) \ +|| ((JERRY_CPOINTER_32_BIT != 0) && (JERRY_CPOINTER_32_BIT != 1)) +# error "Invalid value for 'JERRY_CPOINTER_32_BIT' macro." +#endif +#if !defined (JERRY_DEBUGGER) \ +|| ((JERRY_DEBUGGER != 0) && (JERRY_DEBUGGER != 1)) +# error "Invalid value for 'JERRY_DEBUGGER' macro." +#endif +#if !defined (JERRY_ERROR_MESSAGES) \ +|| ((JERRY_ERROR_MESSAGES != 0) && (JERRY_ERROR_MESSAGES != 1)) +# error "Invalid value for 'JERRY_ERROR_MESSAGES' macro." +#endif +#if !defined (JERRY_EXTERNAL_CONTEXT) \ +|| ((JERRY_EXTERNAL_CONTEXT != 0) && (JERRY_EXTERNAL_CONTEXT != 1)) +# error "Invalid value for 'JERRY_EXTERNAL_CONTEXT' macro." +#endif +#if !defined (JERRY_GLOBAL_HEAP_SIZE) || (JERRY_GLOBAL_HEAP_SIZE <= 0) +# error "Invalid value for 'JERRY_GLOBAL_HEAP_SIZE' macro." +#endif +#if !defined (JERRY_GC_LIMIT) || (JERRY_GC_LIMIT < 0) +# error "Invalid value for 'JERRY_GC_LIMIT' macro." +#endif +#if !defined (JERRY_STACK_LIMIT) || (JERRY_STACK_LIMIT < 0) +# error "Invalid value for 'JERRY_STACK_LIMIT' macro." +#endif +#if !defined (JERRY_GC_MARK_LIMIT) || (JERRY_GC_MARK_LIMIT < 0) +# error "Invalid value for 'JERRY_GC_MARK_LIMIT' macro." +#endif +#if !defined (JERRY_LCACHE) \ +|| ((JERRY_LCACHE != 0) && (JERRY_LCACHE != 1)) +# error "Invalid value for 'JERRY_LCACHE' macro." +#endif +#if !defined (JERRY_LINE_INFO) \ +|| ((JERRY_LINE_INFO != 0) && (JERRY_LINE_INFO != 1)) +# error "Invalid value for 'JERRY_LINE_INFO' macro." +#endif +#if !defined (JERRY_LOGGING) \ +|| ((JERRY_LOGGING != 0) && (JERRY_LOGGING != 1)) +# error "Invalid value for 'JERRY_LOGGING' macro." +#endif +#if !defined (JERRY_MEM_GC_BEFORE_EACH_ALLOC) \ +|| ((JERRY_MEM_GC_BEFORE_EACH_ALLOC != 0) && (JERRY_MEM_GC_BEFORE_EACH_ALLOC != 1)) +# error "Invalid value for 'JERRY_MEM_GC_BEFORE_EACH_ALLOC' macro." +#endif +#if !defined (JERRY_MEM_STATS) \ +|| ((JERRY_MEM_STATS != 0) && (JERRY_MEM_STATS != 1)) +# error "Invalid value for 'JERRY_MEM_STATS' macro." +#endif +#if !defined (JERRY_NUMBER_TYPE_FLOAT64) \ +|| ((JERRY_NUMBER_TYPE_FLOAT64 != 0) && (JERRY_NUMBER_TYPE_FLOAT64 != 1)) +# error "Invalid value for 'JERRY_NUMBER_TYPE_FLOAT64' macro." +#endif +#if !defined (JERRY_PARSER) \ +|| ((JERRY_PARSER != 0) && (JERRY_PARSER != 1)) +# error "Invalid value for 'JERRY_PARSER' macro." +#endif +#if !defined (JERRY_PARSER_DUMP_BYTE_CODE) \ +|| ((JERRY_PARSER_DUMP_BYTE_CODE != 0) && (JERRY_PARSER_DUMP_BYTE_CODE != 1)) +# error "Invalid value for 'JERRY_PARSER_DUMP_BYTE_CODE' macro." +#endif +#if !defined (JERRY_PROPRETY_HASHMAP) \ +|| ((JERRY_PROPRETY_HASHMAP != 0) && (JERRY_PROPRETY_HASHMAP != 1)) +# error "Invalid value for 'JERRY_PROPRETY_HASHMAP' macro." +#endif +#if !defined (JERRY_REGEXP_DUMP_BYTE_CODE) \ +|| ((JERRY_REGEXP_DUMP_BYTE_CODE != 0) && (JERRY_REGEXP_DUMP_BYTE_CODE != 1)) +# error "Invalid value for 'JERRY_REGEXP_DUMP_BYTE_CODE' macro." +#endif +#if !defined (JERRY_REGEXP_STRICT_MODE) \ +|| ((JERRY_REGEXP_STRICT_MODE != 0) && (JERRY_REGEXP_STRICT_MODE != 1)) +# error "Invalid value for 'JERRY_REGEXP_STRICT_MODE' macro." +#endif +#if !defined (JERRY_SNAPSHOT_EXEC) \ +|| ((JERRY_SNAPSHOT_EXEC != 0) && (JERRY_SNAPSHOT_EXEC != 1)) +# error "Invalid value for 'JERRY_SNAPSHOT_EXEC' macro." +#endif +#if !defined (JERRY_SNAPSHOT_SAVE) \ +|| ((JERRY_SNAPSHOT_SAVE != 0) && (JERRY_SNAPSHOT_SAVE != 1)) +# error "Invalid value for 'JERRY_SNAPSHOT_SAVE' macro." +#endif +#if !defined (JERRY_SYSTEM_ALLOCATOR) \ +|| ((JERRY_SYSTEM_ALLOCATOR != 0) && (JERRY_SYSTEM_ALLOCATOR != 1)) +# error "Invalid value for 'JERRY_SYSTEM_ALLOCATOR' macro." +#endif +#if !defined (JERRY_UNICODE_CASE_CONVERSION) \ +|| ((JERRY_UNICODE_CASE_CONVERSION != 0) && (JERRY_UNICODE_CASE_CONVERSION != 1)) +# error "Invalid value for 'JERRY_UNICODE_CASE_CONVERSION' macro." +#endif +#if !defined (JERRY_VALGRIND) \ +|| ((JERRY_VALGRIND != 0) && (JERRY_VALGRIND != 1)) +# error "Invalid value for 'JERRY_VALGRIND' macro." +#endif +#if !defined (JERRY_VM_EXEC_STOP) \ +|| ((JERRY_VM_EXEC_STOP != 0) && (JERRY_VM_EXEC_STOP != 1)) +# error "Invalid value for 'JERRY_VM_EXEC_STOP' macro." +#endif + +#define ENABLED(FEATURE) ((FEATURE) == 1) +#define DISABLED(FEATURE) ((FEATURE) != 1) + +/** + * Cross component requirements check. + */ +/** + * The date module can only use the float 64 number types. + * Do a check for this. + */ +#if ENABLED (JERRY_BUILTIN_DATE) && !ENABLED (JERRY_NUMBER_TYPE_FLOAT64) +# error "Date does not support float32" +#endif + +/** + * Wrap container types into a single guard + */ +#if ENABLED (JERRY_ES2015_BUILTIN_MAP) || ENABLED (JERRY_ES2015_BUILTIN_SET) \ +|| ENABLED (JERRY_ES2015_BUILTIN_WEAKMAP) || ENABLED (JERRY_ES2015_BUILTIN_WEAKSET) +# define JERRY_ES2015_BUILTIN_CONTAINER 1 +#else +# define JERRY_ES2015_BUILTIN_CONTAINER 0 +#endif + +#endif /* !JERRYSCRIPT_CONFIG_H */ diff --git a/rwatch/js/rocky_canvas.h b/rwatch/js/rocky_canvas.h index c2128036..cd7a8a3d 100644 --- a/rwatch/js/rocky_canvas.h +++ b/rwatch/js/rocky_canvas.h @@ -1,3 +1,14 @@ +#pragma once +/* rockyjs.h + * + * Rocky.js (On-watch JavaScript) Implementation + * Rocky/JavaScript Canvas Library + * + * RebbleOS + * + * Author: Davit Markarian + */ + #include "rebbleos.h" typedef uint8_t RockyCanvasFontSize; diff --git a/rwatch/js/rocky_jerry.h b/rwatch/js/rocky_config.h similarity index 58% rename from rwatch/js/rocky_jerry.h rename to rwatch/js/rocky_config.h index 781d524f..3ee8962c 100644 --- a/rwatch/js/rocky_jerry.h +++ b/rwatch/js/rocky_config.h @@ -1,5 +1,4 @@ #pragma once - /* rockyjs.h * * Rocky.js (On-watch JavaScript) Implementation @@ -10,13 +9,8 @@ * Author: Davit Markarian */ -// RebbleOS provides allocation functions. -#define JERRY_SYSTEM_ALLOCATOR 1 -// System Allocation requires using full 32-bit pointers. -# define JERRY_CPOINTER_32_BIT 0 - -// RebbleOS works with soft-floats. In the interest of speed, JerryScript is told to use less precise 32-bit floats. -// # define JERRY_NUMBER_TYPE_FLOAT64 0 +// Needed to dynamically create an engine instance only when the app is opened. +#define JERRY_EXTERNAL_CONTEXT 1 // Rocky.js runs precompiled bytecode, rather than raw JS source. # define JERRY_SNAPSHOT_EXEC 1 @@ -24,14 +18,12 @@ # define JERRY_PARSER 0 // Needed to periodically handle events. -# define JERRY_VM_EXEC_STOP 1 +//# define JERRY_VM_EXEC_STOP 1 # define JERRY_ES2015 0 +# define JERRY_BUILTINS 1 // TODO: Evaluate the need for certain features and builtins, removing as necessary. // TODO: Tune heap/stack/GC limits for better performance. -#include "jerryscript-config.h" - -#include "rocky_port.h" -#include "jerryscript.h" \ No newline at end of file +#include "rocky_port.h" \ No newline at end of file diff --git a/rwatch/js/rocky_js.c b/rwatch/js/rocky_js.c index 6f2d9e34..e123c810 100644 --- a/rwatch/js/rocky_js.c +++ b/rwatch/js/rocky_js.c @@ -2,13 +2,96 @@ #include "rocky_js.h" #if defined(REBBLE_PLATFORM_SNOWY) || defined(REBBLE_PLATFORM_SNOWY) -#include "rocky_jerry.h" -void rocky_event_loop_with_resource(uint32_t resource_id) { + +#include "jerryscript.h" + +void *rocky_jerry_ctx_alloc(size_t size, void *userdata) +{ + return app_malloc(size); +} + +void rocky_event_loop_with_resource(uint32_t resource_id) +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Starting Rocky.js with snapshot (resource #%u)...", resource_id); + ResHandle snapHandle = resource_get_handle(resource_id); + size_t snapSize = resource_size(snapHandle); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "JS Snapshot Resource Size: %d bytes", snapSize); + + if (snapSize < 16) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "This snapshot is invalid (too small)."); + return; + } + if (snapSize > 128 * 1024) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "This snapshot is invalid (too large)."); + return; + } + + uint8_t *snapBuffer = app_malloc(snapSize); + if (snapBuffer == NULL) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Failed to allocate memory for JS snapshot resource."); + return; + } + + resource_load(snapHandle, snapBuffer, snapSize); + /* + if (resource_load(snapHandle, snapBuffer, snapSize) != snapSize) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Failed to load JS snapshot resource into allocated memory."); + app_free(snapBuffer); + return; + } + */ + + if (memcmp("PJS", snapBuffer, 4) != 0) + { // Check for magic: 'PJS\0' + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Snapshot resource is not of valid format (invalid magic)."); + app_free(snapBuffer); + return; + } + + uint32_t snapVersion = *(snapBuffer + 4); + if (snapVersion != 1) + { // Check for the only version ever made: 0x1 + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Snapshot resource is not of valid format (invalid version)."); + app_free(snapBuffer); + return; + } + + uint32_t *snapshot = snapBuffer + 8; + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "JS Snapshot Resource loaded successfully."); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Creating JavaScript Context..."); + + app_running_thread *this_thread = appmanager_get_current_thread(); + + this_thread->js_context = jerry_create_context(64 * 1024, rocky_jerry_ctx_alloc, NULL); + if (this_thread->js_context == NULL) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "JavaScript Context creation failed."); + app_free(snapBuffer); + return; + } + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Starting JavaScript..."); + jerry_init(JERRY_INIT_EMPTY); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running JavaScript Snapshot..."); + jerry_value_t error = jerry_get_error_type(jerry_exec_snapshot(snapshot, snapSize - 8, 0, 0)); + if(error != JERRY_ERROR_NONE){ + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Program execution failed. JavaScript engine reported error type %d.", error); + app_free(snapBuffer); + app_free(this_thread->js_context); + return; + } + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Snapshot execution successful."); } #else -void rocky_event_loop_with_resource(uint32_t resource_id) { - APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Attempted to execute Rocky.js with resource %u. Rocky is not available on this platform. Exiting.", resource_id); - return; +void rocky_event_loop_with_resource(uint32_t resource_id) +{ + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Attempted to execute Rocky.js with resource %u. Rocky is not available on this platform. Exiting.", resource_id); } #endif \ No newline at end of file diff --git a/rwatch/js/rocky_js.h b/rwatch/js/rocky_js.h index ffe8fc4c..e80e48db 100644 --- a/rwatch/js/rocky_js.h +++ b/rwatch/js/rocky_js.h @@ -1,5 +1,4 @@ #pragma once - /* rockyjs.h * * Rocky.js (On-watch JavaScript) Implementation diff --git a/rwatch/js/rocky_port.c b/rwatch/js/rocky_port.c index 281e4faa..fb4ccd91 100644 --- a/rwatch/js/rocky_port.c +++ b/rwatch/js/rocky_port.c @@ -3,7 +3,8 @@ void jerry_port_fatal(jerry_fatal_code_t code) { - SYS_LOG("rocky", APP_LOG_LEVEL_ERROR, "VM Fatal Error Code %d", code); + SYS_LOG("rocky", APP_LOG_LEVEL_ERROR, "VM Fatal Error Code %d. Quitting.", code); + appmanager_app_quit(); } void jerry_port_log(jerry_log_level_t level, const char *fmt, ...) @@ -42,11 +43,17 @@ void jerry_port_release_source(uint8_t *buffer_p) { free(buffer_p); } + size_t jerry_port_normalize_path(const char *in_path_p, char *out_buf_p, size_t out_buf_size, char *base_file_p) { - return 0; + const char* path = "/app.js"; + out_buf_p = path; + out_buf_size = sizeof(path); + base_file_p = path; + return sizeof(path); } -jerry_value_t jerry_port_get_native_module(jerry_value_t name){ +jerry_value_t jerry_port_get_native_module(jerry_value_t name) +{ return jerry_create_undefined(); } @@ -61,7 +68,8 @@ double jerry_port_get_current_time() struct jerry_context_t *jerry_port_get_current_context() { - return NULL; + app_running_thread *this_thread = appmanager_get_current_thread(); + return this_thread->js_context; } void jerry_port_sleep(uint32_t sleep_time) diff --git a/rwatch/js/rocky_port.h b/rwatch/js/rocky_port.h index aeef1959..5ff863c2 100644 --- a/rwatch/js/rocky_port.h +++ b/rwatch/js/rocky_port.h @@ -1,3 +1,14 @@ +#pragma once +/* rockyjs.h + * + * Rocky.js (On-watch JavaScript) Implementation + * JerryScript Port Functions + * + * RebbleOS + * + * Author: Davit Markarian + */ + #include "jerryscript-port.h" void jerry_port_fatal(jerry_fatal_code_t code); From ccc1876b2a9c8b07920cc15334b35fe8a6a17ace Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Sun, 8 Mar 2020 11:37:21 +0100 Subject: [PATCH 07/10] Switching to older, compatible Jerryscript --- .gitmodules | 2 +- rwatch/js/rocky_config.h | 3 ++- rwatch/js/rocky_js.c | 14 ++++++++++---- rwatch/js/rocky_port.c | 13 ++++++++----- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/.gitmodules b/.gitmodules index 7a13c5dc..ae7e487c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,4 +12,4 @@ url = ../../pebble-dev/libpebble2 [submodule "lib/jerryscript"] path = lib/jerryscript - url = https://github.com/jerryscript-project/jerryscript.git + url = https://github.com/udxs/jerryscript.git diff --git a/rwatch/js/rocky_config.h b/rwatch/js/rocky_config.h index 3ee8962c..f40d8338 100644 --- a/rwatch/js/rocky_config.h +++ b/rwatch/js/rocky_config.h @@ -21,7 +21,8 @@ //# define JERRY_VM_EXEC_STOP 1 # define JERRY_ES2015 0 -# define JERRY_BUILTINS 1 +# define JERRY_BUILTINS 0 +# define JERRY_ERROR_MESSAGES 1 // TODO: Evaluate the need for certain features and builtins, removing as necessary. // TODO: Tune heap/stack/GC limits for better performance. diff --git a/rwatch/js/rocky_js.c b/rwatch/js/rocky_js.c index e123c810..f7770fca 100644 --- a/rwatch/js/rocky_js.c +++ b/rwatch/js/rocky_js.c @@ -60,7 +60,9 @@ void rocky_event_loop_with_resource(uint32_t resource_id) return; } - uint32_t *snapshot = snapBuffer + 8; + uint32_t *snapshot = snapBuffer + 12; + *(snapshot + 1) = 6u; + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "snapshot %p now %p", snapBuffer, snapshot); APP_LOG("rocky", APP_LOG_LEVEL_INFO, "JS Snapshot Resource loaded successfully."); APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Creating JavaScript Context..."); @@ -79,9 +81,13 @@ void rocky_event_loop_with_resource(uint32_t resource_id) jerry_init(JERRY_INIT_EMPTY); APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running JavaScript Snapshot..."); - jerry_value_t error = jerry_get_error_type(jerry_exec_snapshot(snapshot, snapSize - 8, 0, 0)); - if(error != JERRY_ERROR_NONE){ - APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Program execution failed. JavaScript engine reported error type %d.", error); + jerry_value_t out = jerry_exec_snapshot(snapshot, snapSize - 12, 0, 0); + if(jerry_get_error_type(out) != JERRY_ERROR_NONE){ + jerry_value_t val = jerry_get_value_from_error(out, false); + jerry_value_t msgV = jerry_get_property(val, jerry_create_string("message")); + char msg[256]; + jerry_string_to_char_buffer(msgV, msg, 255); + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Program execution failed. JavaScript engine reported error type %d. Error value %s.", jerry_get_error_type(out), msg); app_free(snapBuffer); app_free(this_thread->js_context); return; diff --git a/rwatch/js/rocky_port.c b/rwatch/js/rocky_port.c index fb4ccd91..696490ac 100644 --- a/rwatch/js/rocky_port.c +++ b/rwatch/js/rocky_port.c @@ -46,11 +46,14 @@ void jerry_port_release_source(uint8_t *buffer_p) size_t jerry_port_normalize_path(const char *in_path_p, char *out_buf_p, size_t out_buf_size, char *base_file_p) { - const char* path = "/app.js"; - out_buf_p = path; - out_buf_size = sizeof(path); - base_file_p = path; - return sizeof(path); + const size_t len = strnlen(in_path_p, out_buf_size); + if (len < out_buf_size) + { + strncpy(out_buf_p, in_path_p, out_buf_size); + return len; + } + + return 0; } jerry_value_t jerry_port_get_native_module(jerry_value_t name) { From 94330595034d837388d995299c78e475fa8ff670 Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Sat, 21 Mar 2020 20:24:46 +0100 Subject: [PATCH 08/10] JavaScript now runs. Basic Rocky library definitions added, some events --- Makefile | 2 - hw/platform/snowy/config.mk | 27 -- hw/platform/snowy_family/config.mk | 145 ++++++ rcore/appmanager.h | 4 +- rcore/log.c | 2 +- rwatch/js/jerryscript-config.h | 690 ----------------------------- rwatch/js/rocky_config.h | 30 -- rwatch/js/rocky_event.c | 126 ++++++ rwatch/js/rocky_js.c | 117 ++++- rwatch/js/rocky_js.h | 5 + rwatch/js/rocky_lib.c | 162 +++++++ rwatch/js/rocky_lib.h | 44 ++ rwatch/js/rocky_port.c | 85 ++-- rwatch/js/rocky_port.h | 29 -- 14 files changed, 618 insertions(+), 850 deletions(-) delete mode 100644 rwatch/js/jerryscript-config.h delete mode 100644 rwatch/js/rocky_config.h create mode 100644 rwatch/js/rocky_event.c create mode 100644 rwatch/js/rocky_lib.h delete mode 100644 rwatch/js/rocky_port.h diff --git a/Makefile b/Makefile index c65878f8..b051a4ce 100644 --- a/Makefile +++ b/Makefile @@ -237,8 +237,6 @@ $(BUILD)/version.c: $(QUIET)git shortlog -s | cut -c8- | sort -f | sed -e 's/\(.*\)/ "\1",/' >> $@ $(QUIET)echo " 0" >> $@ $(QUIET)echo "};" >> $@ - $(QUIET)$(PYTHON3) lib/jerryscript/tools/srcgenerator.py --output-dir $(BUILD)/jerryscript --jerry-libm --jerry-core - $(QUIET)rm build/jerryscript/jerryscript-config.h .PHONY: $(BUILD)/version.c diff --git a/hw/platform/snowy/config.mk b/hw/platform/snowy/config.mk index 6aed4f8c..b58703fe 100644 --- a/hw/platform/snowy/config.mk +++ b/hw/platform/snowy/config.mk @@ -11,33 +11,6 @@ SRCS_snowy += hw/platform/snowy/snowy.c SRCS_snowy += hw/platform/snowy/snowy_bluetooth.c SRCS_snowy += Resources/snowy_fpga.bin - -# Note: rocky_js.c is added to all platforms. -SRCS_snowy += build/jerryscript/jerryscript.c -SRCS_snowy += build/jerryscript/jerryscript-libm.c -SRCS_snowy += rwatch/js/rocky_canvas.c -SRCS_snowy += rwatch/js/rocky_lib.c -SRCS_snowy += rwatch/js/rocky_setjmp.c -SRCS_snowy += rwatch/js/rocky_port.c - -CFLAGS_snowy += -Ilib/jerryscript/jerry-core -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/api -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/include -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/debugger -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/base -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/builtin-objects -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/builtin-objects/typedarray -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/ecma/operations -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/jcontext -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/jmem -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/jrt -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/lit -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/parser/js -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/parser/regexp -CFLAGS_snowy += -Ilib/jerryscript/jerry-core/vm -CFLAGS_snowy += -Ilib/jerryscript/jerry-libm -CFLAGS_snowy += -Ibuild/jerryscript - LDFLAGS_snowy = $(LDFLAGS_snowy_family) LIBS_snowy = $(LIBS_snowy_family) diff --git a/hw/platform/snowy_family/config.mk b/hw/platform/snowy_family/config.mk index 4de5c469..855fb078 100644 --- a/hw/platform/snowy_family/config.mk +++ b/hw/platform/snowy_family/config.mk @@ -9,6 +9,23 @@ CFLAGS_snowy_family += $(CFLAGS_driver_stm32_rtc) CFLAGS_snowy_family += $(CFLAGS_driver_stm32_backlight) CFLAGS_snowy_family += -Ihw/platform/snowy_family +CFLAGS_snowy_family += -Irwatch/js +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/ecma +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/debugger +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/ecma/base +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/ecma/builtin-objects +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/ecma/operations +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/jcontext +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/jmem +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/jrt +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/lit +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/parser/js +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/parser/regexp +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-core/vm +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-libm +CFLAGS_snowy_family += -Ilib/jerryscript/jerry-libm/include + SRCS_snowy_family = $(SRCS_stm32f4xx) SRCS_snowy_family += $(SRCS_driver_stm32_usart) SRCS_snowy_family += $(SRCS_driver_stm32_dma) @@ -26,6 +43,134 @@ SRCS_snowy_family += hw/platform/snowy_family/snowy_ambient.c SRCS_snowy_family += hw/platform/snowy_family/snowy_ext_flash.c SRCS_snowy_family += hw/platform/snowy_family/snowy_common.c +# Note: rocky_js.c is added to all platforms. +SRCS_snowy_family += rwatch/js/rocky_setjmp.c +SRCS_snowy_family += rwatch/js/rocky_port.c +SRCS_snowy_family += rwatch/js/rocky_canvas.c +SRCS_snowy_family += rwatch/js/rocky_lib.c +SRCS_snowy_family += rwatch/js/rocky_event.c + +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-alloc.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-gc.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-conversion.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-errol.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-external-pointers.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-number.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-string.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-value.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers-values-collection.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-helpers.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-init-finalize.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-lcache.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-literal-storage.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/base/ecma-property-hashmap.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-array.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-boolean-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-boolean.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-date-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-date.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-error.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-evalerror-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-evalerror.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-function-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-function.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-global.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-error.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-json.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-json.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-math.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-number-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-number.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-object-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-rangeerror-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-rangeerror.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-referenceerror-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-referenceerror.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-string.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-syntaxerror-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-syntaxerror.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-type-error-thrower.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-typeerror-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-typeerror.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-urierror-prototype.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtin-urierror.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/builtin-objects/ecma-builtins.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-array-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-boolean-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-comparison.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-conversion.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-eval.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-exceptions.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-function-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-get-put-value.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-lex-env.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-number-arithmetic.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-number-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-objects-arguments.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-objects-general.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-objects.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-reference.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-regexp-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/ecma/operations/ecma-string-object.c +SRCS_snowy_family += lib/jerryscript/jerry-core/jcontext/jcontext.c +SRCS_snowy_family += lib/jerryscript/jerry-core/jerry.c +SRCS_snowy_family += lib/jerryscript/jerry-core/jmem/jmem-allocator.c +SRCS_snowy_family += lib/jerryscript/jerry-core/jmem/jmem-heap.c +SRCS_snowy_family += lib/jerryscript/jerry-core/jmem/jmem-poolman.c +SRCS_snowy_family += lib/jerryscript/jerry-core/jrt/jrt-fatals.c +SRCS_snowy_family += lib/jerryscript/jerry-core/lit/lit-char-helpers.c +SRCS_snowy_family += lib/jerryscript/jerry-core/lit/lit-magic-strings.c +SRCS_snowy_family += lib/jerryscript/jerry-core/lit/lit-strings.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/byte-code.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/common.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-lexer.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-parser-expr.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-parser-mem.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-parser-scanner.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-parser-statm.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-parser-util.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/js/js-parser.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/regexp/re-bytecode.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/regexp/re-compiler.c +SRCS_snowy_family += lib/jerryscript/jerry-core/parser/regexp/re-parser.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/opcodes-ecma-arithmetics.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/opcodes-ecma-bitwise.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/opcodes-ecma-equality.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/opcodes-ecma-relational.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/opcodes.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/vm-stack.c +SRCS_snowy_family += lib/jerryscript/jerry-core/vm/vm.c + +SRCS_snowy_family += lib/jerryscript/jerry-libm/acos.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/asin.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/atan.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/atan2.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/ceil.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/copysign.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/exp.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/fabs.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/finite.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/floor.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/fmod.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/isnan.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/log.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/nextafter.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/pow.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/scalbn.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/sqrt.c +SRCS_snowy_family += lib/jerryscript/jerry-libm/trig.c + + + + LDFLAGS_snowy_family = $(LDFLAGS_stm32f4xx) LIBS_snowy_family = $(LIBS_stm32f4xx) diff --git a/rcore/appmanager.h b/rcore/appmanager.h index 55ebe1f6..e99c3ea2 100644 --- a/rcore/appmanager.h +++ b/rcore/appmanager.h @@ -16,7 +16,7 @@ #include "node_list.h" #include #include "uuid.h" -#include "jerryscript.h" +#include "rocky_js.h" // TODO Make this dynamic. hacky #define NUM_APPS 3 @@ -149,7 +149,7 @@ typedef struct app_running_thread_t { struct CoreTimer *timer_head; qarena_t *arena; struct n_GContext *graphics_context; - jerry_context_t *js_context; + rocky_thread_state rocky_state; } app_running_thread; /* in appmanager.c */ diff --git a/rcore/log.c b/rcore/log.c index 873e10c8..c212a82f 100644 --- a/rcore/log.c +++ b/rcore/log.c @@ -34,7 +34,7 @@ void log_printf_to_ar(const char *layer, const char *module, uint8_t level, cons // NOTE Probably shouldn't use from an ISR or it'll likely lock -#define PRBUFSIZ 160 +#define PRBUFSIZ 256 void log_printf(const char *layer, const char *module, uint8_t level, const char *filename, uint32_t line_no, const char *fmt, va_list ar) { uint8_t interrupt_set = 0; diff --git a/rwatch/js/jerryscript-config.h b/rwatch/js/jerryscript-config.h deleted file mode 100644 index 4234c882..00000000 --- a/rwatch/js/jerryscript-config.h +++ /dev/null @@ -1,690 +0,0 @@ -// THIS FILE CAME FROM JERRYSCRIPT BUILD. DO NOT EDIT. TO CHANGE CONFIG, EDIT rocky_config.h -#include "rocky_config.h" - -/* 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 JERRYSCRIPT_CONFIG_H -#define JERRYSCRIPT_CONFIG_H - -// @JERRY_BUILD_CFG@ - -/** - * Built-in configurations - * - * Allowed values for built-in defines: - * 0: Disable the given built-in. - * 1: Enable the given built-in. - */ -/* - * By default all built-ins are enabled if they are not defined. - */ -#ifndef JERRY_BUILTINS -# define JERRY_BUILTINS 1 -#endif /* !defined (JERRY_BUILTINS) */ - -#ifndef JERRY_BUILTIN_ANNEXB -# define JERRY_BUILTIN_ANNEXB JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_ANNEXB) */ - -#ifndef JERRY_BUILTIN_ARRAY -# define JERRY_BUILTIN_ARRAY JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_ARRAY) */ - -#ifndef JERRY_BUILTIN_DATE -# define JERRY_BUILTIN_DATE JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_DATE) */ - -#ifndef JERRY_BUILTIN_ERRORS -# define JERRY_BUILTIN_ERRORS JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_ERRORS) */ - -#ifndef JERRY_BUILTIN_BOOLEAN -# define JERRY_BUILTIN_BOOLEAN JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_BOOLEAN) */ - -#ifndef JERRY_BUILTIN_JSON -# define JERRY_BUILTIN_JSON JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_JSON) */ - -#ifndef JERRY_BUILTIN_MATH -# define JERRY_BUILTIN_MATH JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_MATH) */ - -#ifndef JERRY_BUILTIN_NUMBER -# define JERRY_BUILTIN_NUMBER JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_NUMBER) */ - -#ifndef JERRY_BUILTIN_REGEXP -# define JERRY_BUILTIN_REGEXP JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_REGEXP) */ - -#ifndef JERRY_BUILTIN_STRING -# define JERRY_BUILTIN_STRING JERRY_BUILTINS -#endif /* !defined (JERRY_BUILTIN_STRING) */ - -/** - * ES2015 (a.k.a es6) related features, by default all of them are enabled. - */ -#ifndef JERRY_ES2015 -# define JERRY_ES2015 1 -#endif /* !defined (JERRY_ES2015) */ - -#ifndef JERRY_ES2015_BUILTIN_DATAVIEW -# define JERRY_ES2015_BUILTIN_DATAVIEW JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_DATAVIEW) */ - -#ifndef JERRY_ES2015_BUILTIN_MAP -# define JERRY_ES2015_BUILTIN_MAP JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_MAP) */ - -#ifndef JERRY_ES2015_BUILTIN_SET -# define JERRY_ES2015_BUILTIN_SET JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_SET) */ - -#ifndef JERRY_ES2015_BUILTIN_WEAKMAP -# define JERRY_ES2015_BUILTIN_WEAKMAP JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_WEAKMAP) */ - -#ifndef JERRY_ES2015_BUILTIN_WEAKSET -# define JERRY_ES2015_BUILTIN_WEAKSET JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_WEAKSET) */ - -#ifndef JERRY_ES2015_BUILTIN_PROMISE -# define JERRY_ES2015_BUILTIN_PROMISE JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_PROMISE) */ - -#ifndef JERRY_ES2015_BUILTIN_PROXY -# define JERRY_ES2015_BUILTIN_PROXY JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_PROXY) */ - -#ifndef JERRY_ES2015_BUILTIN_REFLECT -# define JERRY_ES2015_BUILTIN_REFLECT JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_REFLECT) */ - -#ifndef JERRY_ES2015_BUILTIN_TYPEDARRAY -# define JERRY_ES2015_BUILTIN_TYPEDARRAY JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_BUILTIN_TYPEDARRAY) */ - -#ifndef JERRY_ES2015_MODULE_SYSTEM -# define JERRY_ES2015_MODULE_SYSTEM JERRY_ES2015 -#endif /* !defined (JERRY_ES2015_MODULE_SYSTEM) */ - -/** - * Engine internal and misc configurations. - */ - -/** - * Specifies the compressed pointer representation - * - * Allowed values: - * 0: use 16 bit representation - * 1: use 32 bit representation - * - * Default value: 0 - * For more details see: jmem/jmem.h - */ -#ifndef JERRY_CPOINTER_32_BIT -# define JERRY_CPOINTER_32_BIT 0 -#endif /* !defined (JERRY_CPOINTER_32_BIT) */ - -/** - * Enable/Disable the engine's JavaScript debugger interface - * - * Allowed values: - * 0: Disable the debugger parts. - * 1: Enable the debugger. - */ -#ifndef JERRY_DEBUGGER -# define JERRY_DEBUGGER 0 -#endif /* !defined (JERRY_DEBUGGER) */ - -/** - * Enable/Disable built-in error messages for error objects. - * - * Allowed values: - * 0: Disable error messages. - * 1: Enable error message. - * - * Default value: 0 - */ -#ifndef JERRY_ERROR_MESSAGES -# define JERRY_ERROR_MESSAGES 0 -#endif /* !defined (JERRY_ERROR_MESSAGES) */ - -/** - * Enable/Disable external context. - * - * Allowed values: - * 0: Disable external context. - * 1: Enable external context support. - * - * Default value: 0 - */ -#ifndef JERRY_EXTERNAL_CONTEXT -# define JERRY_EXTERNAL_CONTEXT 0 -#endif /* !defined (JERRY_EXTERNAL_CONTEXT) */ - -/** - * Maximum size of heap in kilobytes - * - * Default value: 512 KiB - */ -#ifndef JERRY_GLOBAL_HEAP_SIZE -# define JERRY_GLOBAL_HEAP_SIZE (512) -#endif /* !defined (JERRY_GLOBAL_HEAP_SIZE) */ - -/** - * The allowed heap usage limit until next garbage collection, in bytes. - * - * If value is 0, the default is 1/32 of JERRY_HEAP_SIZE - */ -#ifndef JERRY_GC_LIMIT -# define JERRY_GC_LIMIT 0 -#endif /* !defined (JERRY_GC_LIMIT) */ - -/** - * Maximum stack usage size in kilobytes - * - * Note: This feature cannot be used when 'detect_stack_use_after_return=1' ASAN option is enabled. - * For more detailed description: - * - https://github.com/google/sanitizers/wiki/AddressSanitizerUseAfterReturn#compatibility - * - * Default value: 0, unlimited - */ -#ifndef JERRY_STACK_LIMIT -# define JERRY_STACK_LIMIT (0) -#endif /* !defined (JERRY_STACK_LIMIT) */ - -/** - * Maximum depth of recursion during GC mark phase - * - * Default value: 8 - */ -#ifndef JERRY_GC_MARK_LIMIT -# define JERRY_GC_MARK_LIMIT (8) -#endif /* !defined (JERRY_GC_MARK_LIMIT) */ - -/** - * Enable/Disable property lookup cache. - * - * Allowed values: - * 0: Disable lookup cache. - * 1: Enable lookup cache. - * - * Default value: 1 - */ -#ifndef JERRY_LCACHE -# define JERRY_LCACHE 1 -#endif /* !defined (JERRY_LCACHE) */ - -/** - * Enable/Disable line-info management inside the engine. - * - * Allowed values: - * 0: Disable line-info in the engine. - * 1: Enable line-info management. - * - * Default value: 0 - */ -#ifndef JERRY_LINE_INFO -# define JERRY_LINE_INFO 0 -#endif /* !defined (JERRY_LINE_INFO) */ - -/** - * Enable/Disable logging inside the engine. - * - * Allowed values: - * 0: Disable internal logging. - * 1: Enable internal logging. - * - * Default value: 0 - */ -#ifndef JERRY_LOGGING -# define JERRY_LOGGING 0 -#endif /* !defined (JERRY_LOGGING) */ - -/** - * Enable/Disable gc call before every allocation. - * - * Allowed values: - * 0: Disable gc call before each allocation. - * 1: Enable and force gc call before each allocation. - * - * Default value: 0 - * Warning!: This is an advanced option and will slow down the engine! - * Only enable it for debugging purposes. - */ -#ifndef JERRY_MEM_GC_BEFORE_EACH_ALLOC -# define JERRY_MEM_GC_BEFORE_EACH_ALLOC 0 -#endif /* !defined (JERRY_MEM_GC_BEFORE_EACH_ALLOC) */ - -/** - * Enable/Disable the collection if run-time memory statistics. - * - * Allowed values: - * 0: Disable run-time memory information collection. - * 1: Enable run-time memory statistics collection. - * - * Default value: 0 - */ -#ifndef JERRY_MEM_STATS -# define JERRY_MEM_STATS 0 -#endif /* !defined (JERRY_MEM_STATS) */ - -/** - * Use 32-bit/64-bit float for ecma-numbers - * This option is for expert use only! - * - * Allowed values: - * 1: use 64-bit floating point number mode - * 0: use 32-bit floating point number mode - * - * Default value: 1 - */ -#ifndef JERRY_NUMBER_TYPE_FLOAT64 -# define JERRY_NUMBER_TYPE_FLOAT64 1 -#endif /* !defined (JERRY_NUMBER_TYPE_FLOAT64 */ - -/** - * Enable/Disable the JavaScript parser. - * - * Allowed values: - * 0: Disable the JavaScript parser and all related functionallity. - * 1: Enable the JavaScript parser. - * - * Default value: 1 - */ -#ifndef JERRY_PARSER -# define JERRY_PARSER 1 -#endif /* !defined (JERRY_PARSER) */ - -/** - * Enable/Disable JerryScript byte code dump functions during parsing. - * To dump the JerryScript byte code the engine must be initialized with opcodes - * display flag. This option does not influence RegExp byte code dumps. - * - * Allowed values: - * 0: Disable all bytecode dump functions. - * 1: Enable bytecode dump functions. - * - * Default value: 0 - */ -#ifndef JERRY_PARSER_DUMP_BYTE_CODE -# define JERRY_PARSER_DUMP_BYTE_CODE 0 -#endif /* defined (JERRY_PARSER_DUMP_BYTE_CODE) */ - -/** - * Enable/Disable ECMA property hashmap. - * - * Allowed values: - * 0: Disable property hasmap. - * 1: Enable property hashmap. - * - * Default value: 1 - */ -#ifndef JERRY_PROPRETY_HASHMAP -# define JERRY_PROPRETY_HASHMAP 1 -#endif /* !defined (JERRY_PROPRETY_HASHMAP) */ - -/** - * Enable/Disable byte code dump functions for RegExp objects. - * To dump the RegExp byte code the engine must be initialized with - * regexp opcodes display flag. This option does not influence the - * JerryScript byte code dumps. - * - * Allowed values: - * 0: Disable all bytecode dump functions. - * 1: Enable bytecode dump functions. - * - * Default value: 0 - */ -#ifndef JERRY_REGEXP_DUMP_BYTE_CODE -# define JERRY_REGEXP_DUMP_BYTE_CODE 0 -#endif /* !defined (JERRY_REGEXP_DUMP_BYTE_CODE) */ - -/** - * Enables/disables the RegExp strict mode - * - * Default value: 0 - */ -#ifndef JERRY_REGEXP_STRICT_MODE -# define JERRY_REGEXP_STRICT_MODE 0 -#endif /* !defined (JERRY_REGEXP_STRICT_MODE) */ - -/** - * Enable/Disable the snapshot execution functions. - * - * Allowed values: - * 0: Disable snapshot execution. - * 1: Enable snapshot execution. - * - * Default value: 0 - */ -#ifndef JERRY_SNAPSHOT_EXEC -# define JERRY_SNAPSHOT_EXEC 0 -#endif /* !defined (JERRY_SNAPSHOT_EXEC) */ - -/** - * Enable/Disable the snapshot save functions. - * - * Allowed values: - * 0: Disable snapshot save functions. - * 1: Enable snapshot save functions. - */ -#ifndef JERRY_SNAPSHOT_SAVE -# define JERRY_SNAPSHOT_SAVE 0 -#endif /* !defined (JERRY_SNAPSHOT_SAVE) */ - -/** - * Enable/Disable usage of system allocator. - * - * Allowed values: - * 0: Disable usage of system allocator. - * 1: Enable usage of system allocator. - * - * Default value: 0 - */ -#ifndef JERRY_SYSTEM_ALLOCATOR -# define JERRY_SYSTEM_ALLOCATOR 0 -#endif /* !defined (JERRY_SYSTEM_ALLOCATOR) */ - -/** - * Enables/disables the unicode case conversion in the engine. - * By default Unicode case conversion is enabled. - */ -#ifndef JERRY_UNICODE_CASE_CONVERSION -# define JERRY_UNICODE_CASE_CONVERSION 1 -#endif /* !defined (JERRY_UNICODE_CASE_CONVERSION) */ - -/** - * Configures if the internal memory allocations are exposed to Valgrind or not. - * - * Allowed values: - * 0: Disable the Valgrind specific memory allocation notifications. - * 1: Enable the Valgrind specific allocation notifications. - */ -#ifndef JERRY_VALGRIND -# define JERRY_VALGRIND 0 -#endif /* !defined (JERRY_VALGRIND) */ - -/** - * Enable/Disable the vm execution stop callback function. - * - * Allowed values: - * 0: Disable vm exec stop callbacks. - * 1: Enable vm exec stop callback functionality. - */ -#ifndef JERRY_VM_EXEC_STOP -# define JERRY_VM_EXEC_STOP 0 -#endif /* !defined (JERRY_VM_EXEC_STOP) */ - -/** - * Advanced section configurations. - */ - -/** - * Allow configuring attributes on a few constant data inside the engine. - * - * One of the main usages: - * Normally compilers store const(ant)s in ROM. Thus saving RAM. - * But if your compiler does not support it then the directive below can force it. - * - * For the moment it is mainly meant for the following targets: - * - ESP8266 - * - * Example configuration for moving (some) constatns into a given section: - * # define JERRY_ATTR_CONST_DATA __attribute__((section(".rodata.const"))) - */ -#ifndef JERRY_ATTR_CONST_DATA -# define JERRY_ATTR_CONST_DATA -#endif /* !defined (JERRY_ATTR_CONST_DATA) */ - -/** - * The JERRY_ATTR_GLOBAL_HEAP allows adding extra attributes for the Jerry global heap. - * - * Example on how to move the global heap into it's own section: - * #define JERRY_ATTR_GLOBAL_HEAP __attribute__((section(".text.globalheap"))) - */ -#ifndef JERRY_ATTR_GLOBAL_HEAP -# define JERRY_ATTR_GLOBAL_HEAP -#endif /* !defined (JERRY_ATTR_GLOBAL_HEAP) */ - -/** - * Sanity check for macros to see if the values are 0 or 1 - * - * If a new feature is added this should be updated. - */ -/** - * Check base builtins. - */ -#if !defined (JERRY_BUILTIN_ANNEXB) \ -|| ((JERRY_BUILTIN_ANNEXB != 0) && (JERRY_BUILTIN_ANNEXB != 1)) -# error "Invalid value for JERRY_BUILTIN_ANNEXB macro." -#endif -#if !defined (JERRY_BUILTIN_ARRAY) \ -|| ((JERRY_BUILTIN_ARRAY != 0) && (JERRY_BUILTIN_ARRAY != 1)) -# error "Invalid value for JERRY_BUILTIN_ARRAY macro." -#endif -#if !defined (JERRY_BUILTIN_BOOLEAN) \ -|| ((JERRY_BUILTIN_BOOLEAN != 0) && (JERRY_BUILTIN_BOOLEAN != 1)) -# error "Invalid value for JERRY_BUILTIN_BOOLEAN macro." -#endif -#if !defined (JERRY_BUILTIN_DATE) \ -|| ((JERRY_BUILTIN_DATE != 0) && (JERRY_BUILTIN_DATE != 1)) -# error "Invalid value for JERRY_BUILTIN_DATE macro." -#endif -#if !defined (JERRY_BUILTIN_ERRORS) \ -|| ((JERRY_BUILTIN_ERRORS != 0) && (JERRY_BUILTIN_ERRORS != 1)) -# error "Invalid value for JERRY_BUILTIN_ERRORS macro." -#endif -#if !defined (JERRY_BUILTIN_JSON) \ -|| ((JERRY_BUILTIN_JSON != 0) && (JERRY_BUILTIN_JSON != 1)) -# error "Invalid value for JERRY_BUILTIN_JSON macro." -#endif -#if !defined (JERRY_BUILTIN_MATH) \ -|| ((JERRY_BUILTIN_MATH != 0) && (JERRY_BUILTIN_MATH != 1)) -# error "Invalid value for JERRY_BUILTIN_MATH macro." -#endif -#if !defined (JERRY_BUILTIN_NUMBER) \ -|| ((JERRY_BUILTIN_NUMBER != 0) && (JERRY_BUILTIN_NUMBER != 1)) -# error "Invalid value for JERRY_BUILTIN_NUMBER macro." -#endif -#if !defined (JERRY_BUILTIN_REGEXP) \ -|| ((JERRY_BUILTIN_REGEXP != 0) && (JERRY_BUILTIN_REGEXP != 1)) -# error "Invalid value for JERRY_BUILTIN_REGEXP macro." -#endif -#if !defined (JERRY_BUILTIN_STRING) \ -|| ((JERRY_BUILTIN_STRING != 0) && (JERRY_BUILTIN_STRING != 1)) -# error "Invalid value for JERRY_BUILTIN_STRING macro." -#endif -#if !defined (JERRY_BUILTINS) \ -|| ((JERRY_BUILTINS != 0) && (JERRY_BUILTINS != 1)) -# error "Invalid value for JERRY_BUILTINS macro." -#endif - -/** - * Check ES2015 features - */ -#if !defined (JERRY_ES2015) \ -|| ((JERRY_ES2015 != 0) && (JERRY_ES2015 != 1)) -# error "Invalid value for JERRY_ES2015 macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_DATAVIEW) \ -|| ((JERRY_ES2015_BUILTIN_DATAVIEW != 0) && (JERRY_ES2015_BUILTIN_DATAVIEW != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_DATAVIEW macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_MAP) \ -|| ((JERRY_ES2015_BUILTIN_MAP != 0) && (JERRY_ES2015_BUILTIN_MAP != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_MAP macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_REFLECT) \ -|| ((JERRY_ES2015_BUILTIN_REFLECT != 0) && (JERRY_ES2015_BUILTIN_REFLECT != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_REFLECT macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_SET) \ -|| ((JERRY_ES2015_BUILTIN_SET != 0) && (JERRY_ES2015_BUILTIN_SET != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_SET macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_WEAKMAP) \ -|| ((JERRY_ES2015_BUILTIN_WEAKMAP != 0) && (JERRY_ES2015_BUILTIN_WEAKMAP != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_WEAKMAP macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_WEAKSET) \ -|| ((JERRY_ES2015_BUILTIN_WEAKSET != 0) && (JERRY_ES2015_BUILTIN_WEAKSET != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_WEAKSET macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_PROMISE) \ -|| ((JERRY_ES2015_BUILTIN_PROMISE != 0) && (JERRY_ES2015_BUILTIN_PROMISE != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_PROMISE macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_PROXY) \ -|| ((JERRY_ES2015_BUILTIN_PROXY != 0) && (JERRY_ES2015_BUILTIN_PROXY != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_PROXY macro." -#endif -#if !defined (JERRY_ES2015_BUILTIN_TYPEDARRAY) \ -|| ((JERRY_ES2015_BUILTIN_TYPEDARRAY != 0) && (JERRY_ES2015_BUILTIN_TYPEDARRAY != 1)) -# error "Invalid value for JERRY_ES2015_BUILTIN_TYPEDARRAY macro." -#endif -#if !defined (JERRY_ES2015_MODULE_SYSTEM) \ -|| ((JERRY_ES2015_MODULE_SYSTEM != 0) && (JERRY_ES2015_MODULE_SYSTEM != 1)) -# error "Invalid value for JERRY_ES2015_MODULE_SYSTEM macro." -#endif - -/** - * Internal options. - */ -#if !defined (JERRY_CPOINTER_32_BIT) \ -|| ((JERRY_CPOINTER_32_BIT != 0) && (JERRY_CPOINTER_32_BIT != 1)) -# error "Invalid value for 'JERRY_CPOINTER_32_BIT' macro." -#endif -#if !defined (JERRY_DEBUGGER) \ -|| ((JERRY_DEBUGGER != 0) && (JERRY_DEBUGGER != 1)) -# error "Invalid value for 'JERRY_DEBUGGER' macro." -#endif -#if !defined (JERRY_ERROR_MESSAGES) \ -|| ((JERRY_ERROR_MESSAGES != 0) && (JERRY_ERROR_MESSAGES != 1)) -# error "Invalid value for 'JERRY_ERROR_MESSAGES' macro." -#endif -#if !defined (JERRY_EXTERNAL_CONTEXT) \ -|| ((JERRY_EXTERNAL_CONTEXT != 0) && (JERRY_EXTERNAL_CONTEXT != 1)) -# error "Invalid value for 'JERRY_EXTERNAL_CONTEXT' macro." -#endif -#if !defined (JERRY_GLOBAL_HEAP_SIZE) || (JERRY_GLOBAL_HEAP_SIZE <= 0) -# error "Invalid value for 'JERRY_GLOBAL_HEAP_SIZE' macro." -#endif -#if !defined (JERRY_GC_LIMIT) || (JERRY_GC_LIMIT < 0) -# error "Invalid value for 'JERRY_GC_LIMIT' macro." -#endif -#if !defined (JERRY_STACK_LIMIT) || (JERRY_STACK_LIMIT < 0) -# error "Invalid value for 'JERRY_STACK_LIMIT' macro." -#endif -#if !defined (JERRY_GC_MARK_LIMIT) || (JERRY_GC_MARK_LIMIT < 0) -# error "Invalid value for 'JERRY_GC_MARK_LIMIT' macro." -#endif -#if !defined (JERRY_LCACHE) \ -|| ((JERRY_LCACHE != 0) && (JERRY_LCACHE != 1)) -# error "Invalid value for 'JERRY_LCACHE' macro." -#endif -#if !defined (JERRY_LINE_INFO) \ -|| ((JERRY_LINE_INFO != 0) && (JERRY_LINE_INFO != 1)) -# error "Invalid value for 'JERRY_LINE_INFO' macro." -#endif -#if !defined (JERRY_LOGGING) \ -|| ((JERRY_LOGGING != 0) && (JERRY_LOGGING != 1)) -# error "Invalid value for 'JERRY_LOGGING' macro." -#endif -#if !defined (JERRY_MEM_GC_BEFORE_EACH_ALLOC) \ -|| ((JERRY_MEM_GC_BEFORE_EACH_ALLOC != 0) && (JERRY_MEM_GC_BEFORE_EACH_ALLOC != 1)) -# error "Invalid value for 'JERRY_MEM_GC_BEFORE_EACH_ALLOC' macro." -#endif -#if !defined (JERRY_MEM_STATS) \ -|| ((JERRY_MEM_STATS != 0) && (JERRY_MEM_STATS != 1)) -# error "Invalid value for 'JERRY_MEM_STATS' macro." -#endif -#if !defined (JERRY_NUMBER_TYPE_FLOAT64) \ -|| ((JERRY_NUMBER_TYPE_FLOAT64 != 0) && (JERRY_NUMBER_TYPE_FLOAT64 != 1)) -# error "Invalid value for 'JERRY_NUMBER_TYPE_FLOAT64' macro." -#endif -#if !defined (JERRY_PARSER) \ -|| ((JERRY_PARSER != 0) && (JERRY_PARSER != 1)) -# error "Invalid value for 'JERRY_PARSER' macro." -#endif -#if !defined (JERRY_PARSER_DUMP_BYTE_CODE) \ -|| ((JERRY_PARSER_DUMP_BYTE_CODE != 0) && (JERRY_PARSER_DUMP_BYTE_CODE != 1)) -# error "Invalid value for 'JERRY_PARSER_DUMP_BYTE_CODE' macro." -#endif -#if !defined (JERRY_PROPRETY_HASHMAP) \ -|| ((JERRY_PROPRETY_HASHMAP != 0) && (JERRY_PROPRETY_HASHMAP != 1)) -# error "Invalid value for 'JERRY_PROPRETY_HASHMAP' macro." -#endif -#if !defined (JERRY_REGEXP_DUMP_BYTE_CODE) \ -|| ((JERRY_REGEXP_DUMP_BYTE_CODE != 0) && (JERRY_REGEXP_DUMP_BYTE_CODE != 1)) -# error "Invalid value for 'JERRY_REGEXP_DUMP_BYTE_CODE' macro." -#endif -#if !defined (JERRY_REGEXP_STRICT_MODE) \ -|| ((JERRY_REGEXP_STRICT_MODE != 0) && (JERRY_REGEXP_STRICT_MODE != 1)) -# error "Invalid value for 'JERRY_REGEXP_STRICT_MODE' macro." -#endif -#if !defined (JERRY_SNAPSHOT_EXEC) \ -|| ((JERRY_SNAPSHOT_EXEC != 0) && (JERRY_SNAPSHOT_EXEC != 1)) -# error "Invalid value for 'JERRY_SNAPSHOT_EXEC' macro." -#endif -#if !defined (JERRY_SNAPSHOT_SAVE) \ -|| ((JERRY_SNAPSHOT_SAVE != 0) && (JERRY_SNAPSHOT_SAVE != 1)) -# error "Invalid value for 'JERRY_SNAPSHOT_SAVE' macro." -#endif -#if !defined (JERRY_SYSTEM_ALLOCATOR) \ -|| ((JERRY_SYSTEM_ALLOCATOR != 0) && (JERRY_SYSTEM_ALLOCATOR != 1)) -# error "Invalid value for 'JERRY_SYSTEM_ALLOCATOR' macro." -#endif -#if !defined (JERRY_UNICODE_CASE_CONVERSION) \ -|| ((JERRY_UNICODE_CASE_CONVERSION != 0) && (JERRY_UNICODE_CASE_CONVERSION != 1)) -# error "Invalid value for 'JERRY_UNICODE_CASE_CONVERSION' macro." -#endif -#if !defined (JERRY_VALGRIND) \ -|| ((JERRY_VALGRIND != 0) && (JERRY_VALGRIND != 1)) -# error "Invalid value for 'JERRY_VALGRIND' macro." -#endif -#if !defined (JERRY_VM_EXEC_STOP) \ -|| ((JERRY_VM_EXEC_STOP != 0) && (JERRY_VM_EXEC_STOP != 1)) -# error "Invalid value for 'JERRY_VM_EXEC_STOP' macro." -#endif - -#define ENABLED(FEATURE) ((FEATURE) == 1) -#define DISABLED(FEATURE) ((FEATURE) != 1) - -/** - * Cross component requirements check. - */ -/** - * The date module can only use the float 64 number types. - * Do a check for this. - */ -#if ENABLED (JERRY_BUILTIN_DATE) && !ENABLED (JERRY_NUMBER_TYPE_FLOAT64) -# error "Date does not support float32" -#endif - -/** - * Wrap container types into a single guard - */ -#if ENABLED (JERRY_ES2015_BUILTIN_MAP) || ENABLED (JERRY_ES2015_BUILTIN_SET) \ -|| ENABLED (JERRY_ES2015_BUILTIN_WEAKMAP) || ENABLED (JERRY_ES2015_BUILTIN_WEAKSET) -# define JERRY_ES2015_BUILTIN_CONTAINER 1 -#else -# define JERRY_ES2015_BUILTIN_CONTAINER 0 -#endif - -#endif /* !JERRYSCRIPT_CONFIG_H */ diff --git a/rwatch/js/rocky_config.h b/rwatch/js/rocky_config.h deleted file mode 100644 index f40d8338..00000000 --- a/rwatch/js/rocky_config.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -/* rockyjs.h - * - * Rocky.js (On-watch JavaScript) Implementation - * JerryScript Configuration - * - * RebbleOS - * - * Author: Davit Markarian - */ - -// Needed to dynamically create an engine instance only when the app is opened. -#define JERRY_EXTERNAL_CONTEXT 1 - -// Rocky.js runs precompiled bytecode, rather than raw JS source. -# define JERRY_SNAPSHOT_EXEC 1 -// This should save some flash since we don't need to parse JS source. Note: this breaks "eval". -# define JERRY_PARSER 0 - -// Needed to periodically handle events. -//# define JERRY_VM_EXEC_STOP 1 - -# define JERRY_ES2015 0 -# define JERRY_BUILTINS 0 -# define JERRY_ERROR_MESSAGES 1 - -// TODO: Evaluate the need for certain features and builtins, removing as necessary. -// TODO: Tune heap/stack/GC limits for better performance. - -#include "rocky_port.h" \ No newline at end of file diff --git a/rwatch/js/rocky_event.c b/rwatch/js/rocky_event.c new file mode 100644 index 00000000..59ac0650 --- /dev/null +++ b/rwatch/js/rocky_event.c @@ -0,0 +1,126 @@ +#include "rocky_lib.h" +#include "connection_service.h" +#include + +const char *const rocky_eventListenerTypeStrings[] = { + "UNKNOWN", + "draw", + "secondchange", + "minutechange", + "hourchange", + "daychange", + "memorypressure", + "message", + "postmessageconnected", + "postmessagedisconnected", + "postmessageerror" + +}; + +static list_head rocky_eventList = LIST_HEAD(rocky_eventList); + +#define ROCKY_EVENT_TYPES_COUNT (sizeof(rocky_eventListenerTypeStrings) / sizeof(char *)) + +int rocky_eventList_count(rocky_eventListenerType type) +{ + int count = 0; + rocky_eventListener *listener; + list_foreach(listener, &rocky_eventList, rocky_eventListener, node) + { + if (listener->type == type) + { + count++; + } + } + + return count; +} + +void rocky_eventHandleConnection(bool connected) +{ + if (connected) + rocky_eventHandle(rocky_eventListenerType_postMessageConnected); + else + rocky_eventHandle(rocky_eventListenerType_postMessageDisconnected); +} + +void rocky_eventManageConnections(rocky_eventListener *event) +{ + if (rocky_eventList_count(rocky_eventListenerType_postMessageConnected) + rocky_eventList_count(rocky_eventListenerType_postMessageDisconnected) == 1) + { + connection_service_subscribe((ConnectionHandlers){.pebble_app_connection_handler = NULL, .pebblekit_connection_handler = rocky_eventHandleConnection}); + bool connected = connection_service_peek_pebblekit_connection(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Subscribing to Connection Service. Running Callback..."); + if(connected && event->type == rocky_eventListenerType_postMessageConnected) jerry_run(event->callback); + else if(!connected && event->type == rocky_eventListenerType_postMessageDisconnected) jerry_run(event->callback); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "'%s' callback executed immediately.", rocky_eventListenerTypeStrings[event->type]); + } + else if (rocky_eventList_count(rocky_eventListenerType_postMessageConnected) + rocky_eventList_count(rocky_eventListenerType_postMessageDisconnected) == 0) + { + connection_service_unsubscribe(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Unsubscribed from Connection Service."); + } +} + +rocky_eventListener *rocky_eventRegister(char *type, jerry_value_t callback) +{ + rocky_eventListener *event = app_malloc(sizeof(rocky_eventListener)); + if (event == NULL) + { + return NULL; + } + + event->type = rocky_eventListenerType_UNKNOWN; + + for (int i = 1; i < ROCKY_EVENT_TYPES_COUNT; i++) + { + if (strcmp(type, rocky_eventListenerTypeStrings[i]) == 0) + { + event->type = i; + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener type matched as rocky_eventListenerType[%d].", i); + } + } + + if (type == rocky_eventListenerType_UNKNOWN) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener type unknown."); + app_free(event); + return NULL; + } + + if (!jerry_value_is_function(callback)) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener callback not a function."); + app_free(event); + return NULL; + } + + jerry_acquire_value(callback); + event->callback = callback; + + list_insert_tail(&rocky_eventList, &event->node); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener added to list."); + + switch (event->type) + { + case rocky_eventListenerType_postMessageConnected: + case rocky_eventListenerType_postMessageDisconnected: + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running message connection callback setup..."); + rocky_eventManageConnections(event); + case rocky_eventListenerType_secondChange: + case rocky_eventListenerType_minuteChange: + case rocky_eventListenerType_hourChange: + case rocky_eventListenerType_dayChange: + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running time change callback setup..."); + break; + default: + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "No additional work required."); + break; + } + + return event; +} + +void rocky_eventHandle(rocky_eventListenerType type) +{ +} \ No newline at end of file diff --git a/rwatch/js/rocky_js.c b/rwatch/js/rocky_js.c index f7770fca..427aef90 100644 --- a/rwatch/js/rocky_js.c +++ b/rwatch/js/rocky_js.c @@ -1,13 +1,25 @@ #include "rebbleos.h" #include "rocky_js.h" -#if defined(REBBLE_PLATFORM_SNOWY) || defined(REBBLE_PLATFORM_SNOWY) +// TODO: Change the other 'defined' to match chalk, diorite +#if defined(REBBLE_PLATFORM_SNOWY) || defined(REBBLE_PLATFORM_SNOWY) || defined(REBBLE_PLATFORM_SNOWY) -#include "jerryscript.h" +#include "jerry-api.h" +#include "jcontext.h" +#include "jmem-allocator.h" -void *rocky_jerry_ctx_alloc(size_t size, void *userdata) +#include "rocky_lib.h" + + +void rocky_loop() { - return app_malloc(size); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Starting graphics..."); + Window *wnd = window_create(); + window_stack_push(wnd, true); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Starting app loop..."); + app_event_loop(); + window_destroy(wnd); + appmanager_app_quit(); } void rocky_event_loop_with_resource(uint32_t resource_id) @@ -36,6 +48,7 @@ void rocky_event_loop_with_resource(uint32_t resource_id) } resource_load(snapHandle, snapBuffer, snapSize); + // TODO: Fix resource_load signature /* if (resource_load(snapHandle, snapBuffer, snapSize) != snapSize) { @@ -60,40 +73,100 @@ void rocky_event_loop_with_resource(uint32_t resource_id) return; } - uint32_t *snapshot = snapBuffer + 12; - *(snapshot + 1) = 6u; - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "snapshot %p now %p", snapBuffer, snapshot); - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "JS Snapshot Resource loaded successfully."); - - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Creating JavaScript Context..."); + // Skip ahead to actual JerryScript snapshot(format v6). + uint32_t *snapshot = (uint32_t *)(snapBuffer + 8); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "JS Snapshot Resource loaded successfully.", *snapshot); - app_running_thread *this_thread = appmanager_get_current_thread(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Creating JerryScript Context..."); + jerry_global_context = app_calloc(1, sizeof(jerry_context_t)); - this_thread->js_context = jerry_create_context(64 * 1024, rocky_jerry_ctx_alloc, NULL); - if (this_thread->js_context == NULL) + if (jerry_global_context == NULL) { APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "JavaScript Context creation failed."); app_free(snapBuffer); return; } + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Allocating JerryScript Heap..."); + uint8_t *heap_loc = app_calloc(1, sizeof(jmem_heap_t) + JMEM_ALIGNMENT); // Extra space needed in case of alignment + if (heap_loc == NULL) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Heap allocation failed."); + app_free(snapBuffer); + app_free(jerry_global_context); + return; + } + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Aligning JerryScript Heap to %d bytes from 0x%p...", JMEM_ALIGNMENT, heap_loc); + uint8_t *aligned_loc = heap_loc; + while ((uint32_t)aligned_loc % JMEM_ALIGNMENT != 0) + aligned_loc += 1; + jerry_global_heap = (jmem_heap_t *)aligned_loc; + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Aligned by %d bytes to 0x%p.", aligned_loc - heap_loc, aligned_loc); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Allocating JerryScript Hash Table..."); + jerry_global_hash_table = app_calloc(1, sizeof(jerry_hash_table_t)); + if (jerry_global_hash_table == NULL) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Global hash table allocation failed."); + app_free(snapBuffer); + app_free(jerry_global_context); + app_free(heap_loc); + return; + } + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Starting JavaScript..."); jerry_init(JERRY_INIT_EMPTY); - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running JavaScript Snapshot..."); - jerry_value_t out = jerry_exec_snapshot(snapshot, snapSize - 12, 0, 0); - if(jerry_get_error_type(out) != JERRY_ERROR_NONE){ - jerry_value_t val = jerry_get_value_from_error(out, false); - jerry_value_t msgV = jerry_get_property(val, jerry_create_string("message")); - char msg[256]; - jerry_string_to_char_buffer(msgV, msg, 255); - APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Program execution failed. JavaScript engine reported error type %d. Error value %s.", jerry_get_error_type(out), msg); + rocky_lib_build(); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running JavaScript Snapshot:"); + jerry_value_t out = jerry_exec_snapshot(snapshot, snapSize - 8, false); + if (jerry_value_has_error_flag(out)) + { + char error[128]; + if (jerry_value_is_undefined(out)) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "UNDEF", error); + } + jerry_value_t msg = jerry_get_property(out, jerry_create_string("message")); + jerry_string_to_char_buffer(msg, error, 256); + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "JavaScript program errored out: %s", error); + + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Cleaning up..."); + jerry_cleanup(); app_free(snapBuffer); - app_free(this_thread->js_context); + app_free(jerry_global_context); + app_free(heap_loc); + app_free(jerry_global_hash_table); + appmanager_app_quit(); return; } + char snapOut[128]; + jerry_string_to_char_buffer(jerry_value_to_string(out), snapOut, 256); + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "JavaScript program result: %s", snapOut); + + if (appmanager_get_current_thread()->rocky_state.fataled) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "JavaScript Engine fatal error."); + + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Cleaning up..."); + jerry_cleanup(); + app_free(snapBuffer); + app_free(jerry_global_context); + app_free(heap_loc); + app_free(jerry_global_hash_table); + appmanager_app_quit(); + return; + } + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Snapshot execution successful."); + rocky_loop(); + + app_free(snapBuffer); + app_free(jerry_global_context); + app_free(heap_loc); + app_free(jerry_global_hash_table); } #else void rocky_event_loop_with_resource(uint32_t resource_id) diff --git a/rwatch/js/rocky_js.h b/rwatch/js/rocky_js.h index e80e48db..b68bc736 100644 --- a/rwatch/js/rocky_js.h +++ b/rwatch/js/rocky_js.h @@ -10,4 +10,9 @@ #include +typedef struct { + int fataled; +} rocky_thread_state; + + void rocky_event_loop_with_resource(uint32_t resource_id); \ No newline at end of file diff --git a/rwatch/js/rocky_lib.c b/rwatch/js/rocky_lib.c index e69de29b..e1e09ac9 100644 --- a/rwatch/js/rocky_lib.c +++ b/rwatch/js/rocky_lib.c @@ -0,0 +1,162 @@ +#include "rebbleos.h" +#include "rocky_lib.h" + +#include "jcontext.h" + +#define ROCKY_TYPE_SPEC_PRINT(val, type) \ + if (jerry_value_is_##type((val))) \ + { \ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Variable " #val " is " #type "."); \ + } +#define ROCKY_TYPE_PRINT(val) \ + ROCKY_TYPE_SPEC_PRINT(val, array); \ + ROCKY_TYPE_SPEC_PRINT(val, boolean); \ + ROCKY_TYPE_SPEC_PRINT(val, constructor); \ + ROCKY_TYPE_SPEC_PRINT(val, function); \ + ROCKY_TYPE_SPEC_PRINT(val, number); \ + ROCKY_TYPE_SPEC_PRINT(val, null); \ + ROCKY_TYPE_SPEC_PRINT(val, object); \ + ROCKY_TYPE_SPEC_PRINT(val, string); \ + ROCKY_TYPE_SPEC_PRINT(val, undefined); + +jerry_value_t rocky_lib_on(jerry_value_t func, jerry_value_t this, jerry_value_t *args, jerry_length_t count) +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Call to rocky.on / rocky.addEventListener with %d args.", count); + + if (count < 2) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener argument count invalid."); + return jerry_create_error(JERRY_ERROR_TYPE, jerry_create_string("Event Invalid")); + } + + char type[33]; + for (int i = 0; i < 33; i++) + type[i] = '\0'; + + int typeLen = jerry_string_to_char_buffer(args[0], type, 32); + if (typeLen == 0) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener type invalid."); + return jerry_create_error(JERRY_ERROR_TYPE, jerry_create_string("Event Invalid")); + } + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener for '%s' requested.", type); + + rocky_eventListener *event = rocky_eventRegister(type, args[1]); + if (event == NULL) + { + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener addition failed.", type); + return jerry_create_error(JERRY_ERROR_TYPE, jerry_create_string("Event Invalid")); + } + + return jerry_create_undefined(); +} + +jerry_value_t rocky_lib_off(jerry_value_t func, jerry_value_t this, jerry_value_t *args, jerry_length_t count) +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Call to rocky.off / rocky.removeEventListener with %d args.", count); +} + +jerry_value_t rocky_lib_postMessage(jerry_value_t func, jerry_value_t this, jerry_value_t *args, jerry_length_t count) +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Call to rocky.postMessage with %d args.", count); +} + +jerry_value_t rocky_lib_requestDraw(jerry_value_t func, jerry_value_t this, jerry_value_t *args, jerry_length_t count) +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Call to rocky.requestDraw with %d args.", count); +} + +void rocky_lib_addWatchInfo(jerry_value_t rocky) +{ + jerry_value_t objectName = jerry_create_string("watchInfo"); + jerry_value_t object = jerry_create_object(); + jerry_set_property(rocky, objectName, object); + jerry_release_value(objectName); + + jerry_value_t modelName = jerry_create_string("model"); + jerry_value_t model = jerry_create_string("pebble_time_steel_black_22mm"); + jerry_set_property(object, modelName, model); + jerry_release_value(modelName); + jerry_release_value(model); + + jerry_value_t platformName = jerry_create_string("platform"); + jerry_value_t platform = jerry_create_string("basalt"); // TODO: The other platforms (chalk, diorite) + jerry_set_property(object, platformName, platform); + jerry_release_value(platformName); + jerry_release_value(platform); + + jerry_value_t languageName = jerry_create_string("language"); + jerry_value_t language = jerry_create_string("en-US"); // TODO: Actually implement this, unlike Pebble + jerry_set_property(object, languageName, language); + jerry_release_value(platformName); + jerry_release_value(platform); + + //jerry_value_t firmwareName = jerry_create_string("firmware"); + //jerry_value_t firmwareObject = jerry_create_object(); + + //jerry_set_property(object, platformName, platform); + //jerry_release_value(platformName); + //jerry_release_value(platform); + + jerry_release_value(object); +} + +void rocky_lib_build() +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Creating Rocky Library..."); + jerry_value_t global = jerry_get_global_object(); + jerry_value_t libName = jerry_create_string((const jerry_char_t *)"_rocky"); + jerry_value_t libObject = jerry_create_object(); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Committing to JavaScript Global Environment..."); + jerry_set_property(global, libName, libObject); + jerry_release_value(global); + jerry_release_value(libName); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding function 'rocky.on'..."); + jerry_value_t libOnName = jerry_create_string((const jerry_char_t *)"on"); + jerry_value_t libOnFunc = jerry_create_external_function(rocky_lib_on); + jerry_set_property(libObject, libOnName, libOnFunc); + jerry_release_value(libOnName); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding alias 'rocky.addEventListener'..."); + jerry_value_t libAddEventListenerName = jerry_create_string((const jerry_char_t *)"addEventListener"); + jerry_set_property(libObject, libAddEventListenerName, libOnFunc); + jerry_release_value(libAddEventListenerName); + jerry_release_value(libOnFunc); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding function 'rocky.off'..."); + jerry_value_t libOffName = jerry_create_string((const jerry_char_t *)"off"); + jerry_value_t libOffFunc = jerry_create_external_function(rocky_lib_off); + jerry_set_property(libObject, libOffName, libOffFunc); + jerry_release_value(libOffName); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding alias 'rocky.removeEventListener'..."); + jerry_value_t libRemoveEventListenerName = jerry_create_string((const jerry_char_t *)"removeEventListener"); + jerry_set_property(libObject, libRemoveEventListenerName, libOffFunc); + jerry_release_value(libRemoveEventListenerName); + jerry_release_value(libOffFunc); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding function 'rocky.postMessage'..."); + jerry_value_t libPostMessageName = jerry_create_string((const jerry_char_t *)"postMessage"); + jerry_value_t libPostMessageFunc = jerry_create_external_function(rocky_lib_postMessage); + jerry_set_property(libObject, libPostMessageName, libPostMessageFunc); + jerry_release_value(libPostMessageName); + jerry_release_value(libPostMessageFunc); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding function 'rocky.requestDraw'..."); + jerry_value_t libRequestDrawName = jerry_create_string((const jerry_char_t *)"requestDraw"); + jerry_value_t libRequestDrawFunc = jerry_create_external_function(rocky_lib_requestDraw); + jerry_set_property(libObject, libRequestDrawName, libRequestDrawFunc); + jerry_release_value(libRequestDrawName); + jerry_release_value(libRequestDrawFunc); + + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Adding object 'rocky.watchInfo'..."); + rocky_lib_addWatchInfo(libObject); + + //TODO: userPreferences + + jerry_release_value(libObject); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Done building Rocky library."); +} diff --git a/rwatch/js/rocky_lib.h b/rwatch/js/rocky_lib.h new file mode 100644 index 00000000..ed17d728 --- /dev/null +++ b/rwatch/js/rocky_lib.h @@ -0,0 +1,44 @@ +#pragma once +/* rocky_lib.h + * + * Rocky.js (On-watch JavaScript) Implementation + * Rocky API Library + * RebbleOS + * + * Author: Davit Markarian + */ + +#include "jerry-api.h" +#include "node_list.h" +#include "rocky_canvas.h" + +typedef enum +{ + rocky_eventListenerType_UNKNOWN, + rocky_eventListenerType_draw, + rocky_eventListenerType_secondChange, + rocky_eventListenerType_minuteChange, + rocky_eventListenerType_hourChange, + rocky_eventListenerType_dayChange, + rocky_eventListenerType_memoryPressure, + rocky_eventListenerType_message, + rocky_eventListenerType_postMessageConnected, + rocky_eventListenerType_postMessageDisconnected, + rocky_eventListenerType_postMessageError, + +} rocky_eventListenerType; + +extern const char* const rocky_eventListenerTypeStrings[]; + +typedef struct +{ + rocky_eventListenerType type; + jerry_value_t callback; + list_node node; +} rocky_eventListener; + +rocky_eventListener *rocky_eventRegister(char *type, jerry_value_t cb); +rocky_eventListener *rocky_eventRemove(char *type, jerry_value_t cb); +void rocky_eventHandle(rocky_eventListenerType type); + +void rocky_lib_build(); \ No newline at end of file diff --git a/rwatch/js/rocky_port.c b/rwatch/js/rocky_port.c index 696490ac..7653368c 100644 --- a/rwatch/js/rocky_port.c +++ b/rwatch/js/rocky_port.c @@ -1,81 +1,72 @@ +#include "jerry-api.h" +#include "jerry-port.h" #include "rebbleos.h" -#include "rocky_port.h" +#include +#include void jerry_port_fatal(jerry_fatal_code_t code) { SYS_LOG("rocky", APP_LOG_LEVEL_ERROR, "VM Fatal Error Code %d. Quitting.", code); + appmanager_get_current_thread()->rocky_state.fataled = true; appmanager_app_quit(); } +const char *logLevelString[] = { + [JERRY_LOG_LEVEL_ERROR] = "error", + [JERRY_LOG_LEVEL_WARNING] = "warning", + [JERRY_LOG_LEVEL_DEBUG] = "debug", + [JERRY_LOG_LEVEL_TRACE] = "trace", +}; + +extern int vsfmt(char *buf, unsigned int len, const char *ifmt, va_list ap); + void jerry_port_log(jerry_log_level_t level, const char *fmt, ...) { - LogLevel rLevel; + LogLevel appLevel; switch (level) { case JERRY_LOG_LEVEL_ERROR: - rLevel = APP_LOG_LEVEL_ERROR; + appLevel = APP_LOG_LEVEL_ERROR; break; case JERRY_LOG_LEVEL_WARNING: - rLevel = APP_LOG_LEVEL_WARNING; + appLevel = APP_LOG_LEVEL_WARNING; break; case JERRY_LOG_LEVEL_DEBUG: - rLevel = APP_LOG_LEVEL_DEBUG; + appLevel = APP_LOG_LEVEL_DEBUG; break; case JERRY_LOG_LEVEL_TRACE: - rLevel = APP_LOG_LEVEL_DEBUG_VERBOSE; + appLevel = APP_LOG_LEVEL_DEBUG_VERBOSE; break; default: - rLevel = APP_LOG_LEVEL_INFO; + appLevel = APP_LOG_LEVEL_INFO; } - SYS_LOG("rocky", rLevel, "JerryScript log with level %d. NOTE: Logging unavailable", level); -} -void jerry_port_print_char(char c) -{ - SYS_LOG("rocky", APP_LOG_LEVEL_INFO, "JerryScript char: %c", c); + va_list parts; + va_start(parts, fmt); + char outBuffer[256]; + vsfmt(outBuffer, 256, fmt, parts); + SYS_LOG("rocky", appLevel, "js:%s> %s", logLevelString[level], outBuffer); + va_end(parts); } -uint8_t *jerry_port_read_source(const char *file_name_p, size_t *out_size_p) -{ - return NULL; -} -void jerry_port_release_source(uint8_t *buffer_p) +void jerry_port_console(const char *fmt, ...) { - free(buffer_p); + va_list parts; + va_start(parts, fmt); + char outBuffer[256]; + vsfmt(outBuffer, 256, fmt, parts); + SYS_LOG("rocky", APP_LOG_LEVEL_INFO, "js> %s", outBuffer); + va_end(parts); } -size_t jerry_port_normalize_path(const char *in_path_p, char *out_buf_p, size_t out_buf_size, char *base_file_p) +bool jerry_port_get_time_zone(jerry_time_zone_t *tz) { - const size_t len = strnlen(in_path_p, out_buf_size); - if (len < out_buf_size) - { - strncpy(out_buf_p, in_path_p, out_buf_size); - return len; - } - - return 0; -} -jerry_value_t jerry_port_get_native_module(jerry_value_t name) -{ - return jerry_create_undefined(); + tz->offset = 0; + tz->daylight_saving_time = rebble_time_get_tm()->tm_isdst; + return true; } -double jerry_port_get_local_time_zone_adjustment(double unix_ms, bool is_utc) -{ - return 0; -} double jerry_port_get_current_time() { - return 0; -} - -struct jerry_context_t *jerry_port_get_current_context() -{ - app_running_thread *this_thread = appmanager_get_current_thread(); - return this_thread->js_context; -} - -void jerry_port_sleep(uint32_t sleep_time) -{ - APP_LOG("rocky", APP_LOG_LEVEL_WARNING, "Sleep not available"); + return (double)rcore_get_time(); } \ No newline at end of file diff --git a/rwatch/js/rocky_port.h b/rwatch/js/rocky_port.h deleted file mode 100644 index 5ff863c2..00000000 --- a/rwatch/js/rocky_port.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -/* rockyjs.h - * - * Rocky.js (On-watch JavaScript) Implementation - * JerryScript Port Functions - * - * RebbleOS - * - * Author: Davit Markarian - */ - -#include "jerryscript-port.h" - -void jerry_port_fatal(jerry_fatal_code_t code); - -void jerry_port_log(jerry_log_level_t level, const char *fmt, ...); -void jerry_port_print_char(char c); - -uint8_t *jerry_port_read_source(const char *file_name_p, size_t *out_size_p); -void jerry_port_release_source(uint8_t *buffer_p); -size_t jerry_port_normalize_path(const char *in_path_p, char *out_buf_p, size_t out_buf_size, char *base_file_p); -jerry_value_t jerry_port_get_native_module(jerry_value_t name); - -double jerry_port_get_local_time_zone_adjustment(double unix_ms, bool is_utc); -double jerry_port_get_current_time(); - -struct jerry_context_t *jerry_port_get_current_context(); - -void jerry_port_sleep(uint32_t sleep_time); From ffb1ce96c87884df57296c20641f7048ed4f9a82 Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Sat, 21 Mar 2020 20:49:16 +0100 Subject: [PATCH 09/10] Removed submodule lib/jerryscript --- .gitmodules | 2 +- lib/jerryscript | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 160000 lib/jerryscript diff --git a/.gitmodules b/.gitmodules index ae7e487c..c21fc4fa 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,4 +12,4 @@ url = ../../pebble-dev/libpebble2 [submodule "lib/jerryscript"] path = lib/jerryscript - url = https://github.com/udxs/jerryscript.git + url = https://github.com/UDXS/jerryscript.git diff --git a/lib/jerryscript b/lib/jerryscript deleted file mode 160000 index 6c3a42ec..00000000 --- a/lib/jerryscript +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6c3a42ec4802712d5182281d437b96cec7e1b49d From de7203c0619047ad0f682a09f575e67e786d6a60 Mon Sep 17 00:00:00 2001 From: Davit Markarian Date: Thu, 11 Jun 2020 18:04:19 +0200 Subject: [PATCH 10/10] Library Additions --- lib/jerryscript | 1 + lib/neographics | 2 +- res | 2 +- rwatch/js/rocky_canvas.h | 9 +- rwatch/js/rocky_event.c | 271 +++++++++++++++++++++++++-------------- rwatch/js/rocky_js.h | 3 + rwatch/js/rocky_lib.c | 4 +- rwatch/js/rocky_lib.h | 6 +- 8 files changed, 190 insertions(+), 108 deletions(-) create mode 160000 lib/jerryscript diff --git a/lib/jerryscript b/lib/jerryscript new file mode 160000 index 00000000..9bef6be1 --- /dev/null +++ b/lib/jerryscript @@ -0,0 +1 @@ +Subproject commit 9bef6be1875cb0e9221f56211bfd5bdee445776b diff --git a/lib/neographics b/lib/neographics index 0b74ee50..2996647d 160000 --- a/lib/neographics +++ b/lib/neographics @@ -1 +1 @@ -Subproject commit 0b74ee50784f55e90cdbbfcd90b937324938ef24 +Subproject commit 2996647d76bb2a64ebeb9a45ce9e37c01ab721ee diff --git a/res b/res index 264a389c..7d16060d 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 264a389c031a5d3a5f5e568d62e59e1c347bb2c1 +Subproject commit 7d16060dd33914274c545cfde57b4bc9a6bae3aa diff --git a/rwatch/js/rocky_canvas.h b/rwatch/js/rocky_canvas.h index cd7a8a3d..827c3e03 100644 --- a/rwatch/js/rocky_canvas.h +++ b/rwatch/js/rocky_canvas.h @@ -10,6 +10,7 @@ */ #include "rebbleos.h" +#include "node_list.h" typedef uint8_t RockyCanvasFontSize; @@ -88,12 +89,10 @@ typedef struct typedef struct { RockyCanvasPath path; - + list_node node; } RockyCanvasState; typedef struct { - RockyCanvasState current; - uint8_t top; - RockyCanvasState saved[8]; // Do people even use canvas save/restore? Either way, 8 states should be enough. -} RockyCanvasContext; \ No newline at end of file + RockyCanvasState state; +} RockyCanvas; \ No newline at end of file diff --git a/rwatch/js/rocky_event.c b/rwatch/js/rocky_event.c index 59ac0650..e6f681a6 100644 --- a/rwatch/js/rocky_event.c +++ b/rwatch/js/rocky_event.c @@ -1,126 +1,205 @@ #include "rocky_lib.h" #include "connection_service.h" +#include "rebble_time.h" #include const char *const rocky_eventListenerTypeStrings[] = { - "UNKNOWN", - "draw", - "secondchange", - "minutechange", - "hourchange", - "daychange", - "memorypressure", - "message", - "postmessageconnected", - "postmessagedisconnected", - "postmessageerror" + "UNKNOWN", + "draw", + "secondchange", + "minutechange", + "hourchange", + "daychange", + "memorypressure", + "message", + "postmessageconnected", + "postmessagedisconnected", + "postmessageerror" }; +// TODO: Move to thread state static list_head rocky_eventList = LIST_HEAD(rocky_eventList); #define ROCKY_EVENT_TYPES_COUNT (sizeof(rocky_eventListenerTypeStrings) / sizeof(char *)) int rocky_eventList_count(rocky_eventListenerType type) { - int count = 0; - rocky_eventListener *listener; - list_foreach(listener, &rocky_eventList, rocky_eventListener, node) - { - if (listener->type == type) - { - count++; - } - } - - return count; + int count = 0; + rocky_eventListener *listener; + list_foreach(listener, &rocky_eventList, rocky_eventListener, node) + { + if (listener->type == type) + count++; + } + + return count; } void rocky_eventHandleConnection(bool connected) { - if (connected) - rocky_eventHandle(rocky_eventListenerType_postMessageConnected); - else - rocky_eventHandle(rocky_eventListenerType_postMessageDisconnected); + return; + jerry_value_t undef = jerry_create_undefined(); + if (connected) + rocky_eventHandle(rocky_eventListenerType_postMessageConnected, undef); + else + rocky_eventHandle(rocky_eventListenerType_postMessageDisconnected, undef); + jerry_release_value(undef); +} + +void rocky_eventHandleTickTimer(struct tm *tick_time, TimeUnits units_changed) +{ + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Tick Timer event fired with flags 0x%x", units_changed); + + // TODO: better Date assembly + /* + jerry_value_t global = jerry_get_global_object(); + jerry_value_t jsDateName = jerry_create_string("Date"); + jerry_value_t jsDate = jerry_get_property(global, jsDateName); + jerry_release_value(jsDateName); + jerry_release_value(global); + + if (jerry_value_is_undefined(jsDate)) + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Date bad!"); + + jerry_value_t time = jerry_create_object(); + jerry_release_value(jsDate); */ + + jerry_value_t time = jerry_create_undefined(); + if ((units_changed & SECOND_UNIT) != 0) + rocky_eventHandle(rocky_eventListenerType_secondChange, time); + if ((units_changed & MINUTE_UNIT) != 0) + rocky_eventHandle(rocky_eventListenerType_minuteChange, time); + if ((units_changed & HOUR_UNIT) != 0) + rocky_eventHandle(rocky_eventListenerType_hourChange, time); + if ((units_changed & DAY_UNIT) != 0) + rocky_eventHandle(rocky_eventListenerType_dayChange, time); + + jerry_release_value(time); } void rocky_eventManageConnections(rocky_eventListener *event) { - if (rocky_eventList_count(rocky_eventListenerType_postMessageConnected) + rocky_eventList_count(rocky_eventListenerType_postMessageDisconnected) == 1) - { - connection_service_subscribe((ConnectionHandlers){.pebble_app_connection_handler = NULL, .pebblekit_connection_handler = rocky_eventHandleConnection}); - bool connected = connection_service_peek_pebblekit_connection(); - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Subscribing to Connection Service. Running Callback..."); - if(connected && event->type == rocky_eventListenerType_postMessageConnected) jerry_run(event->callback); - else if(!connected && event->type == rocky_eventListenerType_postMessageDisconnected) jerry_run(event->callback); - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "'%s' callback executed immediately.", rocky_eventListenerTypeStrings[event->type]); - } - else if (rocky_eventList_count(rocky_eventListenerType_postMessageConnected) + rocky_eventList_count(rocky_eventListenerType_postMessageDisconnected) == 0) - { - connection_service_unsubscribe(); - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Unsubscribed from Connection Service."); - } + if (rocky_eventList_count(rocky_eventListenerType_postMessageConnected) + rocky_eventList_count(rocky_eventListenerType_postMessageDisconnected) == 1) + { + connection_service_subscribe((ConnectionHandlers){.pebble_app_connection_handler = NULL, .pebblekit_connection_handler = rocky_eventHandleConnection}); + bool connected = connection_service_peek_pebblekit_connection(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Subscribing to Connection Service. Running Callback..."); + if (connected && event->type == rocky_eventListenerType_postMessageConnected) + jerry_run(event->callback); + else if (!connected && event->type == rocky_eventListenerType_postMessageDisconnected) + jerry_run(event->callback); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "'%s' callback executed immediately.", rocky_eventListenerTypeStrings[event->type]); + } + else if (rocky_eventList_count(rocky_eventListenerType_postMessageConnected) + rocky_eventList_count(rocky_eventListenerType_postMessageDisconnected) == 0) + { + connection_service_unsubscribe(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Unsubscribed from Connection Service."); + } +} + +void rocky_eventManageTickTimer(rocky_eventListener *event) +{ + TimeUnits units = 0; + if (rocky_eventList_count(rocky_eventListenerType_secondChange) != 0) + units |= SECOND_UNIT; + if (rocky_eventList_count(rocky_eventListenerType_minuteChange) != 0) + units |= MINUTE_UNIT; + if (rocky_eventList_count(rocky_eventListenerType_hourChange) != 0) + units |= HOUR_UNIT; + if (rocky_eventList_count(rocky_eventListenerType_dayChange) != 0) + units |= DAY_UNIT; + + if (units != 0) + { + tick_timer_service_subscribe(units, rocky_eventHandleTickTimer); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Subscribed to Tick Timer Service with flags 0x%x.", units); + } + else + { + tick_timer_service_unsubscribe(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Unsubscribed from Tick Timer Service."); + } } rocky_eventListener *rocky_eventRegister(char *type, jerry_value_t callback) { - rocky_eventListener *event = app_malloc(sizeof(rocky_eventListener)); - if (event == NULL) - { - return NULL; - } - - event->type = rocky_eventListenerType_UNKNOWN; - - for (int i = 1; i < ROCKY_EVENT_TYPES_COUNT; i++) - { - if (strcmp(type, rocky_eventListenerTypeStrings[i]) == 0) - { - event->type = i; - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener type matched as rocky_eventListenerType[%d].", i); - } - } - - if (type == rocky_eventListenerType_UNKNOWN) - { - APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener type unknown."); - app_free(event); - return NULL; - } - - if (!jerry_value_is_function(callback)) - { - APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener callback not a function."); - app_free(event); - return NULL; - } - - jerry_acquire_value(callback); - event->callback = callback; - - list_insert_tail(&rocky_eventList, &event->node); - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener added to list."); - - switch (event->type) - { - case rocky_eventListenerType_postMessageConnected: - case rocky_eventListenerType_postMessageDisconnected: - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running message connection callback setup..."); - rocky_eventManageConnections(event); - case rocky_eventListenerType_secondChange: - case rocky_eventListenerType_minuteChange: - case rocky_eventListenerType_hourChange: - case rocky_eventListenerType_dayChange: - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running time change callback setup..."); - break; - default: - APP_LOG("rocky", APP_LOG_LEVEL_INFO, "No additional work required."); - break; - } - - return event; + rocky_eventListener *event = app_malloc(sizeof(rocky_eventListener)); + if (event == NULL) + { + return NULL; + } + + event->type = rocky_eventListenerType_UNKNOWN; + + for (int i = 1; i < ROCKY_EVENT_TYPES_COUNT; i++) + { + if (strcmp(type, rocky_eventListenerTypeStrings[i]) == 0) + { + event->type = i; + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener type matched as rocky_eventListenerType[%d].", i); + } + } + + if (event->type == rocky_eventListenerType_UNKNOWN) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener type unknown."); + app_free(event); + return NULL; + } + + if (!jerry_value_is_function(callback)) + { + APP_LOG("rocky", APP_LOG_LEVEL_ERROR, "Event listener callback not a function."); + app_free(event); + return NULL; + } + + event->callback = jerry_acquire_value(callback); + + list_insert_tail(&rocky_eventList, &event->node); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Event listener added to list."); + + switch (event->type) + { + case rocky_eventListenerType_postMessageConnected: + case rocky_eventListenerType_postMessageDisconnected: + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running message connection callback setup..."); + rocky_eventManageConnections(event); + case rocky_eventListenerType_secondChange: + case rocky_eventListenerType_minuteChange: + case rocky_eventListenerType_hourChange: + case rocky_eventListenerType_dayChange: + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running tick timer callback setup..."); + rocky_eventManageTickTimer(event); + break; + default: + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "No additional work required."); + break; + } + + return event; } -void rocky_eventHandle(rocky_eventListenerType type) +void rocky_eventHandle(rocky_eventListenerType type, jerry_value_t arg) { + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "Running handlers for event '%s'...", rocky_eventListenerTypeStrings[type]); + + rocky_eventListener *listener; + int count = 0; + list_foreach(listener, &rocky_eventList, rocky_eventListener, node) + { + if (listener->type == type) + { + count++; + APP_LOG("rocky", APP_LOG_LEVEL_INFO, " - Handler 0x%x", (uint32_t)listener->callback); + + jerry_value_t jsThis = jerry_create_undefined(); + jerry_value_t args[] = {arg}; + jerry_call_function(listener->callback, jsThis, args, 1); + //jerry_release_value(jsThis); + } + } + //jerry_cleanup(); + APP_LOG("rocky", APP_LOG_LEVEL_INFO, "%d handler(s) for '%s' executed.", count, rocky_eventListenerTypeStrings[type]); } \ No newline at end of file diff --git a/rwatch/js/rocky_js.h b/rwatch/js/rocky_js.h index b68bc736..1afbee1f 100644 --- a/rwatch/js/rocky_js.h +++ b/rwatch/js/rocky_js.h @@ -9,9 +9,12 @@ */ #include +//#include "window.h" +//#include "rocky_lib.h" typedef struct { int fataled; + // TODO: Move eventList, window here. } rocky_thread_state; diff --git a/rwatch/js/rocky_lib.c b/rwatch/js/rocky_lib.c index e1e09ac9..62e1ba1b 100644 --- a/rwatch/js/rocky_lib.c +++ b/rwatch/js/rocky_lib.c @@ -89,8 +89,8 @@ void rocky_lib_addWatchInfo(jerry_value_t rocky) jerry_value_t languageName = jerry_create_string("language"); jerry_value_t language = jerry_create_string("en-US"); // TODO: Actually implement this, unlike Pebble jerry_set_property(object, languageName, language); - jerry_release_value(platformName); - jerry_release_value(platform); + jerry_release_value(languageName); + jerry_release_value(language); //jerry_value_t firmwareName = jerry_create_string("firmware"); //jerry_value_t firmwareObject = jerry_create_object(); diff --git a/rwatch/js/rocky_lib.h b/rwatch/js/rocky_lib.h index ed17d728..ef2c2a64 100644 --- a/rwatch/js/rocky_lib.h +++ b/rwatch/js/rocky_lib.h @@ -37,8 +37,8 @@ typedef struct list_node node; } rocky_eventListener; -rocky_eventListener *rocky_eventRegister(char *type, jerry_value_t cb); -rocky_eventListener *rocky_eventRemove(char *type, jerry_value_t cb); -void rocky_eventHandle(rocky_eventListenerType type); +rocky_eventListener *rocky_eventRegister(char *type, jerry_value_t callback); +rocky_eventListener *rocky_eventRemove(char *type, jerry_value_t callback); +void rocky_eventHandle(rocky_eventListenerType type, jerry_value_t arg); void rocky_lib_build(); \ No newline at end of file