Skip to content

Commit 1c64c1a

Browse files
authored
Fix inserting pending breakpoints. (#2163)
Before this patch the JS execution is started right after the parsing is completed. The problem is that some parts of the JS code is executed before the debugger had any chance to insert pending breakpoints due to network latency. This patch adds a delay after parsing when at least one pendding breakpoint is available. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg [email protected]
1 parent 40d05cd commit 1c64c1a

File tree

11 files changed

+271
-147
lines changed

11 files changed

+271
-147
lines changed

jerry-core/api/jerry-debugger.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jerry_debugger_stop (void)
4343
if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED)
4444
&& !(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_BREAKPOINT_MODE))
4545
{
46-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_STOP);
46+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_STOP);
4747
JERRY_CONTEXT (debugger_stop_context) = NULL;
4848
}
4949
#endif /* JERRY_DEBUGGER */
@@ -59,7 +59,7 @@ jerry_debugger_continue (void)
5959
if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED)
6060
&& !(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_BREAKPOINT_MODE))
6161
{
62-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_VM_STOP);
62+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_STOP);
6363
JERRY_CONTEXT (debugger_stop_context) = NULL;
6464
}
6565
#endif /* JERRY_DEBUGGER */
@@ -77,11 +77,11 @@ jerry_debugger_stop_at_breakpoint (bool enable_stop_at_breakpoint) /**< enable/d
7777
{
7878
if (enable_stop_at_breakpoint)
7979
{
80-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_IGNORE);
80+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_IGNORE);
8181
}
8282
else
8383
{
84-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_VM_IGNORE);
84+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_IGNORE);
8585
}
8686
}
8787
#else /* !JERRY_DEBUGGER */
@@ -122,7 +122,7 @@ jerry_debugger_wait_for_client_source (jerry_debugger_wait_for_source_callback_t
122122
if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED)
123123
&& !(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_BREAKPOINT_MODE))
124124
{
125-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
125+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
126126
jerry_debugger_uint8_data_t *client_source_data_p = NULL;
127127
jerry_debugger_wait_for_source_status_t ret_type = JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED;
128128

@@ -142,17 +142,15 @@ jerry_debugger_wait_for_client_source (jerry_debugger_wait_for_source_callback_t
142142
if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONTEXT_RESET_MODE))
143143
{
144144
ret_type = JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED;
145-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags)
146-
& ~JERRY_DEBUGGER_CONTEXT_RESET_MODE);
145+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_CONTEXT_RESET_MODE);
147146
break;
148147
}
149148

150149
/* Stop waiting for a new source file. */
151150
if ((JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CLIENT_NO_SOURCE))
152151
{
153152
ret_type = JERRY_DEBUGGER_SOURCE_END;
154-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags)
155-
& ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
153+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
156154
break;
157155
}
158156

jerry-core/debugger/debugger-ws.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jerry_debugger_close_connection_tcp (bool log_error) /**< log error */
6969
{
7070
JERRY_ASSERT (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED);
7171

72-
JERRY_CONTEXT (debugger_flags) = (uint8_t) JERRY_DEBUGGER_VM_IGNORE;
72+
JERRY_CONTEXT (debugger_flags) = JERRY_DEBUGGER_VM_IGNORE;
7373

7474
if (log_error)
7575
{
@@ -360,7 +360,7 @@ jerry_debugger_accept_connection (void)
360360

361361
close (server_socket);
362362

363-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_CONNECTED);
363+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_CONNECTED);
364364

365365
bool is_handshake_ok = false;
366366

@@ -399,7 +399,7 @@ jerry_debugger_accept_connection (void)
399399

400400
jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "Connected from: %s\n", inet_ntoa (addr.sin_addr));
401401

402-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_STOP);
402+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_STOP);
403403
JERRY_CONTEXT (debugger_stop_context) = NULL;
404404

