summaryrefslogtreecommitdiffstatshomepage
path: root/py/runtime.c
diff options
context:
space:
mode:
authorJohn R. Lenton <jlenton@gmail.com>2014-01-03 22:55:16 +0000
committerJohn R. Lenton <jlenton@gmail.com>2014-01-03 22:55:16 +0000
commit97334c85d0b53ef1648eb76ec6e9e2b1efab1f97 (patch)
treed10f6b6b7ca3394e6f7dc31ca55e0df2b39abe02 /py/runtime.c
parent25f417c08c2cdb5c4a7564d1e69766c0448d7984 (diff)
parentb7aa72710ee6798c6d2bc2632be24206e526fc1e (diff)
downloadmicropython-97334c85d0b53ef1648eb76ec6e9e2b1efab1f97.tar.gz
micropython-97334c85d0b53ef1648eb76ec6e9e2b1efab1f97.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'py/runtime.c')
-rw-r--r--py/runtime.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/py/runtime.c b/py/runtime.c
index 3fae61f6fe..3144321f3a 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -281,14 +281,6 @@ void rt_assign_inline_asm_code(int unique_code_id, void *fun, uint len, int n_ar
#endif
}
-mp_map_t *rt_get_map_locals(void) {
- return map_locals;
-}
-
-void rt_set_map_locals(mp_map_t *m) {
- map_locals = m;
-}
-
static bool fit_small_int(mp_small_int_t o) {
return true;
}
@@ -479,6 +471,16 @@ mp_obj_t rt_unary_op(int op, mp_obj_t arg) {
mp_obj_t rt_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
DEBUG_OP_printf("binary %d %p %p\n", op, lhs, rhs);
+
+ // TODO correctly distinguish inplace operators for mutable objects
+ // lookup logic that CPython uses for +=:
+ // check for implemented +=
+ // then check for implemented +
+ // then check for implemented seq.inplace_concat
+ // then check for implemented seq.concat
+ // then fail
+ // note that list does not implement + or +=, so that inplace_concat is reached first for +=
+
if (MP_OBJ_IS_SMALL_INT(lhs) && MP_OBJ_IS_SMALL_INT(rhs)) {
mp_small_int_t lhs_val = MP_OBJ_SMALL_INT_VALUE(lhs);
mp_small_int_t rhs_val = MP_OBJ_SMALL_INT_VALUE(rhs);
@@ -786,6 +788,7 @@ mp_obj_t rt_load_attr(mp_obj_t base, qstr attr) {
} else if (MP_OBJ_IS_TYPE(base, &instance_type)) {
return mp_obj_instance_load_attr(base, attr);
} else if (MP_OBJ_IS_TYPE(base, &module_type)) {
+ DEBUG_OP_printf("lookup module map %p\n", mp_obj_module_get_globals(base));
mp_map_elem_t *elem = mp_qstr_map_lookup(mp_obj_module_get_globals(base), attr, false);
if (elem == NULL) {
// TODO what about generic method lookup?
@@ -913,6 +916,24 @@ mp_obj_t rt_import_from(mp_obj_t module, qstr name) {
return x;
}
+mp_map_t *rt_locals_get(void) {
+ return map_locals;
+}
+
+void rt_locals_set(mp_map_t *m) {
+ DEBUG_OP_printf("rt_locals_set(%p)\n", m);
+ map_locals = m;
+}
+
+mp_map_t *rt_globals_get(void) {
+ return map_globals;
+}
+
+void rt_globals_set(mp_map_t *m) {
+ DEBUG_OP_printf("rt_globals_set(%p)\n", m);
+ map_globals = m;
+}
+
// these must correspond to the respective enum
void *const rt_fun_table[RT_F_NUMBER_OF] = {
rt_load_const_dec,