Skip to content

Commit 66edc5d

Browse files
committed
py: Implement DELETE_SUBSCR bytecode; implement mp_obj_dict_delete.
1 parent 3c8aecf commit 66edc5d

5 files changed

Lines changed: 30 additions & 0 deletions

File tree

py/obj.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ typedef struct _mp_obj_dict_t {
440440
} mp_obj_dict_t;
441441
uint mp_obj_dict_len(mp_obj_t self_in);
442442
mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value);
443+
mp_obj_t mp_obj_dict_delete(mp_obj_t self_in, mp_obj_t key);
443444
mp_map_t *mp_obj_dict_get_map(mp_obj_t self_in);
444445

445446
// set

py/objdict.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,13 @@ mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value) {
481481
return self_in;
482482
}
483483

484+
mp_obj_t mp_obj_dict_delete(mp_obj_t self_in, mp_obj_t key) {
485+
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_dict));
486+
mp_obj_dict_t *self = self_in;
487+
dict_get_helper(&self->map, key, NULL, MP_MAP_LOOKUP_REMOVE_IF_FOUND);
488+
return self_in;
489+
}
490+
484491
mp_map_t *mp_obj_dict_get_map(mp_obj_t self_in) {
485492
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_dict));
486493
mp_obj_dict_t *self = self_in;

py/runtime.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ void mp_store_name(qstr qstr, mp_obj_t obj) {
150150

151151
void mp_delete_name(qstr qstr) {
152152
DEBUG_OP_printf("delete name %s\n", qstr_str(qstr));
153+
// TODO raise NameError if qstr not found
153154
mp_map_lookup(map_locals, MP_OBJ_NEW_QSTR(qstr), MP_MAP_LOOKUP_REMOVE_IF_FOUND);
154155
}
155156

@@ -807,6 +808,21 @@ void mp_store_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) {
807808
}
808809
}
809810

811+
void mp_delete_subscr(mp_obj_t base, mp_obj_t index) {
812+
DEBUG_OP_printf("delete subscr %p[%p]\n", base, index);
813+
/* list delete not implemented
814+
if (MP_OBJ_IS_TYPE(base, &mp_type_list)) {
815+
// list delete
816+
mp_obj_list_delete(base, index);
817+
} else */
818+
if (MP_OBJ_IS_TYPE(base, &mp_type_dict)) {
819+
// dict delete
820+
mp_obj_dict_delete(base, index);
821+
} else {
822+
nlr_jump(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "'%s' object does not support item deletion", mp_obj_get_type_str(base)));
823+
}
824+
}
825+
810826
mp_obj_t mp_getiter(mp_obj_t o_in) {
811827
mp_obj_type_t *type = mp_obj_get_type(o_in);
812828
if (type->getiter != NULL) {

py/runtime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ void mp_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest);
4949
void mp_load_method_maybe(mp_obj_t base, qstr attr, mp_obj_t *dest);
5050
void mp_store_attr(mp_obj_t base, qstr attr, mp_obj_t val);
5151
void mp_store_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t val);
52+
void mp_delete_subscr(mp_obj_t base, mp_obj_t index);
5253

5354
mp_obj_t mp_getiter(mp_obj_t o);
5455
mp_obj_t mp_iternext_allow_raise(mp_obj_t o); // may return MP_OBJ_NULL instead of raising StopIteration()

py/vm.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,11 @@ mp_vm_return_kind_t mp_execute_byte_code_2(const byte *code_info, const byte **i
324324
mp_delete_name(qst);
325325
break;
326326

327+
case MP_BC_DELETE_SUBSCR:
328+
mp_delete_subscr(sp[-1], sp[0]);
329+
sp -= 3;
330+
break;
331+
327332
case MP_BC_DUP_TOP:
328333
obj1 = TOP();
329334
PUSH(obj1);

0 commit comments

Comments
 (0)