Skip to content

Commit 544dfd1

Browse files
committed
Implement missing __divmod__ operations
1 parent 8581a4d commit 544dfd1

File tree

4 files changed

+79
-2
lines changed

4 files changed

+79
-2
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@
2525
*/
2626
package com.oracle.graal.python.builtins.objects.floats;
2727

28-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
2928
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
29+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
3030
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
3131
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ABS__;
3232
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ADD__;
3333
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BOOL__;
34+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIVMOD__;
3435
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
3536
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOAT__;
3637
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOORDIV__;
@@ -48,6 +49,7 @@
4849
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POS__;
4950
import static com.oracle.graal.python.nodes.SpecialMethodNames.__POW__;
5051
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
52+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RDIVMOD__;
5153
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5254
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RFLOORDIV__;
5355
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMOD__;
@@ -598,6 +600,37 @@ PNotImplemented doGeneric(Object left, Object right) {
598600
}
599601
}
600602

603+
@Builtin(name = __RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
604+
@Builtin(name = __DIVMOD__, minNumOfPositionalArgs = 2)
605+
@TypeSystemReference(PythonArithmeticTypes.class)
606+
@GenerateNodeFactory
607+
abstract static class DivModNode extends FloatBinaryBuiltinNode {
608+
@Specialization
609+
PTuple doDL(double left, long right) {
610+
raiseDivisionByZero(right == 0);
611+
return factory().createTuple(new Object[]{Math.floor(left / right), left % right});
612+
}
613+
614+
@Specialization
615+
PTuple doDD(double left, double right) {
616+
raiseDivisionByZero(right == 0.0);
617+
return factory().createTuple(new Object[]{Math.floor(left / right), left % right});
618+
}
619+
620+
@Specialization
621+
PTuple doLD(long left, double right) {
622+
raiseDivisionByZero(right == 0.0);
623+
return factory().createTuple(new Object[]{Math.floor(left / right), left % right});
624+
}
625+
626+
@Specialization
627+
PTuple doGeneric(VirtualFrame frame, Object left, Object right,
628+
@Cached FloorDivNode floorDivNode,
629+
@Cached ModNode modNode) {
630+
return factory().createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)});
631+
}
632+
}
633+
601634
@Builtin(name = SpecialMethodNames.__HASH__, minNumOfPositionalArgs = 1)
602635
@GenerateNodeFactory
603636
@TypeSystemReference(PythonArithmeticTypes.class)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELATTR__;
3636
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELITEM__;
3737
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIR__;
38+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DIVMOD__;
3839
import static com.oracle.graal.python.nodes.SpecialMethodNames.__EQ__;
3940
import static com.oracle.graal.python.nodes.SpecialMethodNames.__FLOORDIV__;
4041
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTR__;
@@ -50,6 +51,7 @@
5051
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NEW__;
5152
import static com.oracle.graal.python.nodes.SpecialMethodNames.__NE__;
5253
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RADD__;
54+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RDIVMOD__;
5355
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
5456
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RFLOORDIV__;
5557
import static com.oracle.graal.python.nodes.SpecialMethodNames.__RMUL__;
@@ -415,6 +417,22 @@ abstract static class RFloorDivNode extends ForeignBinaryNode {
415417
}
416418
}
417419

420+
@Builtin(name = __DIVMOD__, minNumOfPositionalArgs = 2)
421+
@GenerateNodeFactory
422+
abstract static class DivModNode extends ForeignBinaryNode {
423+
DivModNode() {
424+
super(BinaryArithmetic.DivMod.create(), false);
425+
}
426+
}
427+
428+
@Builtin(name = __RDIVMOD__, minNumOfPositionalArgs = 2)
429+
@GenerateNodeFactory
430+
abstract static class RDivModNode extends ForeignBinaryNode {
431+
RDivModNode() {
432+
super(BinaryArithmetic.DivMod.create(), true);
433+
}
434+
}
435+
418436
public abstract static class ForeignBinaryComparisonNode extends PythonBinaryBuiltinNode {
419437
@Child private BinaryComparisonNode comparisonNode;
420438

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,31 @@ PNotImplemented doGeneric(Object right, Object left) {
490490

491491
}
492492

493+
@Builtin(name = SpecialMethodNames.__RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
494+
@Builtin(name = SpecialMethodNames.__DIVMOD__, minNumOfPositionalArgs = 2)
495+
@TypeSystemReference(PythonArithmeticTypes.class)
496+
@GenerateNodeFactory
497+
abstract static class DivModNode extends IntBinaryBuiltinNode {
498+
@Specialization
499+
PTuple doLL(int left, int right) {
500+
raiseDivisionByZero(right == 0);
501+
return factory().createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
502+
}
503+
504+
@Specialization
505+
PTuple doLL(long left, long right) {
506+
raiseDivisionByZero(right == 0);
507+
return factory().createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
508+
}
509+
510+
@Specialization
511+
PTuple doGeneric(VirtualFrame frame, Object left, Object right,
512+
@Cached FloorDivNode floorDivNode,
513+
@Cached ModNode modNode) {
514+
return factory().createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)});
515+
}
516+
}
517+
493518
@Builtin(name = SpecialMethodNames.__MOD__, minNumOfPositionalArgs = 2)
494519
@TypeSystemReference(PythonArithmeticTypes.class)
495520
@GenerateNodeFactory

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryArithmetic.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public enum BinaryArithmetic {
6464
Or(SpecialMethodNames.__OR__, "|"),
6565
Xor(SpecialMethodNames.__XOR__, "^"),
6666
MatMul(SpecialMethodNames.__MATMUL__, "@"),
67-
Pow(SpecialMethodNames.__POW__, "**");
67+
Pow(SpecialMethodNames.__POW__, "**"),
68+
DivMod(SpecialMethodNames.__DIVMOD__, "divmod");
6869

6970
private final String methodName;
7071
private final String reverseMethodName;

0 commit comments

Comments
 (0)