diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2008-12-17 00:38:28 +0000 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2008-12-17 00:38:28 +0000 |
commit | d0c3515bc5b31a19d00bfc685d7657ad7d79fa94 (patch) | |
tree | 299253e76cf9b66349bdaf0cca8c95da19671c74 /Python/compile.c | |
parent | 43caaa09ea364aab6cbd7ede2aa9c3d004a129a5 (diff) | |
download | cpython-git-d0c3515bc5b31a19d00bfc685d7657ad7d79fa94.tar.gz |
Issue #2183: Simplify and optimize bytecode for list comprehensions.
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 33 |
1 files changed, 7 insertions, 26 deletions
diff --git a/Python/compile.c b/Python/compile.c index 88d54ab944..756a903340 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -693,7 +693,7 @@ opcode_stack_effect(int opcode, int oparg) return 0; case LIST_APPEND: - return -2; + return -1; case BINARY_POWER: case BINARY_MULTIPLY: @@ -2599,9 +2599,8 @@ compiler_call(struct compiler *c, expr_ty e) } static int -compiler_listcomp_generator(struct compiler *c, PyObject *tmpname, - asdl_seq *generators, int gen_index, - expr_ty elt) +compiler_listcomp_generator(struct compiler *c, asdl_seq *generators, + int gen_index, expr_ty elt) { /* generate code for the iterator, then each of the ifs, and then write to the element */ @@ -2638,16 +2637,13 @@ compiler_listcomp_generator(struct compiler *c, PyObject *tmpname, } if (++gen_index < asdl_seq_LEN(generators)) - if (!compiler_listcomp_generator(c, tmpname, - generators, gen_index, elt)) + if (!compiler_listcomp_generator(c, generators, gen_index, elt)) return 0; /* only append after the last for generator */ if (gen_index >= asdl_seq_LEN(generators)) { - if (!compiler_nameop(c, tmpname, Load)) - return 0; VISIT(c, expr, elt); - ADDOP(c, LIST_APPEND); + ADDOP_I(c, LIST_APPEND, gen_index+1); compiler_use_next_block(c, skip); } @@ -2659,10 +2655,6 @@ compiler_listcomp_generator(struct compiler *c, PyObject *tmpname, } ADDOP_JABS(c, JUMP_ABSOLUTE, start); compiler_use_next_block(c, anchor); - /* delete the temporary list name added to locals */ - if (gen_index == 1) - if (!compiler_nameop(c, tmpname, Del)) - return 0; return 1; } @@ -2670,21 +2662,10 @@ compiler_listcomp_generator(struct compiler *c, PyObject *tmpname, static int compiler_listcomp(struct compiler *c, expr_ty e) { - identifier tmp; - int rc = 0; - asdl_seq *generators = e->v.ListComp.generators; - assert(e->kind == ListComp_kind); - tmp = compiler_new_tmpname(c); - if (!tmp) - return 0; ADDOP_I(c, BUILD_LIST, 0); - ADDOP(c, DUP_TOP); - if (compiler_nameop(c, tmp, Store)) - rc = compiler_listcomp_generator(c, tmp, generators, 0, - e->v.ListComp.elt); - Py_DECREF(tmp); - return rc; + return compiler_listcomp_generator(c, e->v.ListComp.generators, 0, + e->v.ListComp.elt); } static int |