Skip to content

Commit 4a01125

Browse files
committed
add specialization for PList iterators in NextNode
1 parent 0249658 commit 4a01125

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorBuiltins.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@
3636
import com.oracle.graal.python.builtins.CoreFunctions;
3737
import com.oracle.graal.python.builtins.PythonBuiltins;
3838
import com.oracle.graal.python.builtins.objects.iterator.PRangeIterator.PRangeReverseIterator;
39+
import com.oracle.graal.python.builtins.objects.list.PList;
3940
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
4041
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
4142
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
4243
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4344
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
4445
import com.oracle.graal.python.runtime.exception.PException;
4546
import com.oracle.graal.python.runtime.sequence.PSequence;
47+
import com.oracle.graal.python.runtime.sequence.SequenceUtil.NormalizeIndexNode;
48+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
4649
import com.oracle.truffle.api.dsl.Cached;
4750
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
4851
import com.oracle.truffle.api.dsl.NodeFactory;
@@ -146,6 +149,20 @@ public Object next(PBaseSetIterator self) {
146149
throw raise(StopIteration);
147150
}
148151

152+
@Specialization(guards = "self.isPList()")
153+
public Object nextList(PSequenceIterator self,
154+
@Cached("createClassProfile()") ValueProfile storageProfile,
155+
@Cached("create()") NormalizeIndexNode normalize) {
156+
SequenceStorage storage = storageProfile.profile(((PList) self.getPSequence()).getSequenceStorage());
157+
int length = storage.length();
158+
if (!self.stopIterationReached && self.index < length) {
159+
int index = normalize.execute(self.index++, length, "list index out of range");
160+
return storage.getItemNormalized(index);
161+
}
162+
self.stopIterationReached = true;
163+
throw raise(StopIteration);
164+
}
165+
149166
@Specialization(guards = "self.isPSequence()")
150167
public Object next(PSequenceIterator self,
151168
@Cached("createClassProfile()") ValueProfile sequenceProfile) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PSequenceIterator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
package com.oracle.graal.python.builtins.objects.iterator;
2727

28+
import com.oracle.graal.python.builtins.objects.list.PList;
2829
import com.oracle.graal.python.builtins.objects.type.PythonClass;
2930
import com.oracle.graal.python.runtime.sequence.PSequence;
3031

@@ -49,4 +50,8 @@ public PSequence getPSequence() {
4950
public boolean isPSequence() {
5051
return sequence instanceof PSequence;
5152
}
53+
54+
public boolean isPList() {
55+
return sequence instanceof PList;
56+
}
5257
}

0 commit comments

Comments
 (0)