Skip to content

Commit e0a2cc9

Browse files
committed
[GR-10285] divmod doesn't throw TypeError, when it called with complex numbers.
PullRequest: graalpython/316
2 parents f37d4fa + fb968ed commit e0a2cc9

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ def test_GR11897(self):
3131
code = 'a' + ' = ' + '8.01234567890123'
3232
exec(code, globs)
3333
self.assertEqual(globs['a'], 8.01234567890123)
34+
35+
def test_divmod_complex(self):
36+
c1, c2 = complex(3, 2), complex(4,1)
37+
self.assertRaises(TypeError, divmod, c1, c2)
38+
self.assertRaises(TypeError, divmod, 10, c2)
39+
self.assertRaises(TypeError, divmod, c1, 10)

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
9696
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
9797
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
98+
import com.oracle.graal.python.builtins.objects.complex.PComplex;
9899
import com.oracle.graal.python.builtins.objects.dict.PDict;
99100
import com.oracle.graal.python.builtins.objects.frame.FrameBuiltins.GetLocalsNode;
100101
import com.oracle.graal.python.builtins.objects.function.Arity;
@@ -504,6 +505,18 @@ public PTuple doDouble(double a, double b) {
504505
return factory().createTuple(new Object[]{q, a % b});
505506
}
506507

508+
@Specialization
509+
@SuppressWarnings("unused")
510+
public PTuple doComplex(PComplex c, Object o) {
511+
throw raise(PythonErrorType.TypeError, "can't take floor or mod of complex number.");
512+
}
513+
514+
@Specialization
515+
@SuppressWarnings("unused")
516+
public PTuple doComplex(Object o, PComplex c) {
517+
throw raise(PythonErrorType.TypeError, "can't take floor or mod of complex number.");
518+
}
519+
507520
@Specialization
508521
public PTuple doObject(Object a, Object b,
509522
@Cached("create(__FLOORDIV__)") LookupAndCallBinaryNode floordivNode,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import static com.oracle.graal.python.nodes.SpecialMethodNames.__STR__;
6262
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SUB__;
6363
import static com.oracle.graal.python.nodes.SpecialMethodNames.__TRUEDIV__;
64+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIVMOD__;
6465

6566
import java.util.List;
6667

@@ -76,6 +77,7 @@
7677
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
7778
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
7879
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
80+
import com.oracle.graal.python.runtime.exception.PythonErrorType;
7981
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
8082
import com.oracle.truffle.api.dsl.Fallback;
8183
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -306,6 +308,17 @@ PNotImplemented doComplex(Object left, Object right) {
306308
}
307309
}
308310

311+
@GenerateNodeFactory
312+
@Builtin(name = __DIVMOD__, fixedNumOfPositionalArgs = 2)
313+
static abstract class DivModNode extends PythonBinaryBuiltinNode {
314+
315+
@Specialization
316+
@SuppressWarnings("unused")
317+
PComplex doComplexDouble(Object right, Object left) {
318+
throw raise(PythonErrorType.TypeError, "can't take floor or mod of complex number.");
319+
}
320+
}
321+
309322
@GenerateNodeFactory
310323
@Builtin(name = __MUL__, fixedNumOfPositionalArgs = 2)
311324
@TypeSystemReference(PythonArithmeticTypes.class)

0 commit comments

Comments
 (0)