@@ -361,14 +361,14 @@ void appendOperation(PDeque self, Object item) {
361
361
@ GenerateNodeFactory
362
362
public abstract static class DequeIndexNode extends PythonQuaternaryBuiltinNode {
363
363
364
+ @ Child private PythonObjectLibrary itemLib ;
365
+
364
366
@ Specialization (guards = {"isNoValue(start)" , "isNoValue(stop)" })
365
- @ TruffleBoundary
366
367
int doWithoutSlice (PDeque self , Object value , @ SuppressWarnings ("unused" ) PNone start , @ SuppressWarnings ("unused" ) PNone stop ) {
367
368
return doWithIntSlice (self , value , 0 , self .getSize ());
368
369
}
369
370
370
371
@ Specialization
371
- @ TruffleBoundary
372
372
int doWithIntSlice (PDeque self , Object value , int start , int stop ) {
373
373
int size = self .getSize ();
374
374
int normStart = normalize (start , size );
@@ -380,24 +380,23 @@ int doWithIntSlice(PDeque self, Object value, int start, int stop) {
380
380
if (normStart > normStop ) {
381
381
normStart = normStop ;
382
382
}
383
- PythonObjectLibrary valueLib = PythonObjectLibrary .getFactory ().getUncached (value );
384
- Iterator <Object > iterator = self .data .iterator ();
385
- for (int idx = 0 ; iterator .hasNext () && idx < normStop ; idx ++) {
383
+ Iterator <Object > iterator = self .iterator ();
384
+ for (int idx = 0 ; idx < normStop ; idx ++) {
386
385
/*
387
386
* Note: A 'ConcurrentModificationException' should not be possible because we
388
387
* manually check for modifications during iteration.
389
388
*/
390
- Object item = iterator . next ();
389
+ Object item = next (iterator );
391
390
if (normStart <= idx ) {
392
- if (PythonObjectLibrary . getUncached ().equals (item , value , valueLib )) {
391
+ if (ensureItemLib ().equals (item , value , ensureItemLib () )) {
393
392
return idx ;
394
393
}
395
394
if (startState != self .getState ()) {
396
- throw PRaiseNode . raiseUncached ( this , RuntimeError , ErrorMessages .DEQUE_MUTATED_DURING_ITERATION );
395
+ throw raise ( RuntimeError , ErrorMessages .DEQUE_MUTATED_DURING_ITERATION );
397
396
}
398
397
}
399
398
}
400
- throw PRaiseNode . raiseUncached ( this , ValueError , "%s is not in deque" , value );
399
+ throw raise ( ValueError , "%s is not in deque" , value );
401
400
}
402
401
403
402
@ Specialization
@@ -420,13 +419,26 @@ int doGeneric(VirtualFrame frame, PDeque self, Object value, Object start, Objec
420
419
return doWithIntSlice (self , value , istart , istop );
421
420
}
422
421
422
+ private PythonObjectLibrary ensureItemLib () {
423
+ if (itemLib == null ) {
424
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
425
+ itemLib = insert (PythonObjectLibrary .getFactory ().createDispatched (3 ));
426
+ }
427
+ return itemLib ;
428
+ }
429
+
423
430
private static int normalize (int i , int size ) {
424
431
int res = i ;
425
432
if (res < 0 ) {
426
433
res += size ;
427
434
}
428
435
return Math .max (res , 0 );
429
436
}
437
+
438
+ @ TruffleBoundary
439
+ private static Object next (Iterator <?> it ) {
440
+ return it .next ();
441
+ }
430
442
}
431
443
432
444
// deque.pop()
0 commit comments