@@ -1436,28 +1436,31 @@ public abstract static class MinNode extends MinMaxNode {
1436
1436
public abstract static class NextNode extends PythonBinaryBuiltinNode {
1437
1437
@ Specialization (guards = "isNoValue(defaultObject)" )
1438
1438
public Object next (VirtualFrame frame , Object iterator , PNone defaultObject ,
1439
- @ Cached ("create()" ) GetNextNode next ,
1440
- @ Cached ("create()" ) IsBuiltinClassProfile errorProfile ) {
1441
- try {
1442
- return next .execute (frame , iterator );
1443
- } catch (PException e ) {
1444
- e .expectAttributeError (errorProfile );
1445
- throw raise (TypeError , e .setCatchingFrameAndGetEscapedException (frame ), ErrorMessages .OBJ_ISNT_ITERATOR , iterator );
1446
- }
1439
+ @ Cached ("createNextCall()" ) LookupAndCallUnaryNode callNode ) {
1440
+ return callNode .executeObject (frame , iterator );
1447
1441
}
1448
1442
1449
1443
@ Specialization (guards = "!isNoValue(defaultObject)" )
1450
1444
public Object next (VirtualFrame frame , Object iterator , Object defaultObject ,
1451
- @ Cached ("create ()" ) NextNode next ,
1445
+ @ Cached ("createNextCall ()" ) LookupAndCallUnaryNode callNode ,
1452
1446
@ Cached ("create()" ) IsBuiltinClassProfile errorProfile ) {
1453
1447
try {
1454
- return next . execute (frame , iterator , PNone . NO_VALUE );
1448
+ return callNode . executeObject (frame , iterator );
1455
1449
} catch (PException e ) {
1456
1450
e .expectStopIteration (errorProfile );
1457
1451
return defaultObject ;
1458
1452
}
1459
1453
}
1460
1454
1455
+ protected LookupAndCallUnaryNode createNextCall () {
1456
+ return LookupAndCallUnaryNode .create (__NEXT__ , () -> new LookupAndCallUnaryNode .NoAttributeHandler () {
1457
+ @ Override
1458
+ public Object execute (Object iterator ) {
1459
+ throw raise (TypeError , ErrorMessages .OBJ_ISNT_ITERATOR , iterator );
1460
+ }
1461
+ });
1462
+ }
1463
+
1461
1464
protected static NextNode create () {
1462
1465
return BuiltinFunctionsFactory .NextNodeFactory .create ();
1463
1466
}
0 commit comments