@@ -412,6 +412,25 @@ instance_alloc (size_t size,
412412
413413#endif /* JERRY_ENABLE_EXTERNAL_CONTEXT */
414414
415+ /**
416+ * Inits the engine and the debugger
417+ */
418+ static void
419+ init_engine (jerry_init_flag_t flags , /**< initialized flags for the engine */
420+ bool debug_server , /**< enable the debugger init or not */
421+ uint16_t debug_port ) /**< the debugger port */
422+ {
423+ jerry_init (flags );
424+ if (debug_server )
425+ {
426+ jerry_debugger_init (debug_port );
427+ }
428+
429+ register_js_function ("assert" , jerryx_handler_assert );
430+ register_js_function ("gc" , jerryx_handler_gc );
431+ register_js_function ("print" , jerryx_handler_print );
432+ } /* init_engine */
433+
415434int
416435main (int argc ,
417436 char * * argv )
@@ -591,15 +610,7 @@ main (int argc,
591610
592611#endif /* JERRY_ENABLE_EXTERNAL_CONTEXT */
593612
594- jerry_init (flags );
595- if (start_debug_server )
596- {
597- jerry_debugger_init (debug_port );
598- }
599-
600- register_js_function ("assert" , jerryx_handler_assert );
601- register_js_function ("gc" , jerryx_handler_gc );
602- register_js_function ("print" , jerryx_handler_print );
613+ init_engine (flags , start_debug_server , debug_port );
603614
604615 jerry_value_t ret_value = jerry_create_undefined ();
605616
@@ -629,99 +640,139 @@ main (int argc,
629640 }
630641 }
631642
632- if (! jerry_value_is_error ( ret_value ) )
643+ while (true )
633644 {
634- for (int i = 0 ; i < files_counter ; i ++ )
635- {
636- size_t source_size ;
637- const jerry_char_t * source_p = (jerry_char_t * ) read_file (file_names [i ], & source_size );
638645
639- if (source_p == NULL )
646+ if (!jerry_value_is_error (ret_value ))
647+ {
648+ for (int i = 0 ; i < files_counter ; i ++ )
640649 {
641- ret_value = jerry_create_error (JERRY_ERROR_COMMON , (jerry_char_t * ) "Source file load error" );
642- break ;
643- }
650+ size_t source_size ;
651+ const jerry_char_t * source_p = (jerry_char_t * ) read_file (file_names [i ], & source_size );
644652
645- if (! jerry_is_valid_utf8_string ( source_p , ( jerry_size_t ) source_size ) )
646- {
647- ret_value = jerry_create_error (JERRY_ERROR_COMMON , (jerry_char_t * ) ( "Input must be a valid UTF-8 string." ) );
648- break ;
649- }
653+ if (source_p == NULL )
654+ {
655+ ret_value = jerry_create_error (JERRY_ERROR_COMMON , (jerry_char_t * ) "Source file load error" );
656+ break ;
657+ }
650658
651- ret_value = jerry_parse (( jerry_char_t * ) file_names [ i ],
652- strlen ( file_names [ i ]),
653- source_p ,
654- source_size ,
655- JERRY_PARSE_NO_OPTS );
659+ if (! jerry_is_valid_utf8_string ( source_p , ( jerry_size_t ) source_size ))
660+ {
661+ ret_value = jerry_create_error ( JERRY_ERROR_COMMON , ( jerry_char_t * ) ( "Input must be a valid UTF-8 string." ));
662+ break ;
663+ }
656664
657- if (!jerry_value_is_error (ret_value ) && !is_parse_only )
658- {
659- jerry_value_t func_val = ret_value ;
660- ret_value = jerry_run (func_val );
661- jerry_release_value (func_val );
662- }
665+ ret_value = jerry_parse ((jerry_char_t * ) file_names [i ],
666+ strlen (file_names [i ]),
667+ source_p ,
668+ source_size ,
669+ JERRY_PARSE_NO_OPTS );
663670
664- if (jerry_value_is_error (ret_value ))
665- {
666- break ;
667- }
671+ if (!jerry_value_is_error (ret_value ) && !is_parse_only )
672+ {
673+ jerry_value_t func_val = ret_value ;
674+ ret_value = jerry_run (func_val );
675+ jerry_release_value (func_val );
676+ }
668677
669- jerry_release_value ( ret_value );
670- ret_value = jerry_create_undefined ();
671- }
672- }
678+ if ( jerry_value_is_error ( ret_value ))
679+ {
680+ break ;
681+ }
673682
674- if (is_wait_mode )
675- {
676- is_repl_mode = false;
683+ jerry_release_value (ret_value );
684+ ret_value = jerry_create_undefined ();
685+ }
686+ }
677687
678- if (jerry_is_feature_enabled ( JERRY_FEATURE_DEBUGGER ) )
688+ if (is_wait_mode )
679689 {
680- while (true)
681- {
682- jerry_debugger_wait_for_source_status_t receive_status ;
690+ is_repl_mode = false;
683691
684- do
692+ if (jerry_is_feature_enabled (JERRY_FEATURE_DEBUGGER ))
693+ {
694+ while (true)
685695 {
686- jerry_value_t run_result ;
687-
688- receive_status = jerry_debugger_wait_for_client_source (wait_for_source_callback ,
689- NULL ,
690- & run_result );
696+ jerry_debugger_wait_for_source_status_t receive_status ;
691697
692- if ( receive_status == JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED )
698+ do
693699 {
694- ret_value = jerry_create_error (JERRY_ERROR_COMMON ,
695- (jerry_char_t * ) "Connection aborted before source arrived." );
700+ jerry_value_t run_result ;
701+
702+ receive_status = jerry_debugger_wait_for_client_source (wait_for_source_callback ,
703+ NULL ,
704+ & run_result );
705+
706+ if (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVE_FAILED )
707+ {
708+ ret_value = jerry_create_error (JERRY_ERROR_COMMON ,
709+ (jerry_char_t * ) "Connection aborted before source arrived." );
710+ }
711+
712+ if (receive_status == JERRY_DEBUGGER_SOURCE_END )
713+ {
714+ jerry_port_log (JERRY_LOG_LEVEL_DEBUG , "No more client source.\n" );
715+ }
716+
717+ if (jerry_value_is_abort (run_result ))
718+ {
719+ ret_value = jerry_acquire_value (run_result );
720+ }
721+
722+ jerry_release_value (run_result );
696723 }
724+ while (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVED );
697725
698- if (receive_status == JERRY_DEBUGGER_SOURCE_END )
726+ if (receive_status != JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED )
699727 {
700- jerry_port_log ( JERRY_LOG_LEVEL_DEBUG , "No more client source.\n" ) ;
728+ break ;
701729 }
702730
703- jerry_release_value (run_result );
704- }
705- while (receive_status == JERRY_DEBUGGER_SOURCE_RECEIVED );
731+ init_engine (flags , true, debug_port );
706732
707- if (receive_status != JERRY_DEBUGGER_CONTEXT_RESET_RECEIVED )
708- {
709- break ;
733+ ret_value = jerry_create_undefined ();
710734 }
735+ }
711736
712- jerry_cleanup ();
737+ }
713738
714- jerry_init (flags );
715- jerry_debugger_init (debug_port );
739+ bool restart = false;
716740
717- register_js_function ("assert" , jerryx_handler_assert );
718- register_js_function ("gc" , jerryx_handler_gc );
719- register_js_function ("print" , jerryx_handler_print );
741+ if (jerry_is_feature_enabled (JERRY_FEATURE_DEBUGGER ) && jerry_value_is_abort (ret_value ))
742+ {
743+ jerry_value_t abort_value = jerry_get_value_from_error (ret_value , false);
744+ if (jerry_value_is_string (abort_value ))
745+ {
746+ jerry_char_t str_buf [5 ];
747+ jerry_value_t str_val = jerry_value_to_string (abort_value );
748+ jerry_size_t str_size = jerry_get_string_size (str_val );
720749
721- ret_value = jerry_create_undefined ();
750+ if (str_size == 5 )
751+ {
752+ jerry_string_to_char_buffer (str_val , str_buf , str_size );
753+ if (memcmp ("r353t" , (char * ) (str_buf ), 5 ) == 0 )
754+ {
755+ jerry_release_value (ret_value );
756+ restart = true;
757+ }
758+ }
759+
760+ jerry_release_value (str_val );
722761 }
762+
763+ jerry_release_value (abort_value );
723764 }
724765
766+ if (!restart )
767+ {
768+ break ;
769+ }
770+
771+ jerry_cleanup ();
772+
773+ init_engine (flags , true, debug_port );
774+
775+ ret_value = jerry_create_undefined ();
725776 }
726777
727778 if (is_repl_mode )
0 commit comments