13
13
* limitations under the License.
14
14
*/
15
15
16
- #include "jerry-api.h"
17
-
18
16
#ifdef JERRY_DEBUGGER
19
17
20
18
#include "byte-code.h"
19
+ #include "ecma-conversion.h"
20
+ #include "ecma-eval.h"
21
+ #include "ecma-objects.h"
21
22
#include "jcontext.h"
22
23
#include "jerry-debugger.h"
23
24
#include "jerry-port.h"
@@ -87,7 +88,7 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer the the rece
87
88
88
89
while (frame_ctx_p != NULL && max_depth > 0 )
89
90
{
90
- if (current_frame >= JERRY_DEBUGGER_MAX_SIZE (jerry_debugger_frame_t ))
91
+ if (current_frame >= JERRY_DEBUGGER_SEND_MAX (jerry_debugger_frame_t ))
91
92
{
92
93
if (!jerry_debugger_send (sizeof (jerry_debugger_send_backtrace_t )))
93
94
{
@@ -118,6 +119,79 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer the the rece
118
119
jerry_debugger_send (sizeof (jerry_debugger_send_type_t ) + message_size );
119
120
} /* jerry_debugger_send_backtrace */
120
121
122
+ /**
123
+ * Send result of evaluated expression.
124
+ *
125
+ * @return true - if no error is occured
126
+ * false - otherwise
127
+ */
128
+ static bool
129
+ jerry_debugger_send_eval (const lit_utf8_byte_t * eval_string_p , /**< evaluated string */
130
+ size_t eval_string_size ) /**< evaluated string size */
131
+ {
132
+ JERRY_ASSERT (JERRY_CONTEXT (jerry_init_flags ) & JERRY_INIT_DEBUGGER );
133
+
134
+ JERRY_CONTEXT (jerry_init_flags ) &= (uint32_t ) ~JERRY_INIT_DEBUGGER ;
135
+ ecma_value_t result = ecma_op_eval_chars_buffer (eval_string_p , eval_string_size , true, false);
136
+ JERRY_CONTEXT (jerry_init_flags ) |= (uint32_t ) JERRY_INIT_DEBUGGER ;
137
+
138
+ if (!ECMA_IS_VALUE_ERROR (result ))
139
+ {
140
+ ecma_value_t to_string_value = ecma_op_to_string (result );
141
+ ecma_free_value (result );
142
+ result = to_string_value ;
143
+ }
144
+
145
+ ecma_value_t message = result ;
146
+ uint8_t type = JERRY_DEBUGGER_EVAL_RESULT ;
147
+
148
+ if (ECMA_IS_VALUE_ERROR (result ))
149
+ {
150
+ type = JERRY_DEBUGGER_EVAL_ERROR ;
151
+
152
+ if (ecma_is_value_object (result ))
153
+ {
154
+ ecma_string_t * message_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_MESSAGE );
155
+
156
+ message = ecma_op_object_find (ecma_get_object_from_value (result ),
157
+ message_string_p );
158
+
159
+ ecma_deref_ecma_string (message_string_p );
160
+
161
+ if (!ecma_is_value_string (message )
162
+ || ecma_string_is_empty (ecma_get_string_from_value (message )))
163
+ {
164
+ ecma_free_value (message );
165
+ lit_magic_string_id_t id = ecma_object_get_class_name (ecma_get_object_from_value (result ));
166
+ ecma_free_value (result );
167
+
168
+ const lit_utf8_byte_t * string_p = lit_get_magic_string_utf8 (id );
169
+ return jerry_debugger_send_string (JERRY_DEBUGGER_EVAL_ERROR ,
170
+ string_p ,
171
+ strlen ((const char * ) string_p ));
172
+ }
173
+ }
174
+ else
175
+ {
176
+ /* Primitve type. */
177
+ message = ecma_op_to_string (result );
178
+ JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (message ));
179
+ }
180
+
181
+ ecma_free_value (result );
182
+ }
183
+
184
+ ecma_string_t * string_p = ecma_get_string_from_value (message );
185
+
186
+ ECMA_STRING_TO_UTF8_STRING (string_p , buffer_p , buffer_size );
187
+ bool success = jerry_debugger_send_string (type , buffer_p , buffer_size );
188
+ ECMA_FINALIZE_UTF8_STRING (buffer_p , buffer_size );
189
+
190
+ ecma_free_value (message );
191
+
192
+ return success ;
193
+ } /* jerry_debugger_send_eval */
194
+
121
195
/**
122
196
* Check received packet size.
123
197
*/
@@ -138,9 +212,65 @@ jerry_debugger_send_backtrace (uint8_t *recv_buffer_p) /**< pointer the the rece
138
212
inline bool __attr_always_inline___
139
213
jerry_debugger_process_message (uint8_t * recv_buffer_p , /**< pointer the the received data */
140
214
uint32_t message_size , /**< message size */
141
- bool * resume_exec_p ) /**< pointer to the resume exec flag */
215
+ bool * resume_exec_p , /**< pointer to the resume exec flag */
216
+ uint8_t * expected_message_type_p , /**< expected message type */
217
+ void * * message_data_p ) /**< custom message data */
142
218
{
143
219
/* Process the received message. */
220
+
221
+ if (* expected_message_type_p != 0 )
222
+ {
223
+ JERRY_ASSERT (* expected_message_type_p == JERRY_DEBUGGER_EVAL_PART );
224
+
225
+ jerry_debugger_eval_data_t * eval_data_p = (jerry_debugger_eval_data_t * ) * message_data_p ;
226
+
227
+ if (recv_buffer_p [0 ] != JERRY_DEBUGGER_EVAL_PART )
228
+ {
229
+ jmem_heap_free_block (eval_data_p , eval_data_p -> eval_size + sizeof (jerry_debugger_eval_data_t ));
230
+ jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Unexpected message\n" );
231
+ jerry_debugger_close_connection ();
232
+ return false;
233
+ }
234
+
235
+ JERRY_DEBUGGER_RECEIVE_BUFFER_AS (jerry_debugger_receive_eval_part_t , eval_part_p );
236
+
237
+ if (message_size < sizeof (jerry_debugger_receive_eval_part_t ) + 1 )
238
+ {
239
+ jmem_heap_free_block (eval_data_p , eval_data_p -> eval_size + sizeof (jerry_debugger_eval_data_t ));
240
+ jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Invalid message size\n" );
241
+ jerry_debugger_close_connection ();
242
+ return false;
243
+ }
244
+
245
+ uint32_t expected_data = eval_data_p -> eval_size - eval_data_p -> eval_offset ;
246
+
247
+ message_size -= (uint32_t ) sizeof (jerry_debugger_receive_eval_part_t );
248
+
249
+ if (message_size > expected_data )
250
+ {
251
+ jmem_heap_free_block (eval_data_p , eval_data_p -> eval_size + sizeof (jerry_debugger_eval_data_t ));
252
+ jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Invalid message size\n" );
253
+ jerry_debugger_close_connection ();
254
+ return false;
255
+ }
256
+
257
+ lit_utf8_byte_t * eval_string_p = (lit_utf8_byte_t * ) (eval_data_p + 1 );
258
+ memcpy (eval_string_p + eval_data_p -> eval_offset ,
259
+ (lit_utf8_byte_t * ) (eval_part_p + 1 ),
260
+ message_size );
261
+
262
+ if (message_size < expected_data )
263
+ {
264
+ eval_data_p -> eval_offset += message_size ;
265
+ return true;
266
+ }
267
+
268
+ bool result = jerry_debugger_send_eval (eval_string_p , eval_data_p -> eval_size );
269
+ jmem_heap_free_block (eval_data_p , eval_data_p -> eval_size + sizeof (jerry_debugger_eval_data_t ));
270
+ * expected_message_type_p = 0 ;
271
+ return result ;
272
+ }
273
+
144
274
switch (recv_buffer_p [0 ])
145
275
{
146
276
case JERRY_DEBUGGER_FREE_BYTE_CODE_CP :
@@ -253,6 +383,50 @@ jerry_debugger_process_message (uint8_t *recv_buffer_p, /**< pointer the the rec
253
383
return true;
254
384
}
255
385
386
+ case JERRY_DEBUGGER_EVAL :
387
+ {
388
+ if (message_size < sizeof (jerry_debugger_receive_eval_first_t ) + 1 )
389
+ {
390
+ jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Invalid message size\n" );
391
+ jerry_debugger_close_connection ();
392
+ return false;
393
+ }
394
+
395
+ JERRY_DEBUGGER_RECEIVE_BUFFER_AS (jerry_debugger_receive_eval_first_t , eval_first_p );
396
+
397
+ uint32_t eval_size ;
398
+ memcpy (& eval_size , eval_first_p -> eval_size , sizeof (uint32_t ));
399
+
400
+ if (eval_size <= JERRY_DEBUGGER_MAX_RECEIVE_SIZE - sizeof (jerry_debugger_receive_eval_first_t ))
401
+ {
402
+ if (eval_size != message_size - sizeof (jerry_debugger_receive_eval_first_t ))
403
+ {
404
+ jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Invalid message size\n" );
405
+ jerry_debugger_close_connection ();
406
+ return false;
407
+ }
408
+
409
+ return jerry_debugger_send_eval ((lit_utf8_byte_t * ) (eval_first_p + 1 ), eval_size );
410
+ }
411
+
412
+ jerry_debugger_eval_data_t * eval_data_p ;
413
+ size_t eval_data_size = sizeof (jerry_debugger_eval_data_t ) + eval_size ;
414
+
415
+ eval_data_p = (jerry_debugger_eval_data_t * ) jmem_heap_alloc_block (eval_data_size );
416
+
417
+ eval_data_p -> eval_size = eval_size ;
418
+ eval_data_p -> eval_offset = (uint32_t ) (message_size - sizeof (jerry_debugger_receive_eval_first_t ));
419
+
420
+ lit_utf8_byte_t * eval_string_p = (lit_utf8_byte_t * ) (eval_data_p + 1 );
421
+ memcpy (eval_string_p ,
422
+ (lit_utf8_byte_t * ) (eval_first_p + 1 ),
423
+ message_size - sizeof (jerry_debugger_receive_eval_first_t ));
424
+
425
+ * message_data_p = eval_data_p ;
426
+ * expected_message_type_p = JERRY_DEBUGGER_EVAL_PART ;
427
+ return true;
428
+ }
429
+
256
430
default :
257
431
{
258
432
jerry_port_log (JERRY_LOG_LEVEL_ERROR , "Unexpected message." );
@@ -355,7 +529,7 @@ jerry_debugger_send_data (jerry_debugger_header_type_t type, /**< message type *
355
529
const void * data , /**< raw data */
356
530
size_t size ) /**< size of data */
357
531
{
358
- JERRY_ASSERT (size < JERRY_DEBUGGER_MAX_SIZE (uint8_t ));
532
+ JERRY_ASSERT (size <= JERRY_DEBUGGER_SEND_MAX (uint8_t ));
359
533
360
534
JERRY_DEBUGGER_SEND_BUFFER_AS (jerry_debugger_send_type_t , message_type_p );
361
535
@@ -369,15 +543,18 @@ jerry_debugger_send_data (jerry_debugger_header_type_t type, /**< message type *
369
543
370
544
/**
371
545
* Send string to the debugger client.
546
+ *
547
+ * @return true - if the data sent successfully to the debugger client,
548
+ * false - otherwise
372
549
*/
373
- void
550
+ bool
374
551
jerry_debugger_send_string (uint8_t message_type , /**< message type */
375
- const jerry_char_t * string_p , /**< string data */
552
+ const uint8_t * string_p , /**< string data */
376
553
size_t string_length ) /**< length of string */
377
554
{
378
555
JERRY_ASSERT (JERRY_CONTEXT (jerry_init_flags ) & JERRY_INIT_DEBUGGER );
379
556
380
- const size_t max_fragment_len = JERRY_DEBUGGER_MAX_SIZE ( char );
557
+ const size_t max_fragment_len = JERRY_DEBUGGER_SEND_MAX ( uint8_t );
381
558
382
559
JERRY_DEBUGGER_SEND_BUFFER_AS (jerry_debugger_send_string_t , message_string_p );
383
560
@@ -391,7 +568,7 @@ jerry_debugger_send_string (uint8_t message_type, /**< message type */
391
568
392
569
if (!jerry_debugger_send (sizeof (jerry_debugger_send_string_t )))
393
570
{
394
- return ;
571
+ return false ;
395
572
}
396
573
397
574
string_length -= max_fragment_len ;
@@ -403,14 +580,14 @@ jerry_debugger_send_string (uint8_t message_type, /**< message type */
403
580
404
581
memcpy (message_string_p -> string , string_p , string_length );
405
582
406
- jerry_debugger_send (sizeof (jerry_debugger_send_type_t ) + string_length );
583
+ return jerry_debugger_send (sizeof (jerry_debugger_send_type_t ) + string_length );
407
584
} /* jerry_debugger_send_string */
408
585
409
586
/**
410
587
* Send the function name to the debugger client.
411
588
*/
412
589
void
413
- jerry_debugger_send_function_name (const jerry_char_t * function_name_p , /**< function name */
590
+ jerry_debugger_send_function_name (const uint8_t * function_name_p , /**< function name */
414
591
size_t function_name_length ) /**< length of function name */
415
592
{
416
593
JERRY_ASSERT (JERRY_CONTEXT (jerry_init_flags ) & JERRY_INIT_DEBUGGER );
0 commit comments