405405
return true;
@@ -444,7 +444,7 @@ jerry_debugger_receive (jerry_debugger_uint8_data_t **message_data_p) /**< [out]
444444
{
445445
JERRY_ASSERT (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED);
446446

447-
JERRY_ASSERT (message_data_p != NULL ? (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_RECEIVE_DATA_MODE)
447+
JERRY_ASSERT (message_data_p != NULL ? !!(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_RECEIVE_DATA_MODE)
448448
: !(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_RECEIVE_DATA_MODE));
449449

450450
JERRY_CONTEXT (debugger_message_delay) = JERRY_DEBUGGER_MESSAGE_FREQUENCY;

jerry-core/debugger/debugger.c

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
* The number of message types in the debugger should reflect the
3535
* debugger versioning.
3636
*/
37-
JERRY_STATIC_ASSERT (JERRY_DEBUGGER_MESSAGES_OUT_MAX_COUNT == 26
38-
&& JERRY_DEBUGGER_MESSAGES_IN_MAX_COUNT == 16
37+
JERRY_STATIC_ASSERT (JERRY_DEBUGGER_MESSAGES_OUT_MAX_COUNT == 27
38+
&& JERRY_DEBUGGER_MESSAGES_IN_MAX_COUNT == 18
3939
&& JERRY_DEBUGGER_VERSION == 1,
4040
debugger_version_correlates_to_message_type_count);
4141

@@ -154,9 +154,9 @@ jerry_debugger_send_eval (const lit_utf8_byte_t *eval_string_p, /**< evaluated s
154154
JERRY_ASSERT (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED);
155155
JERRY_ASSERT (!(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_VM_IGNORE));
156156

157-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_IGNORE);
157+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_IGNORE);
158158
ecma_value_t result = ecma_op_eval_chars_buffer (eval_string_p, eval_string_size, true, false);
159-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_VM_IGNORE);
159+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_IGNORE);
160160

161161
if (!ECMA_IS_VALUE_ERROR (result))
162162
{
@@ -325,8 +325,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
325325
else
326326
{
327327
result = true;
328-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags)
329-
& ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
328+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
330329
*resume_exec_p = true;
331330
}
332331

@@ -407,7 +406,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
407406
{
408407
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
409408

410-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_STOP);
409+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_STOP);
411410
JERRY_CONTEXT (debugger_stop_context) = NULL;
412411
*resume_exec_p = false;
413412
return true;
@@ -417,7 +416,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
417416
{
418417
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
419418

420-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_VM_STOP);
419+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_STOP);
421420
JERRY_CONTEXT (debugger_stop_context) = NULL;
422421
*resume_exec_p = true;
423422
return true;
@@ -427,7 +426,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
427426
{
428427
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
429428

430-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_STOP);
429+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_STOP);
431430
JERRY_CONTEXT (debugger_stop_context) = NULL;
432431
*resume_exec_p = true;
433432
return true;
@@ -437,7 +436,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
437436
{
438437
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
439438

440-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_VM_STOP);
439+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_STOP);
441440
JERRY_CONTEXT (debugger_stop_context) = JERRY_CONTEXT (vm_top_context_p);
442441
*resume_exec_p = true;
443442
return true;
@@ -456,20 +455,51 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
456455
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_exception_config_t);
457456
JERRY_DEBUGGER_RECEIVE_BUFFER_AS (jerry_debugger_receive_exception_config_t, exception_config_p);
458457

459-
uint8_t debugger_flags = JERRY_CONTEXT (debugger_flags);
460-
461458
if (exception_config_p->enable == 0)
462459
{
463-
debugger_flags = (uint8_t) (debugger_flags | JERRY_DEBUGGER_VM_IGNORE_EXCEPTION);
460+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_VM_IGNORE_EXCEPTION);
464461
jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "Stop at exception disabled\n");
465462
}
466463
else
467464
{
468-
debugger_flags = (uint8_t) (debugger_flags & ~JERRY_DEBUGGER_VM_IGNORE_EXCEPTION);
465+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_VM_IGNORE_EXCEPTION);
469466
jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "Stop at exception enabled\n");
470467
}
471468

472-
JERRY_CONTEXT (debugger_flags) = debugger_flags;
469+
return true;
470+
}
471+
472+
case JERRY_DEBUGGER_PARSER_CONFIG:
473+
{
474+
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_parser_config_t);
475+
JERRY_DEBUGGER_RECEIVE_BUFFER_AS (jerry_debugger_receive_parser_config_t, parser_config_p);
476+
477+
if (parser_config_p->enable_wait != 0)
478+
{
479+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_PARSER_WAIT);
480+
jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "Waiting after parsing enabled\n");
481+
}
482+
else
483+
{
484+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_PARSER_WAIT);
485+
jerry_port_log (JERRY_LOG_LEVEL_DEBUG, "Waiting after parsing disabled\n");
486+
}
487+
488+
return true;
489+
}
490+
491+
case JERRY_DEBUGGER_PARSER_RESUME:
492+
{
493+
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
494+
495+
if (!(JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_PARSER_WAIT_MODE))
496+
{
497+
jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Not in parser wait mode\n");
498+
jerry_debugger_close_connection ();
499+
return false;
500+
}
501+
502+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_PARSER_WAIT_MODE);
473503
return true;
474504
}
475505

@@ -568,8 +598,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
568598
}
569599
else
570600
{
571-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags)
572-
& ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
601+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
573602
*resume_exec_p = true;
574603
}
575604
return true;
@@ -586,8 +615,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
586615

587616
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
588617

589-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
590-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_CLIENT_NO_SOURCE);
618+
JERRY_DEBUGGER_UPDATE_FLAGS (JERRY_DEBUGGER_CLIENT_NO_SOURCE, JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
591619

592620
*resume_exec_p = true;
593621

@@ -605,8 +633,7 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
605633

606634
JERRY_DEBUGGER_CHECK_PACKET_SIZE (jerry_debugger_receive_type_t);
607635

608-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
609-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_CONTEXT_RESET_MODE);
636+
JERRY_DEBUGGER_UPDATE_FLAGS (JERRY_DEBUGGER_CONTEXT_RESET_MODE, JERRY_DEBUGGER_CLIENT_SOURCE_MODE);
610637

611638
*resume_exec_p = true;
612639

@@ -652,7 +679,7 @@ jerry_debugger_breakpoint_hit (uint8_t message_type) /**< message type */
652679
return;
653680
}
654681

655-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) | JERRY_DEBUGGER_BREAKPOINT_MODE);
682+
JERRY_DEBUGGER_SET_FLAGS (JERRY_DEBUGGER_BREAKPOINT_MODE);
656683

657684
jerry_debugger_uint8_data_t *uint8_data = NULL;
658685

@@ -667,7 +694,7 @@ jerry_debugger_breakpoint_hit (uint8_t message_type) /**< message type */
667694
uint8_data->uint8_size + sizeof (jerry_debugger_uint8_data_t));
668695
}
669696

670-
JERRY_CONTEXT (debugger_flags) = (uint8_t) (JERRY_CONTEXT (debugger_flags) & ~JERRY_DEBUGGER_BREAKPOINT_MODE);
697+
JERRY_DEBUGGER_CLEAR_FLAGS (JERRY_DEBUGGER_BREAKPOINT_MODE);
671698

672699
JERRY_CONTEXT (debugger_message_delay) = JERRY_DEBUGGER_MESSAGE_FREQUENCY;
673700
} /* jerry_debugger_breakpoint_hit */

0 commit comments

Comments
 (0)