From d0f5e61ab58892ecd3b0838adeea3cde330da3f1 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
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);
 
     /*
-- 
GitLab