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