@@ -64,7 +64,7 @@ static bool repl_display_debugging_info = 0;
64
64
// EXEC_FLAG_PRINT_EOF prints 2 EOF chars: 1 after normal output, 1 after exception output
65
65
// EXEC_FLAG_ALLOW_DEBUGGING allows debugging info to be printed after executing the code
66
66
// EXEC_FLAG_IS_REPL is used for REPL inputs (flag passed on to mp_compile)
67
- static int parse_compile_execute (const void * source , mp_parse_input_kind_t input_kind , mp_uint_t exec_flags ) {
67
+ static int parse_compile_execute (const void * source , mp_parse_input_kind_t input_kind , mp_uint_t exec_flags , const char * frozen_module_name ) {
68
68
int ret = 0 ;
69
69
#if MICROPY_REPL_INFO
70
70
uint32_t start = 0 ;
@@ -86,6 +86,14 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input
86
86
ctx -> module .globals = mp_globals_get ();
87
87
ctx -> constants = frozen -> constants ;
88
88
module_fun = mp_make_function_from_proto_fun (frozen -> proto_fun , ctx , NULL );
89
+
90
+ #if MICROPY_PY___FILE__
91
+ // Set __file__ for frozen MPY modules
92
+ if (input_kind == MP_PARSE_FILE_INPUT && frozen_module_name != NULL ) {
93
+ qstr source_name = qstr_from_str (frozen_module_name );
94
+ mp_store_global (MP_QSTR___file__ , MP_OBJ_NEW_QSTR (source_name ));
95
+ }
96
+ #endif
89
97
} else
90
98
#endif
91
99
{
@@ -161,6 +169,7 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input
161
169
// check for SystemExit
162
170
if (mp_obj_is_subclass_fast (MP_OBJ_FROM_PTR (((mp_obj_base_t * )nlr .ret_val )-> type ), MP_OBJ_FROM_PTR (& mp_type_SystemExit ))) {
163
171
// Extract SystemExit value
172
+ // None is an exit value of 0; an int is its value; anything else is 1
164
173
mp_obj_t exit_val = mp_obj_exception_get_value (MP_OBJ_FROM_PTR (nlr .ret_val ));
165
174
mp_int_t val = 0 ;
166
175
if (exit_val != mp_const_none && !mp_obj_get_int_maybe (exit_val , & val )) {
@@ -297,7 +306,7 @@ static int do_reader_stdin(int c) {
297
306
mp_reader_stdin_t reader_stdin ;
298
307
mp_reader_new_stdin (& reader , & reader_stdin , MICROPY_REPL_STDIN_BUFFER_MAX );
299
308
int exec_flags = EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_READER ;
300
- return parse_compile_execute (& reader , MP_PARSE_FILE_INPUT , exec_flags );
309
+ return parse_compile_execute (& reader , MP_PARSE_FILE_INPUT , exec_flags , NULL );
301
310
}
302
311
303
312
#if MICROPY_REPL_EVENT_DRIVEN
@@ -372,7 +381,7 @@ static int pyexec_raw_repl_process_char(int c) {
372
381
return PYEXEC_FORCED_EXIT ;
373
382
}
374
383
375
- int ret = parse_compile_execute (MP_STATE_VM (repl_line ), MP_PARSE_FILE_INPUT , EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_VSTR );
384
+ int ret = parse_compile_execute (MP_STATE_VM (repl_line ), MP_PARSE_FILE_INPUT , EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_VSTR , NULL );
376
385
if (ret & PYEXEC_FORCED_EXIT ) {
377
386
return ret ;
378
387
}
@@ -393,7 +402,7 @@ static int pyexec_friendly_repl_process_char(int c) {
393
402
} else if (c == CHAR_CTRL_D ) {
394
403
// end of input
395
404
mp_hal_stdout_tx_str ("\r\n" );
396
- int ret = parse_compile_execute (MP_STATE_VM (repl_line ), MP_PARSE_FILE_INPUT , EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR );
405
+ int ret = parse_compile_execute (MP_STATE_VM (repl_line ), MP_PARSE_FILE_INPUT , EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR , NULL );
397
406
if (ret & PYEXEC_FORCED_EXIT ) {
398
407
return ret ;
399
408
}
@@ -484,7 +493,7 @@ static int pyexec_friendly_repl_process_char(int c) {
484
493
}
485
494
486
495
exec :;
487
- int ret = parse_compile_execute (MP_STATE_VM (repl_line ), MP_PARSE_SINGLE_INPUT , EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR );
496
+ int ret = parse_compile_execute (MP_STATE_VM (repl_line ), MP_PARSE_SINGLE_INPUT , EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR , NULL );
488
497
if (ret & PYEXEC_FORCED_EXIT ) {
489
498
return ret ;
490
499
}
@@ -567,7 +576,7 @@ int pyexec_raw_repl(void) {
567
576
return PYEXEC_FORCED_EXIT ;
568
577
}
569
578
570
- int ret = parse_compile_execute (& line , MP_PARSE_FILE_INPUT , EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_VSTR );
579
+ int ret = parse_compile_execute (& line , MP_PARSE_FILE_INPUT , EXEC_FLAG_PRINT_EOF | EXEC_FLAG_SOURCE_IS_VSTR , NULL );
571
580
if (ret & PYEXEC_FORCED_EXIT ) {
572
581
return ret ;
573
582
}
@@ -692,7 +701,7 @@ int pyexec_friendly_repl(void) {
692
701
}
693
702
}
694
703
695
- ret = parse_compile_execute (& line , parse_input_kind , EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR );
704
+ ret = parse_compile_execute (& line , parse_input_kind , EXEC_FLAG_ALLOW_DEBUGGING | EXEC_FLAG_IS_REPL | EXEC_FLAG_SOURCE_IS_VSTR , NULL );
696
705
if (ret & PYEXEC_FORCED_EXIT ) {
697
706
return ret ;
698
707
}
@@ -703,7 +712,7 @@ int pyexec_friendly_repl(void) {
703
712
#endif // MICROPY_ENABLE_COMPILER
704
713
705
714
int pyexec_file (const char * filename ) {
706
- return parse_compile_execute (filename , MP_PARSE_FILE_INPUT , EXEC_FLAG_SOURCE_IS_FILENAME );
715
+ return parse_compile_execute (filename , MP_PARSE_FILE_INPUT , EXEC_FLAG_SOURCE_IS_FILENAME , NULL );
707
716
}
708
717
709
718
@@ -729,13 +738,13 @@ int pyexec_frozen_module(const char *name, bool allow_keyboard_interrupt) {
729
738
switch (frozen_type ) {
730
739
#if MICROPY_MODULE_FROZEN_STR
731
740
case MP_FROZEN_STR :
732
- return parse_compile_execute (frozen_data , MP_PARSE_FILE_INPUT , exec_flags );
741
+ return parse_compile_execute (frozen_data , MP_PARSE_FILE_INPUT , exec_flags , NULL );
733
742
#endif
734
743
735
744
#if MICROPY_MODULE_FROZEN_MPY
736
745
case MP_FROZEN_MPY :
737
746
return parse_compile_execute (frozen_data , MP_PARSE_FILE_INPUT , exec_flags |
738
- EXEC_FLAG_SOURCE_IS_RAW_CODE );
747
+ EXEC_FLAG_SOURCE_IS_RAW_CODE , name );
739
748
#endif
740
749
741
750
default :
@@ -747,7 +756,7 @@ int pyexec_frozen_module(const char *name, bool allow_keyboard_interrupt) {
747
756
748
757
int pyexec_vstr (vstr_t * str , bool allow_keyboard_interrupt ) {
749
758
mp_uint_t exec_flags = allow_keyboard_interrupt ? 0 : EXEC_FLAG_NO_INTERRUPT ;
750
- return parse_compile_execute (str , MP_PARSE_FILE_INPUT , exec_flags | EXEC_FLAG_SOURCE_IS_VSTR );
759
+ return parse_compile_execute (str , MP_PARSE_FILE_INPUT , exec_flags | EXEC_FLAG_SOURCE_IS_VSTR , NULL );
751
760
}
752
761
753
762
#if MICROPY_REPL_INFO
0 commit comments