From cc0af3d727e9f675da233ac4fd9ddc15bc41fe76 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Sun, 6 Apr 2014 01:00:46 +0300
Subject: [PATCH] py: Implement globals() and locals() builtins.

---
 py/builtin.c       | 13 +++++++++++++
 py/builtin.h       |  2 ++
 py/builtintables.c |  2 ++
 py/qstrdefs.h      |  2 ++
 4 files changed, 19 insertions(+)

diff --git a/py/builtin.c b/py/builtin.c
index a6d14fa48..fc037f12f 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -410,3 +410,16 @@ STATIC mp_obj_t mp_builtin_getattr(uint n_args, const mp_obj_t *args) {
 }
 
 MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_getattr_obj, 2, 3, mp_builtin_getattr);
+
+
+STATIC mp_obj_t mp_builtin_globals() {
+    return mp_globals_get();
+}
+
+MP_DEFINE_CONST_FUN_OBJ_0(mp_builtin_globals_obj, mp_builtin_globals);
+
+STATIC mp_obj_t mp_builtin_locals() {
+    return mp_locals_get();
+}
+
+MP_DEFINE_CONST_FUN_OBJ_0(mp_builtin_locals_obj, mp_builtin_locals);
diff --git a/py/builtin.h b/py/builtin.h
index 60b7c85b8..e86138fe1 100644
--- a/py/builtin.h
+++ b/py/builtin.h
@@ -13,6 +13,7 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_divmod_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_eval_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_exec_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_getattr_obj);
+MP_DECLARE_CONST_FUN_OBJ(mp_builtin_globals_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_hash_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_id_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_isinstance_obj);
@@ -20,6 +21,7 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_issubclass_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_iter_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_len_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_list_obj);
+MP_DECLARE_CONST_FUN_OBJ(mp_builtin_locals_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_max_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_min_obj);
 MP_DECLARE_CONST_FUN_OBJ(mp_builtin_next_obj);
diff --git a/py/builtintables.c b/py/builtintables.c
index bc3d0deb1..9a46be6e0 100644
--- a/py/builtintables.c
+++ b/py/builtintables.c
@@ -54,12 +54,14 @@ STATIC const mp_map_elem_t mp_builtin_object_table[] = {
     { MP_OBJ_NEW_QSTR(MP_QSTR_eval), (mp_obj_t)&mp_builtin_eval_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_exec), (mp_obj_t)&mp_builtin_exec_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_getattr), (mp_obj_t)&mp_builtin_getattr_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_globals), (mp_obj_t)&mp_builtin_globals_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_hash), (mp_obj_t)&mp_builtin_hash_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_id), (mp_obj_t)&mp_builtin_id_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_isinstance), (mp_obj_t)&mp_builtin_isinstance_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_issubclass), (mp_obj_t)&mp_builtin_issubclass_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_iter), (mp_obj_t)&mp_builtin_iter_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_len), (mp_obj_t)&mp_builtin_len_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_locals), (mp_obj_t)&mp_builtin_locals_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_max), (mp_obj_t)&mp_builtin_max_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_min), (mp_obj_t)&mp_builtin_min_obj },
     { MP_OBJ_NEW_QSTR(MP_QSTR_next), (mp_obj_t)&mp_builtin_next_obj },
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 2271941a0..c2fdffe01 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -97,6 +97,7 @@ Q(exec)
 Q(filter)
 Q(float)
 Q(getattr)
+Q(globals)
 Q(hash)
 Q(id)
 Q(io)
@@ -106,6 +107,7 @@ Q(issubclass)
 Q(iter)
 Q(len)
 Q(list)
+Q(locals)
 Q(map)
 Q(max)
 Q(min)
-- 
GitLab