summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorRoy Hooper <rhooper@toybox.ca>2019-11-23 12:09:26 -0500
committerRoy Hooper <rhooper@toybox.ca>2019-11-23 12:09:26 -0500
commitc770ccd93917cf46a7b8cef7613ff389d7c3d18d (patch)
treee063f44fe16ce0d7411511f55bdea48d97e84420 /py
parentfa57de06886f3ec6785ec74676da0b08758c81c7 (diff)
make ->subscr take an instance to pass when instance_subscr is called from subscr.
Diffstat (limited to 'py')
-rw-r--r--py/obj.c15
-rw-r--r--py/obj.h3
-rw-r--r--py/objarray.c2
-rw-r--r--py/objdict.c2
-rw-r--r--py/objlist.c2
-rw-r--r--py/objrange.c2
-rw-r--r--py/objstr.c2
-rw-r--r--py/objstrunicode.c2
-rw-r--r--py/objtuple.c2
-rw-r--r--py/objtuple.h2
-rw-r--r--py/objtype.c5
-rw-r--r--py/opmethods.c6
12 files changed, 22 insertions, 23 deletions
diff --git a/py/obj.c b/py/obj.c
index 6177f74b5..94c509be6 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -488,15 +488,14 @@ mp_obj_t mp_obj_len_maybe(mp_obj_t o_in) {
}
mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) {
+ return mp_obj_subscr_impl(base, index, value, base);
+}
+
+mp_obj_t mp_obj_subscr_impl(mp_obj_t base, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
mp_obj_type_t *type = mp_obj_get_type(base);
- mp_obj_t instance = base;
- // If we got an MP_OBJ_SENTINEL as the type, then we got called by instance_subscr
- if (type == MP_OBJ_SENTINEL) {
- instance = ((mp_obj_t *)base)[1];
- type = mp_obj_get_type(((mp_obj_t *)base)[2]);
- }
+
if (type->subscr != NULL) {
- mp_obj_t ret = type->subscr(instance, index, value);
+ mp_obj_t ret = type->subscr(base, index, value, instance);
// May have called port specific C code. Make sure it didn't mess up the heap.
assert_heap_ok();
if (ret != MP_OBJ_NULL) {
@@ -551,7 +550,7 @@ STATIC mp_obj_t generic_it_iternext(mp_obj_t self_in) {
mp_obj_type_t *type = mp_obj_get_type(self->obj);
mp_obj_t current_length = type->unary_op(MP_UNARY_OP_LEN, self->obj);
if (self->cur < MP_OBJ_SMALL_INT_VALUE(current_length)) {
- mp_obj_t o_out = type->subscr(self->obj, MP_OBJ_NEW_SMALL_INT(self->cur), MP_OBJ_SENTINEL);
+ mp_obj_t o_out = type->subscr(self->obj, MP_OBJ_NEW_SMALL_INT(self->cur), MP_OBJ_SENTINEL, self->obj);
self->cur += 1;
return o_out;
} else {
diff --git a/py/obj.h b/py/obj.h
index cf4216d02..edeeb2a4b 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -444,7 +444,7 @@ typedef mp_obj_t (*mp_call_fun_t)(mp_obj_t fun, size_t n_args, size_t n_kw, cons
typedef mp_obj_t (*mp_unary_op_fun_t)(mp_unary_op_t op, mp_obj_t);
typedef mp_obj_t (*mp_binary_op_fun_t)(mp_binary_op_t op, mp_obj_t, mp_obj_t);
typedef void (*mp_attr_fun_t)(mp_obj_t self_in, qstr attr, mp_obj_t *dest);
-typedef mp_obj_t (*mp_subscr_fun_t)(mp_obj_t self_in, mp_obj_t index, mp_obj_t value);
+typedef mp_obj_t (*mp_subscr_fun_t)(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance);
typedef mp_obj_t (*mp_getiter_fun_t)(mp_obj_t self_in, mp_obj_iter_buf_t *iter_buf);
// Buffer protocol
@@ -708,6 +708,7 @@ mp_obj_t mp_obj_id(mp_obj_t o_in);
mp_obj_t mp_obj_len(mp_obj_t o_in);
mp_obj_t mp_obj_len_maybe(mp_obj_t o_in); // may return MP_OBJ_NULL
mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t val);
+mp_obj_t mp_obj_subscr_impl(mp_obj_t base, mp_obj_t index, mp_obj_t val, mp_obj_t instance);
mp_obj_t mp_generic_unary_op(mp_unary_op_t op, mp_obj_t o_in);
// cell
diff --git a/py/objarray.c b/py/objarray.c
index 9114a63c5..70e57f190 100644
--- a/py/objarray.c
+++ b/py/objarray.c
@@ -396,7 +396,7 @@ STATIC mp_obj_t array_extend(mp_obj_t self_in, mp_obj_t arg_in) {
STATIC MP_DEFINE_CONST_FUN_OBJ_2(array_extend_obj, array_extend);
#endif
-STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) {
+STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value, mp_obj_t instance) {
if (value == MP_OBJ_NULL) {
// delete item
// TODO implement
diff --git a/py/objdict.c b/py/objdict.c
index 683fcb748..c13ad88e5 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -174,7 +174,7 @@ mp_obj_t mp_obj_dict_get(mp_obj_t self_in, mp_obj_t index) {
}
}
-STATIC mp_obj_t dict_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+STATIC mp_obj_t dict_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
if (value == MP_OBJ_NULL) {
// delete
mp_obj_dict_delete(self_in, index);
diff --git a/py/objlist.c b/py/objlist.c
index ea38e64e5..b0c62a6ee 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -158,7 +158,7 @@ STATIC mp_obj_t list_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) {
}
}
-STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
if (value == MP_OBJ_NULL) {
// delete
#if MICROPY_PY_BUILTINS_SLICE
diff --git a/py/objrange.c b/py/objrange.c
index 30d55c56c..f8b960900 100644
--- a/py/objrange.c
+++ b/py/objrange.c
@@ -158,7 +158,7 @@ STATIC mp_obj_t range_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs
}
#endif
-STATIC mp_obj_t range_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+STATIC mp_obj_t range_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
if (value == MP_OBJ_SENTINEL) {
// load
mp_obj_range_t *self = MP_OBJ_TO_PTR(self_in);
diff --git a/py/objstr.c b/py/objstr.c
index 6ef9a15b5..3d2cb338f 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -431,7 +431,7 @@ const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, s
#endif
// This is used for both bytes and 8-bit strings. This is not used for unicode strings.
-STATIC mp_obj_t bytes_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+STATIC mp_obj_t bytes_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
mp_obj_type_t *type = mp_obj_get_type(self_in);
GET_STR_DATA_LEN(self_in, self_data, self_len);
if (value == MP_OBJ_SENTINEL) {
diff --git a/py/objstrunicode.c b/py/objstrunicode.c
index 30000a51e..e29926683 100644
--- a/py/objstrunicode.c
+++ b/py/objstrunicode.c
@@ -197,7 +197,7 @@ const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, s
return s;
}
-STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
mp_obj_type_t *type = mp_obj_get_type(self_in);
assert(type == &mp_type_str);
GET_STR_DATA_LEN(self_in, self_data, self_len);
diff --git a/py/objtuple.c b/py/objtuple.c
index ed13cdcef..625c53bdd 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -177,7 +177,7 @@ mp_obj_t mp_obj_tuple_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) {
}
}
-mp_obj_t mp_obj_tuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+mp_obj_t mp_obj_tuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
if (value == MP_OBJ_SENTINEL) {
// load
mp_obj_tuple_t *self = MP_OBJ_TO_PTR(self_in);
diff --git a/py/objtuple.h b/py/objtuple.h
index 7f20ab7b6..4df3aeded 100644
--- a/py/objtuple.h
+++ b/py/objtuple.h
@@ -45,7 +45,7 @@ extern const mp_obj_type_t mp_type_tuple;
void mp_obj_tuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind);
mp_obj_t mp_obj_tuple_unary_op(mp_unary_op_t op, mp_obj_t self_in);
mp_obj_t mp_obj_tuple_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs);
-mp_obj_t mp_obj_tuple_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value);
+mp_obj_t mp_obj_tuple_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value, mp_obj_t instance);
mp_obj_t mp_obj_tuple_getiter(mp_obj_t o_in, mp_obj_iter_buf_t *iter_buf);
extern const mp_obj_type_t mp_type_attrtuple;
diff --git a/py/objtype.c b/py/objtype.c
index 7d41b8656..41ebe7b61 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -823,7 +823,7 @@ STATIC void mp_obj_instance_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
}
}
-STATIC mp_obj_t instance_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
+STATIC mp_obj_t instance_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value, mp_obj_t instance) {
mp_obj_instance_t *self = MP_OBJ_TO_PTR(self_in);
mp_obj_t member[2] = {MP_OBJ_NULL};
struct class_lookup_data lookup = {
@@ -850,8 +850,7 @@ STATIC mp_obj_t instance_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value
meth_args = 3;
}
if (member[0] == MP_OBJ_SENTINEL) {
- mp_obj_t args[3] = {MP_OBJ_SENTINEL, self_in, self->subobj[0]};
- return mp_obj_subscr(args, index, value);
+ return mp_obj_subscr_impl(self->subobj[0], index, value, instance);
} else if (member[0] != MP_OBJ_NULL) {
mp_obj_t args[3] = {self_in, index, value};
// TODO probably need to call mp_convert_member_lookup, and use mp_call_method_n_kw
diff --git a/py/opmethods.c b/py/opmethods.c
index 247fa5bbc..d906ddb6a 100644
--- a/py/opmethods.c
+++ b/py/opmethods.c
@@ -29,19 +29,19 @@
STATIC mp_obj_t op_getitem(mp_obj_t self_in, mp_obj_t key_in) {
mp_obj_type_t *type = mp_obj_get_type(self_in);
- return type->subscr(self_in, key_in, MP_OBJ_SENTINEL);
+ return type->subscr(self_in, key_in, MP_OBJ_SENTINEL, self_in);
}
MP_DEFINE_CONST_FUN_OBJ_2(mp_op_getitem_obj, op_getitem);
STATIC mp_obj_t op_setitem(mp_obj_t self_in, mp_obj_t key_in, mp_obj_t value_in) {
mp_obj_type_t *type = mp_obj_get_type(self_in);
- return type->subscr(self_in, key_in, value_in);
+ return type->subscr(self_in, key_in, value_in, self_in);
}
MP_DEFINE_CONST_FUN_OBJ_3(mp_op_setitem_obj, op_setitem);
STATIC mp_obj_t op_delitem(mp_obj_t self_in, mp_obj_t key_in) {
mp_obj_type_t *type = mp_obj_get_type(self_in);
- return type->subscr(self_in, key_in, MP_OBJ_NULL);
+ return type->subscr(self_in, key_in, MP_OBJ_NULL, self_in);
}
MP_DEFINE_CONST_FUN_OBJ_2(mp_op_delitem_obj, op_delitem);