diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2006-03-13 12:31:58 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2006-03-13 12:31:58 (GMT) |
commit | eadee9a7448170c054b9e30639f46cd110bd6263 (patch) | |
tree | 6b8b9e3e67b286e8849de92510170a766212ad0b /Python | |
parent | bfa8bd7b65a16f558308ecb4e70bccfcef359e12 (diff) | |
download | cpython-eadee9a7448170c054b9e30639f46cd110bd6263.zip cpython-eadee9a7448170c054b9e30639f46cd110bd6263.tar.gz cpython-eadee9a7448170c054b9e30639f46cd110bd6263.tar.bz2 |
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Diffstat (limited to 'Python')
-rw-r--r-- | Python/compile.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/Python/compile.c b/Python/compile.c index e3b3df8..baf3989 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3853,42 +3853,47 @@ compiler_visit_nested_slice(struct compiler *c, slice_ty s, static int compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) { + char * kindname = NULL; switch (s->kind) { + case Index_kind: + kindname = "index"; + if (ctx != AugStore) { + VISIT(c, expr, s->v.Index.value); + } + break; case Ellipsis_kind: - ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); + kindname = "ellipsis"; + if (ctx != AugStore) { + ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); + } break; case Slice_kind: + kindname = "slice"; if (!s->v.Slice.step) return compiler_simple_slice(c, s, ctx); - if (!compiler_slice(c, s, ctx)) - return 0; - if (ctx == AugLoad) { - ADDOP_I(c, DUP_TOPX, 2); - } - else if (ctx == AugStore) { - ADDOP(c, ROT_THREE); - } - return compiler_handle_subscr(c, "slice", ctx); - case ExtSlice_kind: { - int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); - for (i = 0; i < n; i++) { - slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i); - if (!compiler_visit_nested_slice(c, sub, ctx)) + if (ctx != AugStore) { + if (!compiler_slice(c, s, ctx)) return 0; } - ADDOP_I(c, BUILD_TUPLE, n); - return compiler_handle_subscr(c, "extended slice", ctx); - } - case Index_kind: - if (ctx != AugStore) - VISIT(c, expr, s->v.Index.value); - return compiler_handle_subscr(c, "index", ctx); + break; + case ExtSlice_kind: + kindname = "extended slice"; + if (ctx != AugStore) { + int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); + for (i = 0; i < n; i++) { + slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i); + if (!compiler_visit_nested_slice(c, sub, ctx)) + return 0; + } + ADDOP_I(c, BUILD_TUPLE, n); + } + break; default: PyErr_Format(PyExc_SystemError, - "invalid slice %d", s->kind); + "invalid subscript kind %d", s->kind); return 0; } - return 1; + return compiler_handle_subscr(c, kindname, ctx); } /* do depth-first search of basic block graph, starting with block. |