diff --git a/jerry-core/api/jerry-debugger.c b/jerry-core/api/jerry-debugger.c index f64e1f9c3..e05119f40 100644 --- a/jerry-core/api/jerry-debugger.c +++ b/jerry-core/api/jerry-debugger.c @@ -109,6 +109,7 @@ jerry_debugger_init (uint16_t port) /**< server port number */ * @return enum JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED - if the source is not received * JERRY_DEBUGGER_SOURCE_RECEIVED - if a source code received * JERRY_DEBUGGER_SOURCE_END - the end of the source codes + * JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED - the end of the context */ jerry_debugger_wait_and_run_type_t jerry_debugger_wait_and_run_client_source (jerry_value_t *return_value) /**< [out] parse and run return value */ @@ -135,10 +136,21 @@ jerry_debugger_wait_and_run_client_source (jerry_value_t *return_value) /**< [ou break; } + /* Stop executing the current context. */ + if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONTEXT_RESET_MODE)) + { + ret_type = JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED; + JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) + & ~JERRY_DEBUGGER_CONTEXT_RESET_MODE); + break; + } + /* Stop waiting for a new source file. */ if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CLIENT_NO_SOURCE)) { ret_type = JERRY_DEBUGGER_SOURCE_END; + JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) + & ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE); break; } diff --git a/jerry-core/debugger/debugger.c b/jerry-core/debugger/debugger.c index a3235b804..1e8151ed9 100644 --- a/jerry-core/debugger/debugger.c +++ b/jerry-core/debugger/debugger.c @@ -586,6 +586,25 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec return true; } + case JERRY_DEBUGGER_CONTEXT_RESET: + { + if (!(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CLIENT_SOURCE_MODE)) + { + jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Not in client source mode\n"); + jerry_debugger_close_connection (); + return false; + } + + JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t); + + JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE); + JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_CONTEXT_RESET_MODE); + + *resume_exec_p = true; + + return true; + } + default: { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Unexpected message."); diff --git a/jerry-core/debugger/debugger.h b/jerry-core/debugger/debugger.h index 0181c91ad..c07687479 100644 --- a/jerry-core/debugger/debugger.h +++ b/jerry-core/debugger/debugger.h @@ -90,6 +90,7 @@ typedef enum JERRY_DEBUGGER_VM_IGNORE_EXCEPTION = 1u << 4, /**< debugger stop at an exception */ JERRY_DEBUGGER_CLIENT_SOURCE_MODE = 1u << 5, /**< debugger waiting for client code */ JERRY_DEBUGGER_CLIENT_NO_SOURCE = 1u << 6, /**< debugger leaving the client source loop */ + JERRY_DEBUGGER_CONTEXT_RESET_MODE = 1u << 7, /**< debugger and engine reinitialization mode */ } jerry_debugger_flags_t; /** @@ -135,16 +136,17 @@ typedef enum JERRY_DEBUGGER_CLIENT_SOURCE = 6, /**< first message of client source */ JERRY_DEBUGGER_CLIENT_SOURCE_PART = 7, /**< next message of client source */ JERRY_DEBUGGER_NO_MORE_SOURCES = 8, /**< no more sources notification */ + JERRY_DEBUGGER_CONTEXT_RESET = 9, /**< context reset request */ /* The following messages are only available in breakpoint * mode and they switch the engine to run mode. */ - JERRY_DEBUGGER_CONTINUE = 9, /**< continue execution */ - JERRY_DEBUGGER_STEP = 10, /**< next breakpoint, step into functions */ - JERRY_DEBUGGER_NEXT = 11, /**< next breakpoint in the same context */ + JERRY_DEBUGGER_CONTINUE = 10, /**< continue execution */ + JERRY_DEBUGGER_STEP = 11, /**< next breakpoint, step into functions */ + JERRY_DEBUGGER_NEXT = 12, /**< next breakpoint in the same context */ /* The following messages are only available in breakpoint * mode and this mode is kept after the message is processed. */ - JERRY_DEBUGGER_GET_BACKTRACE = 12, /**< get backtrace */ - JERRY_DEBUGGER_EVAL = 13, /**< first message of evaluating a string */ - JERRY_DEBUGGER_EVAL_PART = 14, /**< next message of evaluating a string */ + JERRY_DEBUGGER_GET_BACKTRACE = 13, /**< get backtrace */ + JERRY_DEBUGGER_EVAL = 14, /**< first message of evaluating a string */ + JERRY_DEBUGGER_EVAL_PART = 15, /**< next message of evaluating a string */ } jerry_debugger_header_type_t; /** diff --git a/jerry-core/include/jerryscript-debugger.h b/jerry-core/include/jerryscript-debugger.h index c4f01e0dc..076c2d493 100644 --- a/jerry-core/include/jerryscript-debugger.h +++ b/jerry-core/include/jerryscript-debugger.h @@ -35,6 +35,7 @@ typedef enum JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED = 0, /**< source is not received */ JERRY_DEBUGGER_SOURCE_RECEIVED = 1, /**< a source has been received */ JERRY_DEBUGGER_SOURCE_END = 2, /**< the end of the sources signal received */ + JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED, /**< the context reset request has been received */ } jerry_debugger_wait_and_run_type_t; /** diff --git a/jerry-debugger/jerry-client-ws.html b/jerry-debugger/jerry-client-ws.html index c48e06340..b2d754867 100644 --- a/jerry-debugger/jerry-client-ws.html +++ b/jerry-debugger/jerry-client-ws.html @@ -82,12 +82,13 @@ var JERRY_DEBUGGER_STOP = 5; var JERRY_DEBUGGER_CLIENT_SOURCE = 6; var JERRY_DEBUGGER_CLIENT_SOURCE_PART = 7; var JERRY_DEBUGGER_NO_MORE_SOURCES = 8; -var JERRY_DEBUGGER_CONTINUE = 9; -var JERRY_DEBUGGER_STEP = 10; -var JERRY_DEBUGGER_NEXT = 11; -var JERRY_DEBUGGER_GET_BACKTRACE = 12; -var JERRY_DEBUGGER_EVAL = 13; -var JERRY_DEBUGGER_EVAL_PART = 14; +var JERRY_DEBUGGER_CONTEXT_RESET = 9; +var JERRY_DEBUGGER_CONTINUE = 10; +var JERRY_DEBUGGER_STEP = 11; +var JERRY_DEBUGGER_NEXT = 12; +var JERRY_DEBUGGER_GET_BACKTRACE = 13; +var JERRY_DEBUGGER_EVAL = 14; +var JERRY_DEBUGGER_EVAL_PART = 15; var textBox = document.getElementById("log"); var commandBox = document.getElementById("command"); diff --git a/jerry-debugger/jerry-client-ws.py b/jerry-debugger/jerry-client-ws.py index cb3a2263b..6622ff3b1 100755 --- a/jerry-debugger/jerry-client-ws.py +++ b/jerry-debugger/jerry-client-ws.py @@ -73,12 +73,13 @@ JERRY_DEBUGGER_STOP = 5 JERRY_DEBUGGER_CLIENT_SOURCE = 6 JERRY_DEBUGGER_CLIENT_SOURCE_PART = 7 JERRY_DEBUGGER_NO_MORE_SOURCES = 8 -JERRY_DEBUGGER_CONTINUE = 9 -JERRY_DEBUGGER_STEP = 10 -JERRY_DEBUGGER_NEXT = 11 -JERRY_DEBUGGER_GET_BACKTRACE = 12 -JERRY_DEBUGGER_EVAL = 13 -JERRY_DEBUGGER_EVAL_PART = 14 +JERRY_DEBUGGER_CONTEXT_RESET = 9 +JERRY_DEBUGGER_CONTINUE = 10 +JERRY_DEBUGGER_STEP = 11 +JERRY_DEBUGGER_NEXT = 12 +JERRY_DEBUGGER_GET_BACKTRACE = 13 +JERRY_DEBUGGER_EVAL = 14 +JERRY_DEBUGGER_EVAL_PART = 15 MAX_BUFFER_SIZE = 128 WEBSOCKET_BINARY_FRAME = 2 diff --git a/jerry-main/main-unix.c b/jerry-main/main-unix.c index c7afe1b1a..9b998a028 100644 --- a/jerry-main/main-unix.c +++ b/jerry-main/main-unix.c @@ -728,22 +728,40 @@ main (int argc, do { - receive_status = jerry_debugger_wait_and_run_client_source (&run_result); - - if (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED) + do { - ret_value = jerry_create_error (JERRY_ERROR_COMMON, - (jerry_char_t *) "Connection aborted before source arrived."); - } + receive_status = jerry_debugger_wait_and_run_client_source (&run_result); - if (receive_status == JERRY_DEBUGGER_SOURCE_END) + if (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED) + { + ret_value = jerry_create_error (JERRY_ERROR_COMMON, + (jerry_char_t *) "Connection aborted before source arrived."); + } + + if (receive_status == JERRY_DEBUGGER_SOURCE_END) + { + jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "No more client source.\n"); + } + + jerry_release_value (run_result); + } + while (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVED); + + if (receive_status == JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED) { - jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "No more client source.\n"); - } + jerry_cleanup (); - jerry_release_value (run_result); + jerry_init (flags); + jerry_debugger_init (debug_port); + + register_js_function ("assert", jerryx_handler_assert); + register_js_function ("gc", jerryx_handler_gc); + register_js_function ("print", jerryx_handler_print); + + ret_value = jerry_create_undefined (); + } } - while (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVED); + while (receive_status == JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED); #endif /* JERRY_DEBUGGER */ }