Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit fa1ed0a

Browse filesBrowse files
committed
Fix itertools.product error behavior
1 parent 0e5df9c commit fa1ed0a
Copy full SHA for fa1ed0a

2 files changed

+38-23Lines changed: 38 additions & 23 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎graalpython/com.oracle.graal.python.test/src/tests/test_itertools.py‎

Copy file name to clipboardExpand all lines: graalpython/com.oracle.graal.python.test/src/tests/test_itertools.py
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ def __index__(self):
140140

141141
self.assertEqual(list(product([1, 2], repeat=Index(2))), [(1, 1), (1, 2), (2, 1), (2, 2)])
142142
self.assertEqual(list(product([1, 2], repeat=Index(0))), [()])
143-
self.assertRaises(TypeError, product, [1, 2], repeat=Index(-1))
143+
self.assertRaises(ValueError, product, [1, 2], repeat=Index(-1))
144+
self.assertRaises(ValueError, product, [1, 2], repeat=-1)
144145
self.assertRaises(TypeError, product, [1, 2], repeat=None)
145146
self.assertRaises(TypeError, product, [1, 2], repeat=object())
146147

Collapse file

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ProductBuiltins.java‎

Copy file name to clipboardExpand all lines: graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ProductBuiltins.java
+36-22Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@
4141
package com.oracle.graal.python.builtins.objects.itertools;
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
44+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
4445
import static com.oracle.graal.python.nodes.ErrorMessages.ARG_CANNOT_BE_NEGATIVE;
4546
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
4647
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
48+
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETSTATE__;
4749

4850
import java.util.List;
4951

@@ -59,22 +61,25 @@
5961
import com.oracle.graal.python.builtins.modules.ItertoolsModuleBuiltins.DeprecatedSetStateBuiltin;
6062
import com.oracle.graal.python.builtins.objects.PNone;
6163
import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
62-
import com.oracle.graal.python.builtins.objects.list.PList;
6364
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6465
import com.oracle.graal.python.builtins.objects.type.TpSlots;
6566
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
6667
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
67-
import com.oracle.graal.python.lib.PyLongAsIntNode;
6868
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
69+
import com.oracle.graal.python.lib.PyTupleCheckNode;
6970
import com.oracle.graal.python.lib.PyTupleGetItem;
71+
import com.oracle.graal.python.lib.PyTupleSizeNode;
7072
import com.oracle.graal.python.nodes.ErrorMessages;
7173
import com.oracle.graal.python.nodes.PRaiseNode;
7274
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7375
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7476
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
7577
import com.oracle.graal.python.nodes.object.GetClassNode;
78+
import com.oracle.graal.python.nodes.util.CannotCastException;
79+
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
7680
import com.oracle.graal.python.runtime.object.PFactory;
7781
import com.oracle.graal.python.util.PythonUtils;
82+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
7883
import com.oracle.truffle.api.dsl.Bind;
7984
import com.oracle.truffle.api.dsl.Cached;
8085
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -129,7 +134,7 @@ static Object constructRepeat(VirtualFrame frame, Object cls, Object[] iterables
129134
int repeatInt = asSizeNode.executeExact(frame, inliningTarget, repeat);
130135
if (repeatInt < 0) {
131136
errorProfile.enter(inliningTarget);
132-
throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARG_CANNOT_BE_NEGATIVE, "repeat");
137+
throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ARG_CANNOT_BE_NEGATIVE, "repeat");
133138
}
134139
PProduct self = PFactory.createProduct(cls, getInstanceShape.execute(cls));
135140
if (repeatInt == 0) {
@@ -314,37 +319,46 @@ static Object reduce(PProduct self) {
314319
}
315320

316321
private static PTuple createGearTuple(PProduct self, PythonLanguage language) {
317-
PList[] lists = new PList[self.getGears().length];
318-
for (int i = 0; i < lists.length; i++) {
319-
lists[i] = PFactory.createList(language, self.getGears()[i]);
322+
PTuple[] tuples = new PTuple[self.getGears().length];
323+
for (int i = 0; i < tuples.length; i++) {
324+
tuples[i] = PFactory.createTuple(language, self.getGears()[i]);
320325
}
321-
return PFactory.createTuple(language, lists);
326+
return PFactory.createTuple(language, tuples);
322327
}
323328
}
324329

325330
@Builtin(name = J___SETSTATE__, minNumOfPositionalArgs = 2)
326331
@GenerateNodeFactory
327332
public abstract static class SetStateNode extends DeprecatedSetStateBuiltin {
328333
@Specialization
329-
static Object setState(PProduct self, Object state) {
334+
@TruffleBoundary
335+
static Object setState(PProduct self, Object state,
336+
@Bind Node inliningTarget) {
330337
Object[][] gears = self.getGears();
338+
if (!PyTupleCheckNode.executeUncached(state) || PyTupleSizeNode.executeUncached(state) != gears.length) {
339+
throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.INVALID_ARGS, T___SETSTATE__);
340+
}
331341
Object[] lst = new Object[gears.length];
332342
int[] indices = self.getIndices();
333-
for (int i = 0; i < gears.length; i++) {
334-
Object o = PyTupleGetItem.executeUncached(state, i);
335-
int index = PyLongAsIntNode.executeUncached(o);
336-
int gearSize = gears[i].length;
337-
if (indices == null || gearSize == 0) {
338-
self.setStopped(true);
339-
return PNone.NONE;
340-
}
341-
if (index < 0) {
342-
index = 0;
343-
} else if (index > gearSize - 1) {
344-
index = gearSize - 1;
343+
try {
344+
for (int i = 0; i < gears.length; i++) {
345+
Object o = PyTupleGetItem.executeUncached(state, i);
346+
int index = CastToJavaIntExactNode.executeUncached(o);
347+
int gearSize = gears[i].length;
348+
if (indices == null || gearSize == 0) {
349+
self.setStopped(true);
350+
return PNone.NONE;
351+
}
352+
if (index < 0) {
353+
index = 0;
354+
} else if (index > gearSize - 1) {
355+
index = gearSize - 1;
356+
}
357+
indices[i] = index;
358+
lst[i] = gears[i][index];
345359
}
346-
indices[i] = index;
347-
lst[i] = gears[i][index];
360+
} catch (CannotCastException e) {
361+
throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED);
348362
}
349363
self.setLst(lst);
350364
return PNone.NONE;

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.