summaryrefslogtreecommitdiff
path: root/py/objmodule.c
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-01-24 16:21:38 -0800
committerGitHub <noreply@github.com>2018-01-24 16:21:38 -0800
commit5de29acbd2764e334d010ec3d476c779fde7142d (patch)
tree18bd805e22dab58efee7f480dd021c7c3f3b4f0e /py/objmodule.c
parenta5bfbbc12a95684371a76cd87585299e5e874552 (diff)
parentaa0ce98b3e7228a469fa11709fbd6864242079b4 (diff)
Merge pull request #547 from tannewt/alloc_long_lived
Introduce a long lived section of the heap.
Diffstat (limited to 'py/objmodule.c')
-rw-r--r--py/objmodule.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/py/objmodule.c b/py/objmodule.c
index 52c6520b9..86e37850e 100644
--- a/py/objmodule.c
+++ b/py/objmodule.c
@@ -27,6 +27,7 @@
#include <stdlib.h>
#include <assert.h>
+#include "py/gc.h"
#include "py/objmodule.h"
#include "py/runtime.h"
#include "py/builtin.h"
@@ -84,8 +85,9 @@ STATIC void module_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
mp_obj_dict_delete(MP_OBJ_FROM_PTR(dict), MP_OBJ_NEW_QSTR(attr));
} else {
// store attribute
+ mp_obj_t long_lived = gc_make_long_lived(dest[1]);
// TODO CPython allows STORE_ATTR to a module, but is this the correct implementation?
- mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), MP_OBJ_NEW_QSTR(attr), dest[1]);
+ mp_obj_dict_store(MP_OBJ_FROM_PTR(dict), MP_OBJ_NEW_QSTR(attr), long_lived);
}
dest[0] = MP_OBJ_NULL; // indicate success
}
@@ -108,9 +110,9 @@ mp_obj_t mp_obj_new_module(qstr module_name) {
}
// create new module object
- mp_obj_module_t *o = m_new_obj(mp_obj_module_t);
+ mp_obj_module_t *o = m_new_ll_obj(mp_obj_module_t);
o->base.type = &mp_type_module;
- o->globals = MP_OBJ_TO_PTR(mp_obj_new_dict(MICROPY_MODULE_DICT_SIZE));
+ o->globals = MP_OBJ_TO_PTR(gc_make_long_lived(mp_obj_new_dict(MICROPY_MODULE_DICT_SIZE)));
// store __name__ entry in the module
mp_obj_dict_store(MP_OBJ_FROM_PTR(o->globals), MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(module_name));
@@ -128,6 +130,12 @@ mp_obj_dict_t *mp_obj_module_get_globals(mp_obj_t self_in) {
return self->globals;
}
+void mp_obj_module_set_globals(mp_obj_t self_in, mp_obj_dict_t *globals) {
+ assert(MP_OBJ_IS_TYPE(self_in, &mp_type_module));
+ mp_obj_module_t *self = MP_OBJ_TO_PTR(self_in);
+ self->globals = globals;
+}
+
/******************************************************************************/
// Global module table and related functions