Skip to content

Commit c555686

Browse files
committed
use generator
1 parent d737f33 commit c555686

1 file changed

Lines changed: 52 additions & 48 deletions

File tree

Python/codegen.c

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3738,7 +3738,7 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
37383738
asdl_keyword_seq *kwds = e->v.Call.keywords;
37393739
expr_ty func = e->v.Call.func;
37403740

3741-
// if (! PyUnicode_Contains(_PyCompile_Filename(c), PyUnicode_FromString("cc.py"))) return 0;
3741+
// if (! PyUnicode_Contains(_PyCompile_Filename(c), PyUnicode_FromString("cc.py"))) return 0;
37423742

37433743
if (! (func->kind == Name_kind &&
37443744
asdl_seq_LEN(args) == 1 &&
@@ -3754,63 +3754,70 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
37543754
return 0;
37553755
}
37563756

3757-
if (0 && generator_exp->v.GeneratorExp.elt->kind != Name_kind) {
3758-
// _PyObject_Dump(_PyCompile_Filename(c));
3759-
// fprintf(stderr, "location: %d", LOC(func).lineno);
3760-
return 0;
3761-
}
3762-
37633757
location loc = LOC(func);
37643758

37653759
int optimized = 0;
37663760
NEW_JUMP_TARGET_LABEL(c, skip_optimization);
3761+
3762+
int const_oparg = -1;
3763+
PyObject *initial_res;
3764+
int continue_jump_oparg = -1;
37673765
if (_PyUnicode_EqualToASCIIString(func->v.Name.id, "all")) {
3766+
const_oparg = CONSTANT_BUILTIN_ALL;
3767+
initial_res = Py_True;
3768+
continue_jump_oparg = POP_JUMP_IF_TRUE;
3769+
}
3770+
else if (_PyUnicode_EqualToASCIIString(func->v.Name.id, "any")) {
3771+
const_oparg = CONSTANT_BUILTIN_ANY;
3772+
initial_res = Py_False;
3773+
continue_jump_oparg = POP_JUMP_IF_FALSE;
3774+
}
3775+
else if (_PyUnicode_EqualToASCIIString(func->v.Name.id, "tuple")) {
3776+
const_oparg = CONSTANT_BUILTIN_TUPLE;
3777+
}
3778+
if (const_oparg != -1) {
37683779
RETURN_IF_ERROR(codegen_nameop(c, loc, func->v.Name.id, Load));
3769-
ADDOP_I(c, loc, LOAD_COMMON_CONSTANT, CONSTANT_BUILTIN_ALL);
3780+
ADDOP_I(c, loc, LOAD_COMMON_CONSTANT, const_oparg);
37703781
ADDOP_COMPARE(c, loc, Is);
37713782
ADDOP_JUMP(c, loc, POP_JUMP_IF_FALSE, skip_optimization);
37723783

3784+
if (const_oparg == CONSTANT_BUILTIN_TUPLE) {
3785+
ADDOP_I(c, loc, BUILD_LIST, 0);
3786+
}
3787+
else {
3788+
ADDOP_LOAD_CONST(c, loc, initial_res);
3789+
}
3790+
VISIT(c, expr, generator_exp);
37733791

3774-
_PyCompile_InlinedComprehensionState inline_state = {NULL, NULL, NULL, NO_LABEL};
3775-
3776-
PySTEntryObject *entry = _PySymtable_Lookup(SYMTABLE(c), (void *)generator_exp);
3777-
3778-
comprehension_ty gen = (comprehension_ty)asdl_seq_GET(
3779-
generator_exp->v.GeneratorExp.generators, 0);
3780-
3781-
VISIT(c, expr, gen->iter);
3782-
ADDOP(c, LOC(gen->iter), GET_ITER);
3783-
3784-
RETURN_IF_ERROR(push_inlined_comprehension_state(c, loc, entry, &inline_state));
37853792
NEW_JUMP_TARGET_LABEL(c, loop);
3786-
NEW_JUMP_TARGET_LABEL(c, proceed);
3787-
NEW_JUMP_TARGET_LABEL(c, finish);
37883793
NEW_JUMP_TARGET_LABEL(c, cleanup);
37893794

3790-
ADDOP_LOAD_CONST(c, loc, Py_True); // result
3791-
ADDOP_I(c, loc, SWAP, 2);
3792-
37933795
USE_LABEL(c, loop);
37943796
ADDOP_JUMP(c, loc, FOR_ITER, cleanup);
3795-
VISIT(c, expr, gen->target);
3796-
VISIT(c, expr, generator_exp->v.GeneratorExp.elt);
3797-
ADDOP(c, loc, TO_BOOL);
3798-
ADDOP_I(c, loc, COPY, 1);
3799-
ADDOP_JUMP(c, loc, POP_JUMP_IF_TRUE, proceed);
3800-
3801-
ADDOP_I(c, loc, SWAP, 3);
3802-
ADDOP(c, loc, POP_TOP);
3803-
ADDOP_JUMP(c, loc, JUMP, finish);
3797+
if (const_oparg == CONSTANT_BUILTIN_TUPLE) {
3798+
ADDOP_I(c, loc, LIST_APPEND, 2);
3799+
ADDOP_JUMP(c, loc, JUMP, loop);
3800+
}
3801+
else {
3802+
ADDOP(c, loc, TO_BOOL);
3803+
ADDOP_JUMP(c, loc, continue_jump_oparg, loop);
3804+
}
38043805

3805-
USE_LABEL(c, proceed);
3806-
ADDOP(c, loc, POP_TOP);
3807-
ADDOP_JUMP(c, loc, JUMP, loop);
3806+
ADDOP(c, NO_LOCATION, POP_ITER);
3807+
if (const_oparg == CONSTANT_BUILTIN_TUPLE) {
3808+
ADDOP_I(c, loc, LOAD_COMMON_CONSTANT, CONSTANT_BUILTIN_TUPLE);
3809+
ADDOP_I(c, loc, SWAP, 2);
3810+
ADDOP_I(c, loc, CALL, 1);
3811+
}
3812+
else {
3813+
ADDOP(c, loc, POP_TOP);
3814+
ADDOP_LOAD_CONST(c, loc, initial_res == Py_True ? Py_False : Py_True);
3815+
}
3816+
ADDOP_JUMP(c, loc, JUMP, end);
38083817

38093818
USE_LABEL(c, cleanup);
38103819
ADDOP(c, NO_LOCATION, END_FOR);
3811-
USE_LABEL(c, finish);
38123820
ADDOP(c, NO_LOCATION, POP_ITER);
3813-
RETURN_IF_ERROR(pop_inlined_comprehension_state(c, loc, &inline_state));
38143821

38153822
optimized = 1;
38163823
ADDOP_JUMP(c, loc, JUMP, end);
@@ -3925,21 +3932,18 @@ codegen_call(compiler *c, expr_ty e)
39253932
if (ret == 1) {
39263933
return SUCCESS;
39273934
}
3928-
NEW_JUMP_TARGET_LABEL(c, end);
3929-
ret = maybe_optimize_function_call(c, e, end);
3930-
if (ret < 0) {
3931-
return ERROR;
3932-
}
3935+
NEW_JUMP_TARGET_LABEL(c, skip_normal_call);
3936+
RETURN_IF_ERROR(maybe_optimize_function_call(c, e, skip_normal_call));
39333937
RETURN_IF_ERROR(check_caller(c, e->v.Call.func));
39343938
VISIT(c, expr, e->v.Call.func);
39353939
location loc = LOC(e->v.Call.func);
39363940
ADDOP(c, loc, PUSH_NULL);
39373941
loc = LOC(e);
3938-
RETURN_IF_ERROR(codegen_call_helper(c, loc, 0,
3939-
e->v.Call.args,
3940-
e->v.Call.keywords));
3941-
USE_LABEL(c, end);
3942-
return SUCCESS;
3942+
ret = codegen_call_helper(c, loc, 0,
3943+
e->v.Call.args,
3944+
e->v.Call.keywords);
3945+
USE_LABEL(c, skip_normal_call);
3946+
return ret;
39433947
}
39443948

39453949
static int

0 commit comments

Comments
 (0)