Skip to content

Commit 481a518

Browse files
committed
Fix: 'divmod' builtin did not handle error case.
1 parent 663ab3a commit 481a518

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_binary_arithmetic.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,21 @@ def test_floor_div():
133133
assert_exception(lambda: 5.4 // 0.0, ZeroDivisionError)
134134

135135

136+
def test_divmod():
137+
class Floatable:
138+
def __init__(self, val):
139+
self.val = val
140+
def __float__(self):
141+
return self.val
142+
143+
def doDivmod(a, b):
144+
return divmod(a, b)
145+
146+
argList = [(Floatable(3), Floatable(4)), (complex(1,2), complex(3,4))]
147+
for args in argList:
148+
assert_exception(lambda: doDivmod(*args), TypeError)
149+
150+
136151
def test_subclass_ordered_binop():
137152
class A(int):
138153
def __add__(self, other):

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@
9898
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
9999
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
100100
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
101-
import com.oracle.graal.python.builtins.objects.complex.PComplex;
102101
import com.oracle.graal.python.builtins.objects.dict.PDict;
103102
import com.oracle.graal.python.builtins.objects.frame.FrameBuiltins.GetLocalsNode;
104103
import com.oracle.graal.python.builtins.objects.function.Arity;
@@ -176,6 +175,7 @@
176175
import com.oracle.truffle.api.dsl.Cached;
177176
import com.oracle.truffle.api.dsl.Fallback;
178177
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
178+
import com.oracle.truffle.api.dsl.ImportStatic;
179179
import com.oracle.truffle.api.dsl.Specialization;
180180
import com.oracle.truffle.api.dsl.TypeSystemReference;
181181
import com.oracle.truffle.api.frame.Frame;
@@ -498,7 +498,8 @@ private ListAppendNode getAppendNode() {
498498
@Builtin(name = DIVMOD, fixedNumOfPositionalArgs = 2)
499499
@TypeSystemReference(PythonArithmeticTypes.class)
500500
@GenerateNodeFactory
501-
public abstract static class DivModNode extends PythonBuiltinNode {
501+
@ImportStatic(BinaryArithmetic.class)
502+
public abstract static class DivModNode extends PythonBinaryBuiltinNode {
502503
@Specialization(guards = "b != 0")
503504
public PTuple doLong(long a, long b) {
504505
return factory().createTuple(new Object[]{Math.floorDiv(a, b), Math.floorMod(a, b)});
@@ -518,22 +519,10 @@ public PTuple doDouble(double a, double b) {
518519
return factory().createTuple(new Object[]{q, a % b});
519520
}
520521

521-
@Specialization
522-
@SuppressWarnings("unused")
523-
public PTuple doComplex(PComplex c, Object o) {
524-
throw raise(PythonErrorType.TypeError, "can't take floor or mod of complex number.");
525-
}
526-
527-
@Specialization
528-
@SuppressWarnings("unused")
529-
public PTuple doComplex(Object o, PComplex c) {
530-
throw raise(PythonErrorType.TypeError, "can't take floor or mod of complex number.");
531-
}
532-
533522
@Specialization
534523
public PTuple doObject(Object a, Object b,
535-
@Cached("create(__FLOORDIV__)") LookupAndCallBinaryNode floordivNode,
536-
@Cached("create(__MOD__)") LookupAndCallBinaryNode modNode) {
524+
@Cached("FloorDiv.create()") LookupAndCallBinaryNode floordivNode,
525+
@Cached("Mod.create()") LookupAndCallBinaryNode modNode) {
537526
Object div = floordivNode.executeObject(a, b);
538527
Object mod = modNode.executeObject(a, b);
539528
return factory().createTuple(new Object[]{div, mod});

0 commit comments

Comments
 (0)