Skip to content

Commit 7efc5b3

Browse files
committed
py: Make globals and locals proper dictionary objects.
Finishes addressing issue adafruit#424. In the end this was a very neat refactor that now makes things a lot more consistent across the py code base. It allowed some simplifications in certain places, now that everything is a dict object. Also converted builtins tables to dictionaries. This will be useful when we need to turn builtins into a proper module.
1 parent 8b0535e commit 7efc5b3

11 files changed

Lines changed: 174 additions & 194 deletions

File tree

py/builtin.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
STATIC mp_obj_t mp_builtin___build_class__(uint n_args, const mp_obj_t *args) {
2121
assert(2 <= n_args);
2222

23-
// we differ from CPython: we set the new __locals__ object here
24-
mp_map_t *old_locals = mp_locals_get();
23+
// set the new classes __locals__ object
24+
mp_obj_dict_t *old_locals = mp_locals_get();
2525
mp_obj_t class_locals = mp_obj_new_dict(0);
26-
mp_locals_set(mp_obj_dict_get_map(class_locals));
26+
mp_locals_set(class_locals);
2727

2828
// call the class code
2929
mp_obj_t cell = mp_call_function_0(args[0]);
@@ -150,14 +150,14 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_chr_obj, mp_builtin_chr);
150150
STATIC mp_obj_t mp_builtin_dir(uint n_args, const mp_obj_t *args) {
151151
// TODO make this function more general and less of a hack
152152

153-
mp_map_t *map = NULL;
153+
mp_obj_dict_t *dict = NULL;
154154
if (n_args == 0) {
155155
// make a list of names in the local name space
156-
map = mp_locals_get();
156+
dict = mp_locals_get();
157157
} else { // n_args == 1
158158
// make a list of names in the given object
159159
if (MP_OBJ_IS_TYPE(args[0], &mp_type_module)) {
160-
map = mp_obj_dict_get_map(mp_obj_module_get_globals(args[0]));
160+
dict = mp_obj_module_get_globals(args[0]);
161161
} else {
162162
mp_obj_type_t *type;
163163
if (MP_OBJ_IS_TYPE(args[0], &mp_type_type)) {
@@ -166,16 +166,16 @@ STATIC mp_obj_t mp_builtin_dir(uint n_args, const mp_obj_t *args) {
166166
type = mp_obj_get_type(args[0]);
167167
}
168168
if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) {
169-
map = mp_obj_dict_get_map(type->locals_dict);
169+
dict = type->locals_dict;
170170
}
171171
}
172172
}
173173

174174
mp_obj_t dir = mp_obj_new_list(0, NULL);
175-
if (map != NULL) {
176-
for (uint i = 0; i < map->alloc; i++) {
177-
if (MP_MAP_SLOT_IS_FILLED(map, i)) {
178-
mp_obj_list_append(dir, map->table[i].key);
175+
if (dict != NULL) {
176+
for (uint i = 0; i < dict->map.alloc; i++) {
177+
if (MP_MAP_SLOT_IS_FILLED(&dict->map, i)) {
178+
mp_obj_list_append(dir, dict->map.table[i].key);
179179
}
180180
}
181181
}

py/builtinevex.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_eval_obj, mp_builtin_eval);
5454
STATIC mp_obj_t mp_builtin_exec(uint n_args, const mp_obj_t *args) {
5555
// Unconditional getting/setting assumes that these operations
5656
// are cheap, which is the case when this comment was written.
57-
mp_map_t *old_globals = mp_globals_get();
58-
mp_map_t *old_locals = mp_locals_get();
57+
mp_obj_dict_t *old_globals = mp_globals_get();
58+
mp_obj_dict_t *old_locals = mp_locals_get();
5959
if (n_args > 1) {
6060
mp_obj_t globals = args[1];
6161
mp_obj_t locals;
@@ -64,8 +64,8 @@ STATIC mp_obj_t mp_builtin_exec(uint n_args, const mp_obj_t *args) {
6464
} else {
6565
locals = globals;
6666
}
67-
mp_globals_set(mp_obj_dict_get_map(globals));
68-
mp_locals_set(mp_obj_dict_get_map(locals));
67+
mp_globals_set(globals);
68+
mp_locals_set(locals);
6969
}
7070
mp_obj_t res = parse_compile_execute(args[0], MP_PARSE_FILE_INPUT);
7171
// TODO if the above call throws an exception, then we never get to reset the globals/locals

py/builtinimport.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ void do_load(mp_obj_t module_obj, vstr_t *file) {
8383
qstr source_name = mp_lexer_source_name(lex);
8484

8585
// save the old context
86-
mp_map_t *old_locals = mp_locals_get();
87-
mp_map_t *old_globals = mp_globals_get();
86+
mp_obj_dict_t *old_locals = mp_locals_get();
87+
mp_obj_dict_t *old_globals = mp_globals_get();
8888

8989
// set the new context
90-
mp_locals_set(mp_obj_dict_get_map(mp_obj_module_get_globals(module_obj)));
91-
mp_globals_set(mp_obj_dict_get_map(mp_obj_module_get_globals(module_obj)));
90+
mp_locals_set(mp_obj_module_get_globals(module_obj));
91+
mp_globals_set(mp_obj_module_get_globals(module_obj));
9292

9393
// parse the imported script
9494
mp_parse_error_kind_t parse_error_kind;

py/builtintables.c

Lines changed: 104 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -8,148 +8,139 @@
88
#include "builtintables.h"
99
#include "objarray.h"
1010

11-
// builtins
12-
// we put these tables in ROM because they're always needed and take up quite a bit of room in RAM
13-
// in fact, it uses less ROM here in table form than the equivalent in code form initialising a dynamic mp_map_t object in RAM
14-
// at the moment it's a linear table, but we could convert it to a const mp_map_t table with a simple preprocessing script
15-
16-
typedef struct _mp_builtin_elem_t {
17-
qstr qstr;
18-
mp_obj_t elem;
19-
} mp_builtin_elem_t;
20-
21-
STATIC const mp_builtin_elem_t builtin_object_table[] = {
11+
STATIC const mp_map_elem_t mp_builtin_object_table[] = {
2212
// built-in core functions
23-
{ MP_QSTR___build_class__, (mp_obj_t)&mp_builtin___build_class___obj },
24-
{ MP_QSTR___import__, (mp_obj_t)&mp_builtin___import___obj },
25-
{ MP_QSTR___repl_print__, (mp_obj_t)&mp_builtin___repl_print___obj },
13+
{ MP_OBJ_NEW_QSTR(MP_QSTR___build_class__), (mp_obj_t)&mp_builtin___build_class___obj },
14+
{ MP_OBJ_NEW_QSTR(MP_QSTR___import__), (mp_obj_t)&mp_builtin___import___obj },
15+
{ MP_OBJ_NEW_QSTR(MP_QSTR___repl_print__), (mp_obj_t)&mp_builtin___repl_print___obj },
2616

2717
// built-in types
28-
{ MP_QSTR_bool, (mp_obj_t)&mp_type_bool },
29-
{ MP_QSTR_bytes, (mp_obj_t)&mp_type_bytes },
18+
{ MP_OBJ_NEW_QSTR(MP_QSTR_bool), (mp_obj_t)&mp_type_bool },
19+
{ MP_OBJ_NEW_QSTR(MP_QSTR_bytes), (mp_obj_t)&mp_type_bytes },
3020
#if MICROPY_ENABLE_FLOAT
31-
{ MP_QSTR_complex, (mp_obj_t)&mp_type_complex },
21+
{ MP_OBJ_NEW_QSTR(MP_QSTR_complex), (mp_obj_t)&mp_type_complex },
3222
#endif
33-
{ MP_QSTR_dict, (mp_obj_t)&mp_type_dict },
34-
{ MP_QSTR_enumerate, (mp_obj_t)&mp_type_enumerate },
35-
{ MP_QSTR_filter, (mp_obj_t)&mp_type_filter },
23+
{ MP_OBJ_NEW_QSTR(MP_QSTR_dict), (mp_obj_t)&mp_type_dict },
24+
{ MP_OBJ_NEW_QSTR(MP_QSTR_enumerate), (mp_obj_t)&mp_type_enumerate },
25+
{ MP_OBJ_NEW_QSTR(MP_QSTR_filter), (mp_obj_t)&mp_type_filter },
3626
#if MICROPY_ENABLE_FLOAT
37-
{ MP_QSTR_float, (mp_obj_t)&mp_type_float },
27+
{ MP_OBJ_NEW_QSTR(MP_QSTR_float), (mp_obj_t)&mp_type_float },
3828
#endif
39-
{ MP_QSTR_int, (mp_obj_t)&mp_type_int },
40-
{ MP_QSTR_list, (mp_obj_t)&mp_type_list },
41-
{ MP_QSTR_map, (mp_obj_t)&mp_type_map },
42-
{ MP_QSTR_object, (mp_obj_t)&mp_type_object },
43-
{ MP_QSTR_set, (mp_obj_t)&mp_type_set },
44-
{ MP_QSTR_str, (mp_obj_t)&mp_type_str },
45-
{ MP_QSTR_super, (mp_obj_t)&mp_type_super },
46-
{ MP_QSTR_tuple, (mp_obj_t)&mp_type_tuple },
47-
{ MP_QSTR_type, (mp_obj_t)&mp_type_type },
48-
{ MP_QSTR_zip, (mp_obj_t)&mp_type_zip },
49-
50-
{ MP_QSTR_classmethod, (mp_obj_t)&mp_type_classmethod },
51-
{ MP_QSTR_staticmethod, (mp_obj_t)&mp_type_staticmethod },
29+
{ MP_OBJ_NEW_QSTR(MP_QSTR_int), (mp_obj_t)&mp_type_int },
30+
{ MP_OBJ_NEW_QSTR(MP_QSTR_list), (mp_obj_t)&mp_type_list },
31+
{ MP_OBJ_NEW_QSTR(MP_QSTR_map), (mp_obj_t)&mp_type_map },
32+
{ MP_OBJ_NEW_QSTR(MP_QSTR_object), (mp_obj_t)&mp_type_object },
33+
{ MP_OBJ_NEW_QSTR(MP_QSTR_set), (mp_obj_t)&mp_type_set },
34+
{ MP_OBJ_NEW_QSTR(MP_QSTR_str), (mp_obj_t)&mp_type_str },
35+
{ MP_OBJ_NEW_QSTR(MP_QSTR_super), (mp_obj_t)&mp_type_super },
36+
{ MP_OBJ_NEW_QSTR(MP_QSTR_tuple), (mp_obj_t)&mp_type_tuple },
37+
{ MP_OBJ_NEW_QSTR(MP_QSTR_type), (mp_obj_t)&mp_type_type },
38+
{ MP_OBJ_NEW_QSTR(MP_QSTR_zip), (mp_obj_t)&mp_type_zip },
39+
40+
{ MP_OBJ_NEW_QSTR(MP_QSTR_classmethod), (mp_obj_t)&mp_type_classmethod },
41+
{ MP_OBJ_NEW_QSTR(MP_QSTR_staticmethod), (mp_obj_t)&mp_type_staticmethod },
5242

5343
// built-in objects
54-
{ MP_QSTR_Ellipsis, (mp_obj_t)&mp_const_ellipsis_obj },
44+
{ MP_OBJ_NEW_QSTR(MP_QSTR_Ellipsis), (mp_obj_t)&mp_const_ellipsis_obj },
5545

5646
// built-in user functions
57-
{ MP_QSTR_abs, (mp_obj_t)&mp_builtin_abs_obj },
58-
{ MP_QSTR_all, (mp_obj_t)&mp_builtin_all_obj },
59-
{ MP_QSTR_any, (mp_obj_t)&mp_builtin_any_obj },
60-
{ MP_QSTR_callable, (mp_obj_t)&mp_builtin_callable_obj },
61-
{ MP_QSTR_chr, (mp_obj_t)&mp_builtin_chr_obj },
62-
{ MP_QSTR_dir, (mp_obj_t)&mp_builtin_dir_obj },
63-
{ MP_QSTR_divmod, (mp_obj_t)&mp_builtin_divmod_obj },
64-
{ MP_QSTR_eval, (mp_obj_t)&mp_builtin_eval_obj },
65-
{ MP_QSTR_exec, (mp_obj_t)&mp_builtin_exec_obj },
66-
{ MP_QSTR_getattr, (mp_obj_t)&mp_builtin_getattr_obj },
67-
{ MP_QSTR_hash, (mp_obj_t)&mp_builtin_hash_obj },
68-
{ MP_QSTR_id, (mp_obj_t)&mp_builtin_id_obj },
69-
{ MP_QSTR_isinstance, (mp_obj_t)&mp_builtin_isinstance_obj },
70-
{ MP_QSTR_issubclass, (mp_obj_t)&mp_builtin_issubclass_obj },
71-
{ MP_QSTR_iter, (mp_obj_t)&mp_builtin_iter_obj },
72-
{ MP_QSTR_len, (mp_obj_t)&mp_builtin_len_obj },
73-
{ MP_QSTR_max, (mp_obj_t)&mp_builtin_max_obj },
74-
{ MP_QSTR_min, (mp_obj_t)&mp_builtin_min_obj },
75-
{ MP_QSTR_next, (mp_obj_t)&mp_builtin_next_obj },
76-
{ MP_QSTR_ord, (mp_obj_t)&mp_builtin_ord_obj },
77-
{ MP_QSTR_pow, (mp_obj_t)&mp_builtin_pow_obj },
78-
{ MP_QSTR_print, (mp_obj_t)&mp_builtin_print_obj },
79-
{ MP_QSTR_range, (mp_obj_t)&mp_builtin_range_obj },
80-
{ MP_QSTR_repr, (mp_obj_t)&mp_builtin_repr_obj },
81-
{ MP_QSTR_sorted, (mp_obj_t)&mp_builtin_sorted_obj },
82-
{ MP_QSTR_sum, (mp_obj_t)&mp_builtin_sum_obj },
83-
{ MP_QSTR_bytearray, (mp_obj_t)&mp_builtin_bytearray_obj },
47+
{ MP_OBJ_NEW_QSTR(MP_QSTR_abs), (mp_obj_t)&mp_builtin_abs_obj },
48+
{ MP_OBJ_NEW_QSTR(MP_QSTR_all), (mp_obj_t)&mp_builtin_all_obj },
49+
{ MP_OBJ_NEW_QSTR(MP_QSTR_any), (mp_obj_t)&mp_builtin_any_obj },
50+
{ MP_OBJ_NEW_QSTR(MP_QSTR_callable), (mp_obj_t)&mp_builtin_callable_obj },
51+
{ MP_OBJ_NEW_QSTR(MP_QSTR_chr), (mp_obj_t)&mp_builtin_chr_obj },
52+
{ MP_OBJ_NEW_QSTR(MP_QSTR_dir), (mp_obj_t)&mp_builtin_dir_obj },
53+
{ MP_OBJ_NEW_QSTR(MP_QSTR_divmod), (mp_obj_t)&mp_builtin_divmod_obj },
54+
{ MP_OBJ_NEW_QSTR(MP_QSTR_eval), (mp_obj_t)&mp_builtin_eval_obj },
55+
{ MP_OBJ_NEW_QSTR(MP_QSTR_exec), (mp_obj_t)&mp_builtin_exec_obj },
56+
{ MP_OBJ_NEW_QSTR(MP_QSTR_getattr), (mp_obj_t)&mp_builtin_getattr_obj },
57+
{ MP_OBJ_NEW_QSTR(MP_QSTR_hash), (mp_obj_t)&mp_builtin_hash_obj },
58+
{ MP_OBJ_NEW_QSTR(MP_QSTR_id), (mp_obj_t)&mp_builtin_id_obj },
59+
{ MP_OBJ_NEW_QSTR(MP_QSTR_isinstance), (mp_obj_t)&mp_builtin_isinstance_obj },
60+
{ MP_OBJ_NEW_QSTR(MP_QSTR_issubclass), (mp_obj_t)&mp_builtin_issubclass_obj },
61+
{ MP_OBJ_NEW_QSTR(MP_QSTR_iter), (mp_obj_t)&mp_builtin_iter_obj },
62+
{ MP_OBJ_NEW_QSTR(MP_QSTR_len), (mp_obj_t)&mp_builtin_len_obj },
63+
{ MP_OBJ_NEW_QSTR(MP_QSTR_max), (mp_obj_t)&mp_builtin_max_obj },
64+
{ MP_OBJ_NEW_QSTR(MP_QSTR_min), (mp_obj_t)&mp_builtin_min_obj },
65+
{ MP_OBJ_NEW_QSTR(MP_QSTR_next), (mp_obj_t)&mp_builtin_next_obj },
66+
{ MP_OBJ_NEW_QSTR(MP_QSTR_ord), (mp_obj_t)&mp_builtin_ord_obj },
67+
{ MP_OBJ_NEW_QSTR(MP_QSTR_pow), (mp_obj_t)&mp_builtin_pow_obj },
68+
{ MP_OBJ_NEW_QSTR(MP_QSTR_print), (mp_obj_t)&mp_builtin_print_obj },
69+
{ MP_OBJ_NEW_QSTR(MP_QSTR_range), (mp_obj_t)&mp_builtin_range_obj },
70+
{ MP_OBJ_NEW_QSTR(MP_QSTR_repr), (mp_obj_t)&mp_builtin_repr_obj },
71+
{ MP_OBJ_NEW_QSTR(MP_QSTR_sorted), (mp_obj_t)&mp_builtin_sorted_obj },
72+
{ MP_OBJ_NEW_QSTR(MP_QSTR_sum), (mp_obj_t)&mp_builtin_sum_obj },
73+
{ MP_OBJ_NEW_QSTR(MP_QSTR_bytearray), (mp_obj_t)&mp_builtin_bytearray_obj },
8474

8575
// built-in exceptions
86-
{ MP_QSTR_BaseException, (mp_obj_t)&mp_type_BaseException },
87-
{ MP_QSTR_ArithmeticError, (mp_obj_t)&mp_type_ArithmeticError },
88-
{ MP_QSTR_AssertionError, (mp_obj_t)&mp_type_AssertionError },
89-
{ MP_QSTR_AttributeError, (mp_obj_t)&mp_type_AttributeError },
90-
{ MP_QSTR_EOFError, (mp_obj_t)&mp_type_EOFError },
91-
{ MP_QSTR_Exception, (mp_obj_t)&mp_type_Exception },
92-
{ MP_QSTR_GeneratorExit, (mp_obj_t)&mp_type_GeneratorExit },
93-
{ MP_QSTR_IOError, (mp_obj_t)&mp_type_IOError },
94-
{ MP_QSTR_ImportError, (mp_obj_t)&mp_type_ImportError },
95-
{ MP_QSTR_IndentationError, (mp_obj_t)&mp_type_IndentationError },
96-
{ MP_QSTR_IndexError, (mp_obj_t)&mp_type_IndexError },
97-
{ MP_QSTR_KeyError, (mp_obj_t)&mp_type_KeyError },
98-
{ MP_QSTR_LookupError, (mp_obj_t)&mp_type_LookupError },
99-
{ MP_QSTR_MemoryError, (mp_obj_t)&mp_type_MemoryError },
100-
{ MP_QSTR_NameError, (mp_obj_t)&mp_type_NameError },
101-
{ MP_QSTR_NotImplementedError, (mp_obj_t)&mp_type_NotImplementedError },
102-
{ MP_QSTR_OSError, (mp_obj_t)&mp_type_OSError },
103-
{ MP_QSTR_OverflowError, (mp_obj_t)&mp_type_OverflowError },
104-
{ MP_QSTR_RuntimeError, (mp_obj_t)&mp_type_RuntimeError },
105-
{ MP_QSTR_StopIteration, (mp_obj_t)&mp_type_StopIteration },
106-
{ MP_QSTR_SyntaxError, (mp_obj_t)&mp_type_SyntaxError },
107-
{ MP_QSTR_SystemError, (mp_obj_t)&mp_type_SystemError },
108-
{ MP_QSTR_TypeError, (mp_obj_t)&mp_type_TypeError },
109-
{ MP_QSTR_ValueError, (mp_obj_t)&mp_type_ValueError },
110-
{ MP_QSTR_ZeroDivisionError, (mp_obj_t)&mp_type_ZeroDivisionError },
76+
{ MP_OBJ_NEW_QSTR(MP_QSTR_BaseException), (mp_obj_t)&mp_type_BaseException },
77+
{ MP_OBJ_NEW_QSTR(MP_QSTR_ArithmeticError), (mp_obj_t)&mp_type_ArithmeticError },
78+
{ MP_OBJ_NEW_QSTR(MP_QSTR_AssertionError), (mp_obj_t)&mp_type_AssertionError },
79+
{ MP_OBJ_NEW_QSTR(MP_QSTR_AttributeError), (mp_obj_t)&mp_type_AttributeError },
80+
{ MP_OBJ_NEW_QSTR(MP_QSTR_EOFError), (mp_obj_t)&mp_type_EOFError },
81+
{ MP_OBJ_NEW_QSTR(MP_QSTR_Exception), (mp_obj_t)&mp_type_Exception },
82+
{ MP_OBJ_NEW_QSTR(MP_QSTR_GeneratorExit), (mp_obj_t)&mp_type_GeneratorExit },
83+
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOError), (mp_obj_t)&mp_type_IOError },
84+
{ MP_OBJ_NEW_QSTR(MP_QSTR_ImportError), (mp_obj_t)&mp_type_ImportError },
85+
{ MP_OBJ_NEW_QSTR(MP_QSTR_IndentationError), (mp_obj_t)&mp_type_IndentationError },
86+
{ MP_OBJ_NEW_QSTR(MP_QSTR_IndexError), (mp_obj_t)&mp_type_IndexError },
87+
{ MP_OBJ_NEW_QSTR(MP_QSTR_KeyError), (mp_obj_t)&mp_type_KeyError },
88+
{ MP_OBJ_NEW_QSTR(MP_QSTR_LookupError), (mp_obj_t)&mp_type_LookupError },
89+
{ MP_OBJ_NEW_QSTR(MP_QSTR_MemoryError), (mp_obj_t)&mp_type_MemoryError },
90+
{ MP_OBJ_NEW_QSTR(MP_QSTR_NameError), (mp_obj_t)&mp_type_NameError },
91+
{ MP_OBJ_NEW_QSTR(MP_QSTR_NotImplementedError), (mp_obj_t)&mp_type_NotImplementedError },
92+
{ MP_OBJ_NEW_QSTR(MP_QSTR_OSError), (mp_obj_t)&mp_type_OSError },
93+
{ MP_OBJ_NEW_QSTR(MP_QSTR_OverflowError), (mp_obj_t)&mp_type_OverflowError },
94+
{ MP_OBJ_NEW_QSTR(MP_QSTR_RuntimeError), (mp_obj_t)&mp_type_RuntimeError },
95+
{ MP_OBJ_NEW_QSTR(MP_QSTR_StopIteration), (mp_obj_t)&mp_type_StopIteration },
96+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SyntaxError), (mp_obj_t)&mp_type_SyntaxError },
97+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SystemError), (mp_obj_t)&mp_type_SystemError },
98+
{ MP_OBJ_NEW_QSTR(MP_QSTR_TypeError), (mp_obj_t)&mp_type_TypeError },
99+
{ MP_OBJ_NEW_QSTR(MP_QSTR_ValueError), (mp_obj_t)&mp_type_ValueError },
100+
{ MP_OBJ_NEW_QSTR(MP_QSTR_ZeroDivisionError), (mp_obj_t)&mp_type_ZeroDivisionError },
111101
// Somehow CPython managed to have OverflowError not inherit from ValueError ;-/
112102
// TODO: For MICROPY_CPYTHON_COMPAT==0 use ValueError to avoid exc proliferation
113103

114104
// Extra builtins as defined by a port
115105
MICROPY_EXTRA_BUILTINS
106+
};
116107

