summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/objfun.c4
-rw-r--r--tests/basics/fun_globals.py21
2 files changed, 25 insertions, 0 deletions
diff --git a/py/objfun.c b/py/objfun.c
index 052f4b1ce..178f83443 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -355,6 +355,10 @@ void mp_obj_fun_bc_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (attr == MP_QSTR___name__) {
dest[0] = MP_OBJ_NEW_QSTR(mp_obj_fun_get_name(self_in));
}
+ if (attr == MP_QSTR___globals__) {
+ mp_obj_fun_bc_t *self = MP_OBJ_TO_PTR(self_in);
+ dest[0] = MP_OBJ_FROM_PTR(self->globals);
+ }
}
#endif
diff --git a/tests/basics/fun_globals.py b/tests/basics/fun_globals.py
new file mode 100644
index 000000000..3f32e8bdb
--- /dev/null
+++ b/tests/basics/fun_globals.py
@@ -0,0 +1,21 @@
+# test the __globals__ attribute of a function
+
+
+def foo():
+ pass
+
+
+if not hasattr(foo, "__globals__"):
+ print("SKIP")
+ raise SystemExit
+
+print(type(foo.__globals__))
+print(foo.__globals__ is globals())
+
+foo.__globals__["bar"] = 123
+print(bar)
+
+try:
+ foo.__globals__ = None
+except AttributeError:
+ print("AttributeError")