diff --git a/py/bc.c b/py/bc.c index cea31c93bd..1671cd314e 100644 --- a/py/bc.c +++ b/py/bc.c @@ -147,7 +147,7 @@ static void mp_setup_code_state_helper(mp_code_state_t *code_state, size_t n_arg // zero out the local stack to begin with memset(code_state_state, 0, n_state * sizeof(*code_state->state)); - const mp_obj_t *kwargs = args + n_args; + const mp_obj_t *kwargs = args ? args + n_args : NULL; // var_pos_kw_args points to the stack where the var-args tuple, and var-kw dict, should go (if they are needed) mp_obj_t *var_pos_kw_args = &code_state_state[n_state - 1 - n_pos_args - n_kwonly_args]; diff --git a/py/lexer.c b/py/lexer.c index 98a10c87b2..f1cf40344c 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -910,7 +910,8 @@ mp_lexer_t *mp_lexer_new_from_fd(qstr filename, int fd, bool close_fd) { #endif -void mp_lexer_free(mp_lexer_t *lex) { +void mp_lexer_free(void *lex_in) { + mp_lexer_t *lex = lex_in; if (lex) { lex->reader.close(lex->reader.data); vstr_clear(&lex->vstr); diff --git a/py/lexer.h b/py/lexer.h index 6e6c3e8f23..3fc125885b 100644 --- a/py/lexer.h +++ b/py/lexer.h @@ -198,7 +198,7 @@ mp_lexer_t *mp_lexer_new_from_file(qstr filename); mp_lexer_t *mp_lexer_new_from_fd(qstr filename, int fd, bool close_fd); #endif -void mp_lexer_free(mp_lexer_t *lex); +void mp_lexer_free(void *lex); void mp_lexer_to_next(mp_lexer_t *lex); #endif // MICROPY_INCLUDED_PY_LEXER_H diff --git a/py/map.c b/py/map.c index d40e3dc4d0..5a522302f4 100644 --- a/py/map.c +++ b/py/map.c @@ -190,23 +190,25 @@ mp_map_elem_t *MICROPY_WRAP_MP_MAP_LOOKUP(mp_map_lookup)(mp_map_t * map, mp_obj_ // if the map is an ordered array then we must do a brute force linear search if (map->is_ordered) { - for (mp_map_elem_t *elem = &map->table[0], *top = &map->table[map->used]; elem < top; elem++) { - if (elem->key == index || (!compare_only_ptrs && mp_obj_equal(elem->key, index))) { - #if MICROPY_PY_COLLECTIONS_ORDEREDDICT - if (MP_UNLIKELY(lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND)) { - // remove the found element by moving the rest of the array down - mp_obj_t value = elem->value; - --map->used; - memmove(elem, elem + 1, (top - elem - 1) * sizeof(*elem)); - // put the found element after the end so the caller can access it if needed - // note: caller must NULL the value so the GC can clean up (e.g. see dict_get_helper). - elem = &map->table[map->used]; - elem->key = MP_OBJ_NULL; - elem->value = value; + if (map->used) { + for (mp_map_elem_t *elem = &map->table[0], *top = &map->table[map->used]; elem < top; elem++) { + if (elem->key == index || (!compare_only_ptrs && mp_obj_equal(elem->key, index))) { + #if MICROPY_PY_COLLECTIONS_ORDEREDDICT + if (MP_UNLIKELY(lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND)) { + // remove the found element by moving the rest of the array down + mp_obj_t value = elem->value; + --map->used; + memmove(elem, elem + 1, (top - elem - 1) * sizeof(*elem)); + // put the found element after the end so the caller can access it if needed + // note: caller must NULL the value so the GC can clean up (e.g. see dict_get_helper). + elem = &map->table[map->used]; + elem->key = MP_OBJ_NULL; + elem->value = value; + } + #endif + MAP_CACHE_SET(index, elem - map->table); + return elem; } - #endif - MAP_CACHE_SET(index, elem - map->table); - return elem; } } #if MICROPY_PY_COLLECTIONS_ORDEREDDICT diff --git a/py/misc.h b/py/misc.h index 5c1cc2f7a8..833f9f45a8 100644 --- a/py/misc.h +++ b/py/misc.h @@ -214,7 +214,7 @@ char *vstr_null_terminated_str(vstr_t *vstr); void vstr_add_byte(vstr_t *vstr, byte v); void vstr_add_char(vstr_t *vstr, unichar chr); void vstr_add_str(vstr_t *vstr, const char *str); -void vstr_add_strn(vstr_t *vstr, const char *str, size_t len); +void vstr_add_strn(void *vstr, const char *str, size_t len); void vstr_ins_byte(vstr_t *vstr, size_t byte_pos, byte b); void vstr_ins_char(vstr_t *vstr, size_t char_pos, unichar chr); void vstr_cut_head_bytes(vstr_t *vstr, size_t bytes_to_cut); diff --git a/py/vm.c b/py/vm.c index 6b4a878992..c4f96a44cd 100644 --- a/py/vm.c +++ b/py/vm.c @@ -75,7 +75,7 @@ } while (0) #define DECODE_SLABEL \ - size_t slab; \ + int slab; \ do { \ if (ip[0] & 0x80) { \ slab = ((ip[0] & 0x7f) | (ip[1] << 7)) - 0x4000; \ @@ -792,7 +792,7 @@ unwind_jump:; if (*(sp - MP_OBJ_ITER_BUF_NSLOTS + 1) == MP_OBJ_NULL) { obj = *(sp - MP_OBJ_ITER_BUF_NSLOTS + 2); } else { - obj = MP_OBJ_FROM_PTR(&sp[-MP_OBJ_ITER_BUF_NSLOTS + 1]); + obj = MP_OBJ_FROM_PTR(sp - MP_OBJ_ITER_BUF_NSLOTS + 1); } mp_obj_t value = mp_iternext_allow_raise(obj); if (value == MP_OBJ_STOP_ITERATION) { @@ -821,7 +821,7 @@ unwind_jump:; ENTRY(MP_BC_BUILD_TUPLE): { MARK_EXC_IP_SELECTIVE(); DECODE_UINT; - sp -= unum - 1; + sp = sp - unum + 1; SET_TOP(mp_obj_new_tuple(unum, sp)); DISPATCH(); } @@ -829,7 +829,7 @@ unwind_jump:; ENTRY(MP_BC_BUILD_LIST): { MARK_EXC_IP_SELECTIVE(); DECODE_UINT; - sp -= unum - 1; + sp = sp - unum + 1; SET_TOP(mp_obj_new_list(unum, sp)); DISPATCH(); } diff --git a/py/vstr.c b/py/vstr.c index fc55d6948c..a34d571c88 100644 --- a/py/vstr.c +++ b/py/vstr.c @@ -177,7 +177,9 @@ void vstr_add_str(vstr_t *vstr, const char *str) { vstr_add_strn(vstr, str, strlen(str)); } -void vstr_add_strn(vstr_t *vstr, const char *str, size_t len) { +// The first parameter is declared as `void*` so that it can be used as a `print_strn` function. +void vstr_add_strn(void *vstr_in, const char *str, size_t len) { + vstr_t *vstr = vstr_in; vstr_ensure_extra(vstr, len); memmove(vstr->buf + vstr->len, str, len); vstr->len += len;