117-
{ MP_QSTR_, MP_OBJ_NULL }, // end of list sentinel
108+
const mp_obj_dict_t mp_builtin_object_dict_obj = {
109+
.base = {&mp_type_dict},
110+
.map = {
111+
.all_keys_are_qstrs = 1,
112+
.table_is_fixed_array = 1,
113+
.used = sizeof(mp_builtin_object_table) / sizeof(mp_map_elem_t),
114+
.alloc = sizeof(mp_builtin_object_table) / sizeof(mp_map_elem_t),
115+
.table = (mp_map_elem_t*)mp_builtin_object_table,
116+
},
118117
};
119118

120-
STATIC const mp_builtin_elem_t builtin_module_table[] = {
121-
{ MP_QSTR___main__, (mp_obj_t)&mp_module___main__ },
122-
{ MP_QSTR_micropython, (mp_obj_t)&mp_module_micropython },
119+
STATIC const mp_map_elem_t mp_builtin_module_table[] = {
120+
{ MP_OBJ_NEW_QSTR(MP_QSTR___main__), (mp_obj_t)&mp_module___main__ },
121+
{ MP_OBJ_NEW_QSTR(MP_QSTR_micropython), (mp_obj_t)&mp_module_micropython },
123122

124-
{ MP_QSTR_array, (mp_obj_t)&mp_module_array },
123+
{ MP_OBJ_NEW_QSTR(MP_QSTR_array), (mp_obj_t)&mp_module_array },
125124
#if MICROPY_ENABLE_MOD_IO
126-
{ MP_QSTR_io, (mp_obj_t)&mp_module_io },
125+
{ MP_OBJ_NEW_QSTR(MP_QSTR_io), (mp_obj_t)&mp_module_io },
127126
#endif
128-
{ MP_QSTR_collections, (mp_obj_t)&mp_module_collections },
127+
{ MP_OBJ_NEW_QSTR(MP_QSTR_collections), (mp_obj_t)&mp_module_collections },
129128

130129
#if MICROPY_ENABLE_FLOAT
131-
{ MP_QSTR_math, (mp_obj_t)&mp_module_math },
130+
{ MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&mp_module_math },
132131
#endif
133132

134133
// extra builtin modules as defined by a port
135134
MICROPY_EXTRA_BUILTIN_MODULES
136-
137-
{ MP_QSTR_, MP_OBJ_NULL }, // end of list sentinel
138135
};
139136

140-
STATIC mp_obj_t mp_builtin_tables_lookup(const mp_builtin_elem_t *table, qstr q) {
141-
for (; table->qstr != MP_QSTR_; table++) {
142-
if (table->qstr == q) {
143-
return table->elem;
144-
}
145-
}
146-
return MP_OBJ_NULL;
147-
}
148-
149-
mp_obj_t mp_builtin_tables_lookup_object(qstr q) {
150-
return mp_builtin_tables_lookup(&builtin_object_table[0], q);
151-
}
152-
153-
mp_obj_t mp_builtin_tables_lookup_module(qstr q) {
154-
return mp_builtin_tables_lookup(&builtin_module_table[0], q);
155-
}
137+
const mp_obj_dict_t mp_builtin_module_dict_obj = {
138+
.base = {&mp_type_dict},
139+
.map = {
140+
.all_keys_are_qstrs = 1,
141+
.table_is_fixed_array = 1,
142+
.used = sizeof(mp_builtin_module_table) / sizeof(mp_map_elem_t),
143+
.alloc = sizeof(mp_builtin_module_table) / sizeof(mp_map_elem_t),
144+
.table = (mp_map_elem_t*)mp_builtin_module_table,
145+
},
146+
};

py/builtintables.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
mp_obj_t mp_builtin_tables_lookup_object(qstr q);
2-
mp_obj_t mp_builtin_tables_lookup_module(qstr q);
1+
extern const mp_obj_dict_t mp_builtin_object_dict_obj;
2+
extern const mp_obj_dict_t mp_builtin_module_dict_obj;

py/objfun.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ mp_obj_t mp_make_function_var_between(int n_args_min, int n_args_max, mp_fun_var
152152

153153
typedef struct _mp_obj_fun_bc_t {
154154
mp_obj_base_t base;
155-
mp_map_t *globals; // the context within which this function was defined
155+
mp_obj_dict_t *globals; // the context within which this function was defined
156156
machine_uint_t n_args : 15; // number of arguments this function takes
157157
machine_uint_t n_def_args : 15; // number of default arguments
158158
machine_uint_t takes_var_args : 1; // set if this function takes variable args
@@ -326,7 +326,7 @@ continue2:;
326326
}
327327
}
328328

329-
mp_map_t *old_globals = mp_globals_get();
329+
mp_obj_dict_t *old_globals = mp_globals_get();
330330
mp_globals_set(self->globals);
331331
mp_obj_t result;
332332
DEBUG_printf("Calling: args=%p, n_args=%d, extra_args=%p, n_extra_args=%d\n", args, n_args, extra_args, n_extra_args);

py/objmodule.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,16 @@ mp_obj_t mp_module_get(qstr module_name) {
8686
// lookup module
8787
mp_map_elem_t *el = mp_map_lookup(&mp_loaded_modules_map, MP_OBJ_NEW_QSTR(module_name), MP_MAP_LOOKUP);
8888

89-
// module found, return it
90-
if (el != NULL) {
91-
return el->value;
89+
if (el == NULL) {
90+
// module not found, look for builtin module names
91+
el = mp_map_lookup((mp_map_t*)&mp_builtin_module_dict_obj.map, MP_OBJ_NEW_QSTR(module_name), MP_MAP_LOOKUP);
92+
if (el == NULL) {
93+
return MP_OBJ_NULL;
94+
}
9295
}
9396

94-
// module not found, look for builtin module names
95-
// it will return MP_OBJ_NULL if nothing found
96-
return mp_builtin_tables_lookup_module(module_name);
97+
// module found, return it
98+
return el->value;
9799
}
98100

99101
void mp_module_register(qstr qstr, mp_obj_t module) {

0 commit comments

Comments
 (0)