Skip to content

Commit b14b2ec

Browse files
committed
increase test_iter coverage
1 parent 28b627b commit b14b2ec

File tree

6 files changed

+57
-18
lines changed

6 files changed

+57
-18
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iter.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
1+
*graalpython.lib-python.3.test.test_iter.TestCase.test_3720
12
*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_filter
23
*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_list
34
*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_map
45
*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_max_min
56
*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_tuple
67
*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_zip
78
*graalpython.lib-python.3.test.test_iter.TestCase.test_countOf
9+
*graalpython.lib-python.3.test.test_iter.TestCase.test_error_iter
810
*graalpython.lib-python.3.test.test_iter.TestCase.test_exception_function
911
*graalpython.lib-python.3.test.test_iter.TestCase.test_exception_sequence
1012
*graalpython.lib-python.3.test.test_iter.TestCase.test_extending_list_with_iterator_does_not_segfault
1113
*graalpython.lib-python.3.test.test_iter.TestCase.test_in_and_not_in
1214
*graalpython.lib-python.3.test.test_iter.TestCase.test_indexOf
15+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_basic
16+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_big_range
1317
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_callable
1418
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_class_for
1519
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_class_iter
20+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_empty
1621
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_file
22+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_for_loop
1723
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_function
1824
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_function_stop
1925
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_idempotency
2026
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_independence
27+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_neg_setstate
2128
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_overflow
29+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_range
30+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_string
31+
*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_tuple
32+
*graalpython.lib-python.3.test.test_iter.TestCase.test_mutating_seq_class_exhausted_iter
2233
*graalpython.lib-python.3.test.test_iter.TestCase.test_nested_comprehensions_for
2334
*graalpython.lib-python.3.test.test_iter.TestCase.test_nested_comprehensions_iter
2435
*graalpython.lib-python.3.test.test_iter.TestCase.test_new_style_iter_class
@@ -28,9 +39,11 @@
2839
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_enumerate
2940
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_list
3041
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_range
42+
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_sequence
3143
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_string
3244
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_tuple
3345
*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_yield
3446
*graalpython.lib-python.3.test.test_iter.TestCase.test_stop_sequence
3547
*graalpython.lib-python.3.test.test_iter.TestCase.test_unicode_join_endcase
48+
*graalpython.lib-python.3.test.test_iter.TestCase.test_unpack_iter
3649
*graalpython.lib-python.3.test.test_iter.TestCase.test_writelines

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

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,12 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
9191
@GenerateNodeFactory
9292
public abstract static class NextNode extends PythonUnaryBuiltinNode {
9393

94-
@Specialization
94+
@Specialization(guards = "self.isExhausted()")
95+
public Object exhausted(@SuppressWarnings("unused") PBuiltinIterator self) {
96+
throw raise(StopIteration);
97+
}
98+
99+
@Specialization(guards = "!self.isExhausted()")
95100
Object next(VirtualFrame frame, PArrayIterator self,
96101
@Cached("createClassProfile()") ValueProfile itemTypeProfile,
97102
@Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getItemNode,
@@ -102,45 +107,47 @@ Object next(VirtualFrame frame, PArrayIterator self,
102107
// types
103108
return itemTypeProfile.profile(getItemNode.execute(frame, sequenceStorage, self.index++));
104109
}
110+
self.setExhausted();
105111
throw raise(StopIteration);
106112
}
107113

108-
@Specialization
114+
@Specialization(guards = "!self.isExhausted()")
109115
int next(PIntegerSequenceIterator self) {
110-
if (!self.isExhausted() && self.index < self.sequence.length()) {
116+
if (self.index < self.sequence.length()) {
111117
return self.sequence.getIntItemNormalized(self.index++);
112118
}
113119
self.setExhausted();
114120
throw raise(StopIteration);
115121
}
116122

117-
@Specialization
123+
@Specialization(guards = "!self.isExhausted()")
118124
int next(PRangeIterator self) {
119125
if (self.hasNext()) {
120126
return self.next();
121127
}
128+
self.setExhausted();
122129
throw raise(StopIteration);
123130
}
124131

125-
@Specialization
132+
@Specialization(guards = "!self.isExhausted()")
126133
double next(PDoubleSequenceIterator self) {
127-
if (!self.isExhausted() && self.index < self.sequence.length()) {
134+
if (self.index < self.sequence.length()) {
128135
return self.sequence.getDoubleItemNormalized(self.index++);
129136
}
130137
self.setExhausted();
131138
throw raise(StopIteration);
132139
}
133140

134-
@Specialization
141+
@Specialization(guards = "!self.isExhausted()")
135142
long next(PLongSequenceIterator self) {
136-
if (!self.isExhausted() && self.index < self.sequence.length()) {
143+
if (self.index < self.sequence.length()) {
137144
return self.sequence.getLongItemNormalized(self.index++);
138145
}
139146
self.setExhausted();
140147
throw raise(StopIteration);
141148
}
142149

143-
@Specialization
150+
@Specialization(guards = "!self.isExhausted()")
144151
public Object next(PBaseSetIterator self,
145152
@Cached("createBinaryProfile()") ConditionProfile sizeChanged,
146153
@CachedLibrary(limit = "1") HashingStorageLibrary storageLibrary) {
@@ -151,31 +158,33 @@ public Object next(PBaseSetIterator self,
151158
}
152159
return iterator.next();
153160
}
161+
self.setExhausted();
154162
throw raise(StopIteration);
155163
}
156164

157-
@Specialization(guards = {"self.isPSequence()"})
165+
@Specialization(guards = {"self.isPSequence()", "!self.isExhausted()"})
158166
public Object next(VirtualFrame frame, PSequenceIterator self,
159167
@Cached SequenceNodes.GetSequenceStorageNode getStorage,
160168
@Cached SequenceStorageNodes.LenNode lenNode,
161169
@Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getItemNode) {
162170
SequenceStorage s = getStorage.execute(self.getPSequence());
163-
if (!self.isExhausted() && self.index < lenNode.execute(s)) {
171+
if (self.index < lenNode.execute(s)) {
164172
return getItemNode.execute(frame, s, self.index++);
165173
}
166174
self.setExhausted();
167175
throw raise(StopIteration);
168176
}
169177

170-
@Specialization
178+
@Specialization(guards = "!self.isExhausted()")
171179
public Object next(PStringIterator self) {
172180
if (self.index < self.value.length()) {
173181
return Character.toString(self.value.charAt(self.index++));
174182
}
183+
self.setExhausted();
175184
throw raise(StopIteration);
176185
}
177186

178-
@Specialization
187+
@Specialization(guards = "!self.isExhausted()")
179188
public Object next(PDictView.PBaseDictIterator<?> self,
180189
@Cached ConditionProfile sizeChanged,
181190
@CachedLibrary(limit = "3") HashingStorageLibrary storageLibrary,
@@ -186,6 +195,7 @@ public Object next(PDictView.PBaseDictIterator<?> self,
186195
}
187196
return self.next(factory());
188197
}
198+
self.setExhausted();
189199
throw raise(PythonErrorType.StopIteration);
190200
}
191201

@@ -197,6 +207,7 @@ public Object next(VirtualFrame frame, PSequenceIterator self,
197207
return callGetItem.executeObject(frame, self.getObject(), self.index++);
198208
} catch (PException e) {
199209
e.expectIndexError(profile);
210+
self.setExhausted();
200211
throw raise(StopIteration);
201212
}
202213
}
@@ -329,7 +340,7 @@ public Object reduceNonSeq(VirtualFrame frame, PSequenceIterator self,
329340
@CachedContext(PythonLanguage.class) PythonContext context,
330341
@Cached("create(__REDUCE__)") LookupAndCallUnaryNode callUnaryNode,
331342
@Cached.Shared("pol") @CachedLibrary(limit = "1") PythonObjectLibrary pol) {
332-
Object reduce = pol.lookupAttribute(self.getPSequence(), __REDUCE__);
343+
Object reduce = pol.lookupAttribute(self.getObject(), __REDUCE__);
333344
Object content = callUnaryNode.executeObject(frame, reduce);
334345
return reduceInternal(content, self.index, context, pol);
335346
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/control/ForNode.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,13 @@ protected boolean doDoubleIterator(VirtualFrame frame, PDoubleSequenceIterator i
141141
@Specialization
142142
protected boolean doIterator(VirtualFrame frame, Object object,
143143
@Cached("create()") GetNextNode next,
144-
@Cached("create()") IsBuiltinClassProfile errorProfile) {
144+
@Cached("create()") IsBuiltinClassProfile errorProfile,
145+
@Cached PRaiseNode raise) {
145146
try {
146147
((WriteNode) target).doWrite(frame, next.execute(frame, object));
147148
return true;
148149
} catch (PException e) {
149-
e.expectStopIteration(errorProfile);
150+
e.expectStopIteration(errorProfile, raise, object);
150151
return false;
151152
}
152153
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/control/GetIteratorExpressionNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ static Object doGeneric(VirtualFrame frame, Object value,
155155
} else {
156156
throw nonIterator(raiseNode, iterObj);
157157
}
158-
} else {
158+
} else if (attrObj != PNone.NONE) {
159159
Object getItemAttrObj = lookupGetitemAttrMroNode.execute(clazz, SpecialMethodNames.__GETITEM__);
160160
if (getItemAttrObj != PNone.NO_VALUE) {
161161
return factory.createSequenceIterator(value);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DestructuringAssignmentNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private void writeSequenceStorage(VirtualFrame frame, SequenceStorage sequenceSt
128128
int len = lenNode.execute(sequenceStorage);
129129
if (len > slots.length) {
130130
CompilerDirectives.transferToInterpreter();
131-
throw getCore().raiseInvalidSyntax(getEncapsulatingSourceSection().getSource(), getEncapsulatingSourceSection(), ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, slots.length);
131+
throw getCore().raise(ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, slots.length);
132132
} else if (len < slots.length) {
133133
throw ensureRaiseNode().raise(ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, slots.length, len);
134134
} else {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@
4747
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4848
import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback;
4949
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
50+
import com.oracle.graal.python.nodes.ErrorMessages;
51+
import com.oracle.graal.python.nodes.PRaiseNode;
5052
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
5153
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
5254
import com.oracle.truffle.api.CallTarget;
5355
import com.oracle.truffle.api.CompilerAsserts;
56+
import com.oracle.truffle.api.CompilerDirectives;
5457
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5558
import com.oracle.truffle.api.Truffle;
5659
import com.oracle.truffle.api.TruffleException;
@@ -229,6 +232,17 @@ public void expectStopIteration(IsBuiltinClassProfile profile) {
229232
}
230233
}
231234

235+
public void expectStopIteration(IsBuiltinClassProfile profile, PRaiseNode raise, Object o) {
236+
if (!profile.profileException(this, PythonBuiltinClassType.StopIteration)) {
237+
CompilerDirectives.transferToInterpreterAndInvalidate();
238+
Object clazz = PythonObjectLibrary.getUncached().getLazyPythonClass(getExceptionObject());
239+
if (IsBuiltinClassProfile.profileClassSlowPath(clazz, PythonBuiltinClassType.AttributeError)) {
240+
throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, PythonObjectLibrary.getUncached().getLazyPythonClass(o));
241+
}
242+
throw this;
243+
}
244+
}
245+
232246
public void expectStopIteration(IsBuiltinClassProfile profile, PythonObjectLibrary lib) {
233247
if (!profile.profileException(this, PythonBuiltinClassType.StopIteration, lib)) {
234248
throw this;

0 commit comments

Comments
 (0)