From d0f5e61ab58892ecd3b0838adeea3cde330da3f1 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Fri, 25 Jul 2014 11:00:15 +0300 Subject: [PATCH] py: Implement __file__ attribute for modules. --- py/builtinimport.c | 3 +++ py/mpconfig.h | 5 +++++ py/qstrdefs.h | 3 +++ tests/import/import_file.py | 2 ++ unix/main.c | 5 +++++ 5 files changed, 18 insertions(+) create mode 100644 tests/import/import_file.py diff --git a/py/builtinimport.c b/py/builtinimport.c index 467a27897..debf75fd4 100644 --- a/py/builtinimport.c +++ b/py/builtinimport.c @@ -120,6 +120,9 @@ STATIC void do_load(mp_obj_t module_obj, vstr_t *file) { // set the new context mp_locals_set(mp_obj_module_get_globals(module_obj)); mp_globals_set(mp_obj_module_get_globals(module_obj)); + #if MICROPY_PY___FILE__ + mp_store_attr(module_obj, MP_QSTR___file__, mp_obj_new_str(vstr_str(file), vstr_len(file), false)); + #endif // parse the imported script mp_parse_error_kind_t parse_error_kind; diff --git a/py/mpconfig.h b/py/mpconfig.h index 99d697f9a..bb1c0b5fe 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -279,6 +279,11 @@ typedef double mp_float_t; #define MICROPY_PY_BUILTINS_PROPERTY (1) #endif +// Whether to set __file__ for imported modules +#ifndef MICROPY_PY___FILE__ +#define MICROPY_PY___FILE__ (1) +#endif + // Whether to provide "array" module. Note that large chunk of the // underlying code is shared with "bytearray" builtin type, so to // get real savings, it should be disabled too. diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 0deb646c7..27b695722 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -43,6 +43,9 @@ Q(__next__) Q(__qualname__) Q(__path__) Q(__repl_print__) +#if MICROPY_PY___FILE__ +Q(__file__) +#endif Q(__bool__) Q(__contains__) diff --git a/tests/import/import_file.py b/tests/import/import_file.py new file mode 100644 index 000000000..cb9a88a70 --- /dev/null +++ b/tests/import/import_file.py @@ -0,0 +1,2 @@ +import import1b +print(import1b.__file__) diff --git a/unix/main.c b/unix/main.c index d0222de0d..03718c22e 100644 --- a/unix/main.c +++ b/unix/main.c @@ -95,6 +95,11 @@ STATIC int execute_from_lexer(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, } qstr source_name = mp_lexer_source_name(lex); + #if MICROPY_PY___FILE__ + if (input_kind == MP_PARSE_FILE_INPUT) { + mp_store_global(MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name)); + } + #endif mp_lexer_free(lex); /*