@@ -2437,42 +2437,32 @@ dummy_func(
2437
2437
DEOPT_IF (Py_TYPE (r ) != & PyRangeIter_Type , FOR_ITER );
2438
2438
}
2439
2439
2440
- // NOTE: next may be NULL (TODO: Can we show this in the type?)
2441
- op (_ITER_NEXT_RANGE , (iter -- iter , next )) {
2440
+ op (_ITER_JUMP_RANGE , (iter -- iter )) {
2442
2441
_PyRangeIterObject * r = (_PyRangeIterObject * )iter ;
2443
2442
assert (Py_TYPE (r ) == & PyRangeIter_Type );
2444
2443
STAT_INC (FOR_ITER , hit );
2445
2444
if (r -> len <= 0 ) {
2446
- next = NULL ;
2447
- }
2448
- else {
2449
- long value = r -> start ;
2450
- r -> start = value + r -> step ;
2451
- r -> len -- ;
2452
- next = PyLong_FromLong (value );
2453
- ERROR_IF (next == NULL , error );
2454
- }
2455
- }
2456
-
2457
- op (_FOR_ITER_END , (iter , next -- iter , next )) {
2458
- if (next == NULL ) {
2459
- // You might expect STACK_SHRINK(2) here.
2460
- // But we're taking a dangerous shortcut here:
2461
- // This op is always the second half of a
2462
- // (_ITER_NEXT_RANGE, _FOR_ITER_END) pair,
2463
- // and and the code generator hasn't increased
2464
- // the stack pointer to account for 'next' yet.
2465
2445
STACK_SHRINK (1 );
2466
- Py_DECREF (iter );
2467
2446
SKIP_OVER (INLINE_CACHE_ENTRIES_FOR_ITER );
2468
- // Jump over END_FOR instruction.
2447
+ /* Jump forward oparg, then skip following END_FOR instruction */
2469
2448
JUMPBY (oparg + 1 );
2470
2449
DISPATCH ();
2471
2450
}
2472
2451
}
2473
2452
2453
+ op (_ITER_NEXT_RANGE , (iter -- iter , next )) {
2454
+ _PyRangeIterObject * r = (_PyRangeIterObject * )iter ;
2455
+ assert (Py_TYPE (r ) == & PyRangeIter_Type );
2456
+ assert (r -> len > 0 );
2457
+ long value = r -> start ;
2458
+ r -> start = value + r -> step ;
2459
+ r -> len -- ;
2460
+ next = PyLong_FromLong (value );
2461
+ ERROR_IF (next == NULL , error );
2462
+ }
2463
+
2474
2464
macro (FOR_ITER_RANGE ) =
2475
- unused /1 + _ITER_CHECK_RANGE + _ITER_NEXT_RANGE + _FOR_ITER_END ;
2465
+ unused /1 + _ITER_CHECK_RANGE + _ITER_JUMP_RANGE + _ITER_NEXT_RANGE ;
2476
2466
2477
2467
inst (FOR_ITER_GEN , (unused /1 , iter -- iter , unused )) {
2478
2468
DEOPT_IF (tstate -> interp -> eval_frame , FOR_ITER );
0 commit comments