Skip to content

Commit 50119d4

Browse files
committed
Migrate nb_divmod slot
1 parent e480a22 commit 50119d4

File tree

11 files changed

+167
-185
lines changed

11 files changed

+167
-185
lines changed

graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/Slot.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ enum SlotKind {
103103
nb_multiply("__mul__, __rmul__"),
104104
/** foo % bar */
105105
nb_remainder("__mod__, __rmod__"),
106+
/** divmod(foo, bar) */
107+
nb_divmod("__divmod__, __rdivmod__"),
106108
/** foo << bar */
107109
nb_lshift("__lshift__, __rlshift__"),
108110
/** foo >> bar */

graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsMapping.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private static String getSuffix(boolean isComplex) {
5252
static String getSlotBaseClass(Slot s) {
5353
return switch (s.value()) {
5454
case nb_bool -> "TpSlotInquiry.TpSlotInquiryBuiltin";
55-
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
55+
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
5656
nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
5757
"TpSlotBinaryOp.TpSlotBinaryOpBuiltin";
5858
case sq_concat -> "TpSlotBinaryFunc.TpSlotSqConcat";
@@ -70,7 +70,7 @@ static String getSlotNodeBaseClass(Slot s) {
7070
return switch (s.value()) {
7171
case tp_descr_get -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode";
7272
case nb_bool -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode";
73-
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
73+
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
7474
nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
7575
"com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode";
7676
case sq_concat -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode";
@@ -90,7 +90,7 @@ static String getUncachedExecuteSignature(SlotKind s) {
9090
case tp_descr_get -> "Object executeUncached(Object self, Object obj, Object type)";
9191
case sq_length, mp_length -> "int executeUncached(Object self)";
9292
case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, sq_concat, sq_repeat,
93-
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift,
93+
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift,
9494
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
9595
throw new AssertionError("Should not reach here: should be always complex");
9696
};
@@ -101,7 +101,7 @@ static boolean supportsComplex(SlotKind s) {
101101
case nb_bool -> false;
102102
case sq_length, mp_length, tp_getattro, tp_descr_get, tp_descr_set,
103103
tp_setattro, sq_item, mp_subscript, sq_concat, sq_repeat,
104-
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift,
104+
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift,
105105
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
106106
true;
107107
};
@@ -111,7 +111,7 @@ static boolean supportsSimple(SlotKind s) {
111111
return switch (s) {
112112
case nb_bool, sq_length, mp_length, tp_descr_get -> true;
113113
case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, sq_concat, sq_repeat,
114-
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift,
114+
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift,
115115
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
116116
false;
117117
};
@@ -123,7 +123,7 @@ static String getUncachedExecuteCall(SlotKind s) {
123123
case sq_length, mp_length -> "executeInt(null, self)";
124124
case tp_descr_get -> "execute(null, self, obj, type)";
125125
case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, sq_concat, sq_repeat,
126-
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift,
126+
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift,
127127
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
128128
throw new AssertionError("Should not reach here: should be always complex");
129129
};
@@ -135,6 +135,7 @@ public static String getExtraCtorArgs(TpSlotData slot) {
135135
case nb_subtract -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__";
136136
case nb_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MUL__";
137137
case nb_remainder -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__";
138+
case nb_divmod -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__";
138139
case nb_lshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___LSHIFT__";
139140
case nb_rshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___RSHIFT__";
140141
case nb_and -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__";

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

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2024, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -142,7 +142,6 @@
142142
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
143143
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
144144
import com.oracle.graal.python.builtins.objects.dict.PDict;
145-
import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins;
146145
import com.oracle.graal.python.builtins.objects.frame.PFrame;
147146
import com.oracle.graal.python.builtins.objects.function.PArguments;
148147
import com.oracle.graal.python.builtins.objects.function.PFunction;
@@ -169,6 +168,7 @@
169168
import com.oracle.graal.python.lib.PyMappingCheckNode;
170169
import com.oracle.graal.python.lib.PyNumberAddNode;
171170
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
171+
import com.oracle.graal.python.lib.PyNumberDivmodNode;
172172
import com.oracle.graal.python.lib.PyNumberIndexNode;
173173
import com.oracle.graal.python.lib.PyObjectAsciiNode;
174174
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
@@ -792,43 +792,14 @@ static Object dir(VirtualFrame frame, Object object,
792792

793793
// divmod(a, b)
794794
@Builtin(name = J_DIVMOD, minNumOfPositionalArgs = 2)
795-
@TypeSystemReference(PythonArithmeticTypes.class)
796795
@GenerateNodeFactory
797-
@ImportStatic(BinaryArithmetic.class)
798796
public abstract static class DivModNode extends PythonBinaryBuiltinNode {
799-
@Specialization(guards = "b != 0")
800-
static PTuple doLong(long a, long b,
801-
@Shared @Cached PythonObjectFactory factory) {
802-
return factory.createTuple(new Object[]{Math.floorDiv(a, b), Math.floorMod(a, b)});
803-
}
804-
805-
@Specialization(replaces = "doLong")
806-
static PTuple doLongZero(long a, long b,
807-
@Bind("this") Node inliningTarget,
808-
@Shared @Cached PythonObjectFactory factory,
809-
@Shared @Cached PRaiseNode.Lazy raiseNode) {
810-
if (b == 0) {
811-
throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.INTEGER_DIVISION_BY_ZERO);
812-
}
813-
return factory.createTuple(new Object[]{Math.floorDiv(a, b), Math.floorMod(a, b)});
814-
}
815-
816-
@Specialization
817-
static PTuple doDouble(double a, double b,
818-
@Bind("this") Node inliningTarget,
819-
@Shared @Cached PythonObjectFactory factory,
820-
@Shared @Cached PRaiseNode.Lazy raiseNode) {
821-
if (b == 0) {
822-
throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
823-
}
824-
double q = Math.floor(a / b);
825-
return factory.createTuple(new Object[]{q, FloatBuiltins.ModNode.mod(a, b)});
826-
}
827797

828798
@Specialization
829799
static Object doObject(VirtualFrame frame, Object a, Object b,
830-
@Cached("DivMod.create()") BinaryOpNode callDivmod) {
831-
return callDivmod.executeObject(frame, a, b);
800+
@Bind("this") Node inliningTarget,
801+
@Cached PyNumberDivmodNode divmodNode) {
802+
return divmodNode.execute(frame, inliningTarget, a, b);
832803
}
833804
}
834805

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyProcsWrapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,10 @@ public static BinaryOpSlotFuncWrapper createTrueDivide(TpSlotManaged delegate) {
348348
return new BinaryOpSlotFuncWrapper(delegate, BinaryOpSlot.NB_TRUE_DIVIDE);
349349
}
350350

351+
public static BinaryOpSlotFuncWrapper createDivMod(TpSlotManaged delegate) {
352+
return new BinaryOpSlotFuncWrapper(delegate, BinaryOpSlot.NB_DIVMOD);
353+
}
354+
351355
public static BinaryOpSlotFuncWrapper createMatrixMultiply(TpSlotManaged delegate) {
352356
return new BinaryOpSlotFuncWrapper(delegate, BinaryOpSlot.NB_MATRIX_MULTIPLY);
353357
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import static com.oracle.graal.python.nodes.BuiltinNames.J_FLOAT;
3131
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__;
3232
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CEIL__;
33-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__;
3433
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
3534
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__;
3635
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOOR__;
@@ -47,7 +46,6 @@
4746
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__;
4847
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__;
4948
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__;
50-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__;
5149
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
5250
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__;
5351
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__;
@@ -474,8 +472,7 @@ protected Object op(double left, double right) {
474472
}
475473
}
476474

477-
@Builtin(name = J___RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
478-
@Builtin(name = J___DIVMOD__, minNumOfPositionalArgs = 2)
475+
@Slot(value = SlotKind.nb_divmod, isComplex = true)
479476
@GenerateNodeFactory
480477
abstract static class DivModNode extends AbstractNumericBinaryBuiltin {
481478
@Child private PythonObjectFactory factory = PythonObjectFactory.create();

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

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import static com.oracle.graal.python.builtins.objects.str.StringUtils.simpleTruffleStringFormatUncached;
3030
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__;
3131
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CEIL__;
32-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__;
3332
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
3433
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__;
3534
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOOR__;
@@ -43,7 +42,6 @@
4342
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEG__;
4443
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__;
4544
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__;
46-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__;
4745
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
4846
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__;
4947
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__;
@@ -72,6 +70,7 @@
7270
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode;
7371
import com.oracle.graal.python.lib.PyNumberAddNode;
7472
import com.oracle.graal.python.lib.PyNumberAndNode;
73+
import com.oracle.graal.python.lib.PyNumberDivmodNode;
7574
import com.oracle.graal.python.lib.PyNumberFloorDivideNode;
7675
import com.oracle.graal.python.lib.PyNumberLshiftNode;
7776
import com.oracle.graal.python.lib.PyNumberMultiplyNode;
@@ -562,6 +561,18 @@ static Object doIt(VirtualFrame frame, Object left, Object right,
562561
}
563562
}
564563

564+
@Slot(value = SlotKind.nb_divmod, isComplex = true)
565+
@GenerateNodeFactory
566+
abstract static class DivModNode extends BinaryOpBuiltinNode {
567+
@Specialization
568+
static Object doIt(VirtualFrame frame, Object left, Object right,
569+
@Bind("this") Node inliningTarget,
570+
@Cached ForeignBinarySlotNode binarySlotNode,
571+
@Cached(inline = false) PyNumberDivmodNode opNode) {
572+
return binarySlotNode.execute(frame, inliningTarget, left, right, opNode);
573+
}
574+
}
575+
565576
@Builtin(name = J___POW__, minNumOfPositionalArgs = 2)
566577
@GenerateNodeFactory
567578
abstract static class PowNode extends ForeignBinaryNode {
@@ -578,22 +589,6 @@ abstract static class RPowNode extends ForeignBinaryNode {
578589
}
579590
}
580591

581-
@Builtin(name = J___DIVMOD__, minNumOfPositionalArgs = 2)
582-
@GenerateNodeFactory
583-
abstract static class DivModNode extends ForeignBinaryNode {
584-
DivModNode() {
585-
super(BinaryArithmetic.DivMod.create(), false);
586-
}
587-
}
588-
589-
@Builtin(name = J___RDIVMOD__, minNumOfPositionalArgs = 2)
590-
@GenerateNodeFactory
591-
abstract static class RDivModNode extends ForeignBinaryNode {
592-
RDivModNode() {
593-
super(BinaryArithmetic.DivMod.create(), true);
594-
}
595-
}
596-
597592
@Builtin(name = J___ROUND__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
598593
@GenerateNodeFactory
599594
abstract static class RoundNode extends ForeignBinaryNode {

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

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242

4343
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__;
4444
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CEIL__;
45-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__;
4645
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
4746
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__;
4847
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOOR__;
@@ -60,7 +59,6 @@
6059
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__;
6160
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__;
6261
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__;
63-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__;
6462
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
6563
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__;
6664
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__;
@@ -100,7 +98,6 @@
10098
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromNativeSubclassNode;
10199
import com.oracle.graal.python.builtins.objects.common.FormatNodeBase;
102100
import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsClinicProviders.FormatNodeClinicProviderGen;
103-
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
104101
import com.oracle.graal.python.builtins.objects.type.TpSlots;
105102
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
106103
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode;
@@ -803,47 +800,21 @@ public static FloorDivNode create() {
803800
}
804801
}
805802

806-
@Builtin(name = J___RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
807-
@Builtin(name = J___DIVMOD__, minNumOfPositionalArgs = 2)
808-
@TypeSystemReference(PythonArithmeticTypes.class)
803+
@Slot(value = SlotKind.nb_divmod, isComplex = true)
809804
@GenerateNodeFactory
810-
abstract static class DivModNode extends PythonBinaryBuiltinNode {
811-
@Specialization
812-
static PTuple doLL(int left, int right,
813-
@Bind("this") Node inliningTarget,
814-
@Shared @Cached InlinedBranchProfile divisionByZeroProfile,
815-
@Shared @Cached PythonObjectFactory factory,
816-
@Shared @Cached PRaiseNode.Lazy raiseNode) {
817-
raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
818-
return factory.createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
819-
}
805+
abstract static class DivModNode extends BinaryOpBuiltinNode {
820806

821807
@Specialization
822-
static PTuple doLL(long left, long right,
823-
@Bind("this") Node inliningTarget,
824-
@Shared @Cached InlinedBranchProfile divisionByZeroProfile,
825-
@Shared @Cached PythonObjectFactory factory,
826-
@Shared @Cached PRaiseNode.Lazy raiseNode) {
827-
raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
828-
return factory.createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
829-
}
830-
831-
@Specialization(guards = {"accepts(left)", "accepts(right)"})
832-
static PTuple doGenericInt(VirtualFrame frame, Object left, Object right,
808+
static Object doGeneric(VirtualFrame frame, Object left, Object right,
833809
@Cached FloorDivNode floorDivNode,
834810
@Cached ModNode modNode,
835-
@Shared @Cached PythonObjectFactory factory) {
836-
return factory.createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)});
837-
}
838-
839-
@SuppressWarnings("unused")
840-
@Fallback
841-
static PNotImplemented doGeneric(Object left, Object right) {
842-
return PNotImplemented.NOT_IMPLEMENTED;
843-
}
844-
845-
protected static boolean accepts(Object obj) {
846-
return obj instanceof Integer || obj instanceof Long || obj instanceof PInt;
811+
@Cached PythonObjectFactory factory) {
812+
Object div = floorDivNode.execute(frame, left, right);
813+
if (div == PNotImplemented.NOT_IMPLEMENTED) {
814+
return PNotImplemented.NOT_IMPLEMENTED;
815+
}
816+
Object mod = modNode.execute(frame, left, right);
817+
return factory.createTuple(new Object[]{div, mod});
847818
}
848819
}
849820

0 commit comments

Comments
 (0)