diff options
author | John R. Lenton <jlenton@gmail.com> | 2014-01-03 22:55:16 +0000 |
---|---|---|
committer | John R. Lenton <jlenton@gmail.com> | 2014-01-03 22:55:16 +0000 |
commit | 97334c85d0b53ef1648eb76ec6e9e2b1efab1f97 (patch) | |
tree | d10f6b6b7ca3394e6f7dc31ca55e0df2b39abe02 /py/runtime.c | |
parent | 25f417c08c2cdb5c4a7564d1e69766c0448d7984 (diff) | |
parent | b7aa72710ee6798c6d2bc2632be24206e526fc1e (diff) | |
download | micropython-97334c85d0b53ef1648eb76ec6e9e2b1efab1f97.tar.gz micropython-97334c85d0b53ef1648eb76ec6e9e2b1efab1f97.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'py/runtime.c')
-rw-r--r-- | py/runtime.c | 37 |
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, |