summaryrefslogtreecommitdiff
path: root/py/obj.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-17 22:10:53 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-17 22:10:53 +0100
commit729f7b42d65c016c9d5f27fb8a8122869f06c129 (patch)
tree8d8d8c2a89ff9011b06650c256a2d5f2458c930c /py/obj.c
parentde7c425139c92745280b62f7ebb756def96d072a (diff)
py: Merge BINARY_OP_SUBSCR and store_subscr (w/ delete) into subscr.
mp_obj_t->subscr now does load/store/delete.
Diffstat (limited to 'py/obj.c')
-rw-r--r--py/obj.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/py/obj.c b/py/obj.c
index 76350ed6d..3ace631a9 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -332,6 +332,24 @@ 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) {
+ mp_obj_type_t *type = mp_obj_get_type(base);
+ if (type->subscr != NULL) {
+ mp_obj_t ret = type->subscr(base, index, value);
+ if (ret != MP_OBJ_NOT_SUPPORTED) {
+ return ret;
+ }
+ // TODO: call base classes here?
+ }
+ if (value == MP_OBJ_NULL) {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "'%s' object does not support item deletion", mp_obj_get_type_str(base)));
+ } else if (value == MP_OBJ_SENTINEL) {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "'%s' object is not subscriptable", mp_obj_get_type_str(base)));
+ } else {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "'%s' object does not support item assignment", mp_obj_get_type_str(base)));
+ }
+}
+
// Return input argument. Useful as .getiter for objects which are
// their own iterators, etc.
mp_obj_t mp_identity(mp_obj_t self) {