bpo-32372: Move debug optimization to the AST level. (#4925) · python/cpython@3dfbaf5 (original) (raw)
`@@ -75,7 +75,7 @@ unary_not(PyObject *v)
`
75
75
`}
`
76
76
``
77
77
`static int
`
78
``
`-
fold_unaryop(expr_ty node, PyArena *arena)
`
``
78
`+
fold_unaryop(expr_ty node, PyArena *arena, int optimize)
`
79
79
`{
`
80
80
`expr_ty arg = node->v.UnaryOp.operand;
`
81
81
``
`@@ -252,7 +252,7 @@ safe_mod(PyObject *v, PyObject *w)
`
252
252
`}
`
253
253
``
254
254
`static int
`
255
``
`-
fold_binop(expr_ty node, PyArena *arena)
`
``
255
`+
fold_binop(expr_ty node, PyArena *arena, int optimize)
`
256
256
`{
`
257
257
`expr_ty lhs, rhs;
`
258
258
`lhs = node->v.BinOp.left;
`
`@@ -334,7 +334,7 @@ make_const_tuple(asdl_seq *elts)
`
334
334
`}
`
335
335
``
336
336
`static int
`
337
``
`-
fold_tuple(expr_ty node, PyArena *arena)
`
``
337
`+
fold_tuple(expr_ty node, PyArena *arena, int optimize)
`
338
338
`{
`
339
339
`PyObject *newval;
`
340
340
``
`@@ -346,7 +346,7 @@ fold_tuple(expr_ty node, PyArena *arena)
`
346
346
`}
`
347
347
``
348
348
`static int
`
349
``
`-
fold_subscr(expr_ty node, PyArena *arena)
`
``
349
`+
fold_subscr(expr_ty node, PyArena *arena, int optimize)
`
350
350
`{
`
351
351
`PyObject *newval;
`
352
352
`expr_ty arg, idx;
`
`@@ -374,7 +374,7 @@ fold_subscr(expr_ty node, PyArena *arena)
`
374
374
` in "for" loop and comprehensions.
`
375
375
`*/
`
376
376
`static int
`
377
``
`-
fold_iter(expr_ty arg, PyArena *arena)
`
``
377
`+
fold_iter(expr_ty arg, PyArena *arena, int optimize)
`
378
378
`{
`
379
379
`PyObject *newval;
`
380
380
`if (arg->kind == List_kind) {
`
`@@ -393,7 +393,7 @@ fold_iter(expr_ty arg, PyArena *arena)
`
393
393
`}
`
394
394
``
395
395
`static int
`
396
``
`-
fold_compare(expr_ty node, PyArena *arena)
`
``
396
`+
fold_compare(expr_ty node, PyArena *arena, int optimize)
`
397
397
`{
`
398
398
`asdl_int_seq *ops;
`
399
399
`asdl_seq *args;
`
`@@ -407,37 +407,37 @@ fold_compare(expr_ty node, PyArena *arena)
`
407
407
`i = asdl_seq_LEN(ops) - 1;
`
408
408
`int op = asdl_seq_GET(ops, i);
`
409
409
`if (op == In || op == NotIn) {
`
410
``
`-
if (!fold_iter((expr_ty)asdl_seq_GET(args, i), arena)) {
`
``
410
`+
if (!fold_iter((expr_ty)asdl_seq_GET(args, i), arena, optimize)) {
`
411
411
`return 0;
`
412
412
` }
`
413
413
` }
`
414
414
`return 1;
`
415
415
`}
`
416
416
``
417
``
`-
static int astfold_mod(mod_ty node_, PyArena* ctx_);
`
418
``
`-
static int astfold_stmt(stmt_ty node_, PyArena* ctx_);
`
419
``
`-
static int astfold_expr(expr_ty node_, PyArena* ctx_);
`
420
``
`-
static int astfold_arguments(arguments_ty node_, PyArena* ctx_);
`
421
``
`-
static int astfold_comprehension(comprehension_ty node_, PyArena* ctx_);
`
422
``
`-
static int astfold_keyword(keyword_ty node_, PyArena* ctx_);
`
423
``
`-
static int astfold_slice(slice_ty node_, PyArena* ctx_);
`
424
``
`-
static int astfold_arg(arg_ty node_, PyArena* ctx_);
`
425
``
`-
static int astfold_withitem(withitem_ty node_, PyArena* ctx_);
`
426
``
`-
static int astfold_excepthandler(excepthandler_ty node_, PyArena* ctx_);
`
``
417
`+
static int astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_);
`
``
418
`+
static int astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_);
`
``
419
`+
static int astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_);
`
``
420
`+
static int astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_);
`
``
421
`+
static int astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_);
`
``
422
`+
static int astfold_keyword(keyword_ty node_, PyArena *ctx_, int optimize_);
`
``
423
`+
static int astfold_slice(slice_ty node_, PyArena *ctx_, int optimize_);
`
``
424
`+
static int astfold_arg(arg_ty node_, PyArena *ctx_, int optimize_);
`
``
425
`+
static int astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_);
`
``
426
`+
static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_);
`
427
427
`#define CALL(FUNC, TYPE, ARG) \
`
428
``
`-
if (!FUNC((ARG), ctx_)) \
`
``
428
`+
if (!FUNC((ARG), ctx_, optimize_)) \
`
429
429
` return 0;
`
430
430
``
431
431
`#define CALL_OPT(FUNC, TYPE, ARG) \
`
432
``
`-
if ((ARG) != NULL && !FUNC((ARG), ctx_)) \
`
``
432
`+
if ((ARG) != NULL && !FUNC((ARG), ctx_, optimize_)) \
`
433
433
` return 0;
`
434
434
``
435
435
`#define CALL_SEQ(FUNC, TYPE, ARG) { \
`
436
436
` int i; \
`
437
437
` asdl_seq seq = (ARG); / avoid variable capture */ \
`
438
438
`for (i = 0; i < asdl_seq_LEN(seq); i++) { \
`
439
439
` TYPE elt = (TYPE)asdl_seq_GET(seq, i); \
`
440
``
`-
if (elt != NULL && !FUNC(elt, ctx_)) \
`
``
440
`+
if (elt != NULL && !FUNC(elt, ctx_, optimize_)) \
`
441
441
` return 0; \
`
442
442
` } \
`
443
443
`}
`
`@@ -447,13 +447,13 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena* ctx_);
`
447
447
` asdl_int_seq seq = (ARG); / avoid variable capture */ \
`
448
448
`for (i = 0; i < asdl_seq_LEN(seq); i++) { \
`
449
449
` TYPE elt = (TYPE)asdl_seq_GET(seq, i); \
`
450
``
`-
if (!FUNC(elt, ctx_)) \
`
``
450
`+
if (!FUNC(elt, ctx_, optimize_)) \
`
451
451
` return 0; \
`
452
452
` } \
`
453
453
`}
`
454
454
``
455
455
`static int
`
456
``
`-
astfold_mod(mod_ty node_, PyArena* ctx_)
`
``
456
`+
astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_)
`
457
457
`{
`
458
458
`switch (node_->kind) {
`
459
459
`case Module_kind:
`
`@@ -475,7 +475,7 @@ astfold_mod(mod_ty node_, PyArena* ctx_)
`
475
475
`}
`
476
476
``
477
477
`static int
`
478
``
`-
astfold_expr(expr_ty node_, PyArena* ctx_)
`
``
478
`+
astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_)
`
479
479
`{
`
480
480
`switch (node_->kind) {
`
481
481
`case BoolOp_kind:
`
`@@ -567,14 +567,19 @@ astfold_expr(expr_ty node_, PyArena* ctx_)
`
567
567
`CALL_SEQ(astfold_expr, expr_ty, node_->v.Tuple.elts);
`
568
568
`CALL(fold_tuple, expr_ty, node_);
`
569
569
`break;
`
``
570
`+
case Name_kind:
`
``
571
`+
if (PyUnicode_EqualToASCIIString(node->v.Name.id, "debug")) {
`
``
572
`+
return make_const(node_, PyBool_FromLong(!optimize_), ctx_);
`
``
573
`+
}
`
``
574
`+
break;
`
570
575
`default:
`
571
576
`break;
`
572
577
` }
`
573
578
`return 1;
`
574
579
`}
`
575
580
``
576
581
`static int
`
577
``
`-
astfold_slice(slice_ty node_, PyArena* ctx_)
`
``
582
`+
astfold_slice(slice_ty node_, PyArena *ctx_, int optimize_)
`
578
583
`{
`
579
584
`switch (node_->kind) {
`
580
585
`case Slice_kind:
`
`@@ -595,14 +600,14 @@ astfold_slice(slice_ty node_, PyArena* ctx_)
`
595
600
`}
`
596
601
``
597
602
`static int
`
598
``
`-
astfold_keyword(keyword_ty node_, PyArena* ctx_)
`
``
603
`+
astfold_keyword(keyword_ty node_, PyArena *ctx_, int optimize_)
`
599
604
`{
`
600
605
`CALL(astfold_expr, expr_ty, node_->value);
`
601
606
`return 1;
`
602
607
`}
`
603
608
``
604
609
`static int
`
605
``
`-
astfold_comprehension(comprehension_ty node_, PyArena* ctx_)
`
``
610
`+
astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_)
`
606
611
`{
`
607
612
`CALL(astfold_expr, expr_ty, node_->target);
`
608
613
`CALL(astfold_expr, expr_ty, node_->iter);
`
`@@ -613,7 +618,7 @@ astfold_comprehension(comprehension_ty node_, PyArena* ctx_)
`
613
618
`}
`
614
619
``
615
620
`static int
`
616
``
`-
astfold_arguments(arguments_ty node_, PyArena* ctx_)
`
``
621
`+
astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_)
`
617
622
`{
`
618
623
`CALL_SEQ(astfold_arg, arg_ty, node_->args);
`
619
624
`CALL_OPT(astfold_arg, arg_ty, node_->vararg);
`
`@@ -625,14 +630,14 @@ astfold_arguments(arguments_ty node_, PyArena* ctx_)
`
625
630
`}
`
626
631
``
627
632
`static int
`
628
``
`-
astfold_arg(arg_ty node_, PyArena* ctx_)
`
``
633
`+
astfold_arg(arg_ty node_, PyArena *ctx_, int optimize_)
`
629
634
`{
`
630
635
`CALL_OPT(astfold_expr, expr_ty, node_->annotation);
`
631
636
`return 1;
`
632
637
`}
`
633
638
``
634
639
`static int
`
635
``
`-
astfold_stmt(stmt_ty node_, PyArena* ctx_)
`
``
640
`+
astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_)
`
636
641
`{
`
637
642
`switch (node_->kind) {
`
638
643
`case FunctionDef_kind:
`
`@@ -728,7 +733,7 @@ astfold_stmt(stmt_ty node_, PyArena* ctx_)
`
728
733
`}
`
729
734
``
730
735
`static int
`
731
``
`-
astfold_excepthandler(excepthandler_ty node_, PyArena* ctx_)
`
``
736
`+
astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_)
`
732
737
`{
`
733
738
`switch (node_->kind) {
`
734
739
`case ExceptHandler_kind:
`
`@@ -742,7 +747,7 @@ astfold_excepthandler(excepthandler_ty node_, PyArena* ctx_)
`
742
747
`}
`
743
748
``
744
749
`static int
`
745
``
`-
astfold_withitem(withitem_ty node_, PyArena* ctx_)
`
``
750
`+
astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_)
`
746
751
`{
`
747
752
`CALL(astfold_expr, expr_ty, node_->context_expr);
`
748
753
`CALL_OPT(astfold_expr, expr_ty, node_->optional_vars);
`
`@@ -755,9 +760,9 @@ astfold_withitem(withitem_ty node_, PyArena* ctx_)
`
755
760
`#undef CALL_INT_SEQ
`
756
761
``
757
762
`int
`
758
``
`-
_PyAST_Optimize(mod_ty mod, PyArena *arena)
`
``
763
`+
_PyAST_Optimize(mod_ty mod, PyArena *arena, int optimize)
`
759
764
`{
`
760
``
`-
int ret = astfold_mod(mod, arena);
`
``
765
`+
int ret = astfold_mod(mod, arena, optimize);
`
761
766
`assert(ret || PyErr_Occurred());
`
762
767
`return ret;
`
763
768
`}
`