Support abort in the debugger. (#2273)
Aborts are not caught by catch/finally blocks, so it is possible to stop a script using the debugger. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -30,7 +30,7 @@
|
||||
*/
|
||||
JERRY_STATIC_ASSERT (JERRY_DEBUGGER_MESSAGES_OUT_MAX_COUNT == 27
|
||||
&& JERRY_DEBUGGER_MESSAGES_IN_MAX_COUNT == 19
|
||||
&& JERRY_DEBUGGER_VERSION == 2,
|
||||
&& JERRY_DEBUGGER_VERSION == 3,
|
||||
debugger_version_correlates_to_message_type_count);
|
||||
|
||||
/**
|
||||
@@ -137,38 +137,51 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer to the recei
|
||||
/**
|
||||
* Send result of evaluated expression or throw an error.
|
||||
*
|
||||
* @return true - if no error is occured
|
||||
* @return true - if execution should be resumed
|
||||
* false - otherwise
|
||||
*/
|
||||
static bool
|
||||
jerry_debugger_send_eval_or_throw (const lit_utf8_byte_t *eval_string_p, /**< evaluated string */
|
||||
size_t eval_string_size, /**< evaluated string size */
|
||||
bool *is_eval) /**< [in,out] throw or eval call */
|
||||
jerry_debugger_send_eval (const lit_utf8_byte_t *eval_string_p, /**< evaluated string */
|
||||
size_t eval_string_size) /**< evaluated string size */
|
||||
{
|
||||
JERRY_ASSERT (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED);
|
||||
JERRY_ASSERT (!(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_VM_IGNORE));
|
||||
|
||||
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_IGNORE);
|
||||
ecma_value_t result = ecma_op_eval_chars_buffer (eval_string_p, eval_string_size, true, false);
|
||||
ecma_value_t result = ecma_op_eval_chars_buffer (eval_string_p + 1, eval_string_size - 1, true, false);
|
||||
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_IGNORE);
|
||||
|
||||
if (!ECMA_IS_VALUE_ERROR (result))
|
||||
{
|
||||
if (!*is_eval)
|
||||
if (eval_string_p[0] != JERRY_DEBUGGER_EVAL_EVAL)
|
||||
{
|
||||
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_THROW_ERROR_FLAG);
|
||||
JERRY_CONTEXT (error_value) = result;
|
||||
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_STOP);
|
||||
|
||||
/* Stop where the error is caught. */
|
||||
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_STOP);
|
||||
JERRY_CONTEXT (debugger_stop_context) = NULL;
|
||||
|
||||
if (eval_string_p[0] == JERRY_DEBUGGER_EVAL_THROW)
|
||||
{
|
||||
JERRY_CONTEXT (status_flags) |= ECMA_STATUS_EXCEPTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_CONTEXT (status_flags) &= (uint32_t) ~ECMA_STATUS_EXCEPTION;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ecma_value_t to_string_value = ecma_op_to_string (result);
|
||||
ecma_free_value (result);
|
||||
result = to_string_value;
|
||||
if (!ecma_is_value_string (result))
|
||||
{
|
||||
ecma_value_t to_string_value = ecma_op_to_string (result);
|
||||
ecma_free_value (result);
|
||||
result = to_string_value;
|
||||
}
|
||||
}
|
||||
|
||||
*is_eval = true;
|
||||
ecma_value_t message = result;
|
||||
uint8_t type = JERRY_DEBUGGER_EVAL_OK;
|
||||
|
||||
@@ -190,10 +203,11 @@ jerry_debugger_send_eval_or_throw (const lit_utf8_byte_t *eval_string_p, /**< ev
|
||||
ecma_free_value (result);
|
||||
|
||||
const lit_utf8_byte_t *string_p = lit_get_magic_string_utf8 (id);
|
||||
return jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_RESULT,
|
||||
type,
|
||||
string_p,
|
||||
strlen ((const char *) string_p));
|
||||
jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_RESULT,
|
||||
type,
|
||||
string_p,
|
||||
strlen ((const char *) string_p));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -209,13 +223,13 @@ jerry_debugger_send_eval_or_throw (const lit_utf8_byte_t *eval_string_p, /**< ev
|
||||
ecma_string_t *string_p = ecma_get_string_from_value (message);
|
||||
|
||||
ECMA_STRING_TO_UTF8_STRING (string_p, buffer_p, buffer_size);
|
||||
bool success = jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_RESULT, type, buffer_p, buffer_size);
|
||||
jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_RESULT, type, buffer_p, buffer_size);
|
||||
ECMA_FINALIZE_UTF8_STRING (buffer_p, buffer_size);
|
||||
|
||||
ecma_free_value (message);
|
||||
|
||||
return success;
|
||||
} /* jerry_debugger_send_eval_or_throw */
|
||||
return false;
|
||||
} /* jerry_debugger_send_eval */
|
||||
|
||||
/**
|
||||
* Suspend execution for a given time.
|
||||
@@ -264,7 +278,6 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer to the rece
|
||||
if (*expected_message_type_p != 0)
|
||||
{
|
||||
JERRY_ASSERT (*expected_message_type_p == JERRY_DEBUGGER_EVAL_PART
|
||||
|| *expected_message_type_p == JERRY_DEBUGGER_THROW_PART
|
||||
|| *expected_message_type_p == JERRY_DEBUGGER_CLIENT_SOURCE_PART);
|
||||
|
||||
jerry_debugger_uint8_data_t *uint8_data_p = (jerry_debugger_uint8_data_t *) *message_data_p;
|
||||
@@ -310,20 +323,15 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer to the rece
|
||||
return true;
|
||||
}
|
||||
|
||||
bool result = false;
|
||||
bool is_eval = true;
|
||||
bool result;
|
||||
|
||||
if (*expected_message_type_p == JERRY_DEBUGGER_EVAL_PART)
|
||||
{
|
||||
result = jerry_debugger_send_eval_or_throw (string_p, uint8_data_p->uint8_size, &is_eval);
|
||||
}
|
||||
else if (*expected_message_type_p == JERRY_DEBUGGER_THROW_PART)
|
||||
{
|
||||
is_eval = false;
|
||||
result = jerry_debugger_send_eval_or_throw (string_p, uint8_data_p->uint8_size, &is_eval);
|
||||
if (!is_eval)
|
||||
if (jerry_debugger_send_eval (string_p, uint8_data_p->uint8_size))
|
||||
{
|
||||
*resume_exec_p = true;
|
||||
}
|
||||
result = (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED) != 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -520,7 +528,6 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer to the rece
|
||||
}
|
||||
|
||||
case JERRY_DEBUGGER_EVAL:
|
||||
case JERRY_DEBUGGER_THROW:
|
||||
{
|
||||
if (message_size < sizeof (jerry_debugger_receive_eval_first_t) + 1)
|
||||
{
|
||||
@@ -533,7 +540,6 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer to the rece
|
||||
|
||||
uint32_t eval_size;
|
||||
memcpy (&eval_size, eval_first_p->eval_size, sizeof (uint32_t));
|
||||
bool is_eval = (recv_buffer_p[0] == JERRY_DEBUGGER_EVAL);
|
||||
|
||||
if (eval_size <= JERRY_CONTEXT (debugger_max_receive_size) - sizeof (jerry_debugger_receive_eval_first_t))
|
||||
{
|
||||
@@ -543,13 +549,13 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer to the rece
|
||||
jerry_debugger_close_connection ();
|
||||
return false;
|
||||
}
|
||||
bool ret_val = jerry_debugger_send_eval_or_throw ((lit_utf8_byte_t *) (eval_first_p + 1), eval_size, &is_eval);
|
||||
if (!is_eval)
|
||||
|
||||
if (jerry_debugger_send_eval ((lit_utf8_byte_t *) (eval_first_p + 1), eval_size))
|
||||
{
|
||||
*resume_exec_p = true;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
return (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED) != 0;
|
||||
}
|
||||
|
||||
jerry_debugger_uint8_data_t *eval_uint8_data_p;
|
||||
@@ -566,7 +572,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer to the rece
|
||||
message_size - sizeof (jerry_debugger_receive_eval_first_t));
|
||||
|
||||
*message_data_p = eval_uint8_data_p;
|
||||
*expected_message_type_p = is_eval ? JERRY_DEBUGGER_EVAL_PART : JERRY_DEBUGGER_THROW_PART;
|
||||
*expected_message_type_p = JERRY_DEBUGGER_EVAL_PART;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -703,7 +709,7 @@ jerry_debugger_breakpoint_hit (uint8_t message_type) /**< message type */
|
||||
return;
|
||||
}
|
||||
|
||||
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_BREAKPOINT_MODE);
|
||||
JERRY_DEBUGGER_UPDATE_FLAGS (JERRY_DEBUGGER_BREAKPOINT_MODE, JERRY_DEBUGGER_THROW_ERROR_FLAG);
|
||||
|
||||
jerry_debugger_uint8_data_t *uint8_data = NULL;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user