Skip to content

Commit 5b6cb6a

Browse files
committed
New slots for remaining nb_* binary slots
1 parent f0d4523 commit 5b6cb6a

35 files changed

+1829
-749
lines changed

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -97,7 +97,28 @@ enum SlotKind {
9797
nb_bool("__bool__"),
9898
/** foo + bar */
9999
nb_add("__add__, __radd__"),
100+
/** foo - bar */
101+
nb_subtract("__sub__, __rsub__"),
102+
/** foo * bar */
100103
nb_multiply("__mul__, __rmul__"),
104+
/** foo % bar */
105+
nb_remainder("__mod__, __rmod__"),
106+
/** foo << bar */
107+
nb_lshift("__lshift__, __rlshift__"),
108+
/** foo >> bar */
109+
nb_rshift("__rshift__, __rrshift__"),
110+
/** foo & bar */
111+
nb_and("__and__, __rand__"),
112+
/** foo ^ bar */
113+
nb_xor("__xor__, __rxor__"),
114+
/** foo | bar */
115+
nb_or("__or__, __ror__"),
116+
/** foo // bar */
117+
nb_floor_divide("__floordiv__, __rfloordiv__"),
118+
/** foo / bar */
119+
nb_true_divide("__truediv__, __rtruediv__"),
120+
/** foo @ bar */
121+
nb_matrix_multiply("__matmul__, __rmatmul__"),
101122
/** sequence length/size */
102123
sq_length("__len__"),
103124
/** sequence item: read element at index */

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

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -52,7 +52,9 @@ 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_multiply -> "TpSlotBinaryOp.TpSlotBinaryOpBuiltin";
55+
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
56+
nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
57+
"TpSlotBinaryOp.TpSlotBinaryOpBuiltin";
5658
case sq_concat -> "TpSlotBinaryFunc.TpSlotSqConcat";
5759
case sq_length, mp_length -> "TpSlotLen.TpSlotLenBuiltin" + getSuffix(s.isComplex());
5860
case sq_item, sq_repeat -> "TpSlotSizeArgFun.TpSlotSizeArgFunBuiltin";
@@ -68,7 +70,9 @@ static String getSlotNodeBaseClass(Slot s) {
6870
return switch (s.value()) {
6971
case tp_descr_get -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode";
7072
case nb_bool -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode";
71-
case nb_add, nb_multiply -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode";
73+
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
74+
nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
75+
"com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode";
7276
case sq_concat -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode";
7377
case sq_length, mp_length -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode";
7478
case sq_item -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode";
@@ -85,7 +89,9 @@ static String getUncachedExecuteSignature(SlotKind s) {
8589
case nb_bool -> "boolean executeUncached(Object self)";
8690
case tp_descr_get -> "Object executeUncached(Object self, Object obj, Object type)";
8791
case sq_length, mp_length -> "int executeUncached(Object self)";
88-
case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, nb_add, sq_concat, sq_repeat, nb_multiply ->
92+
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,
94+
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
8995
throw new AssertionError("Should not reach here: should be always complex");
9096
};
9197
}
@@ -94,17 +100,19 @@ static boolean supportsComplex(SlotKind s) {
94100
return switch (s) {
95101
case nb_bool -> false;
96102
case sq_length, mp_length, tp_getattro, tp_descr_get, tp_descr_set,
97-
tp_setattro, sq_item, mp_subscript, nb_add, sq_concat,
98-
sq_repeat, nb_multiply ->
103+
tp_setattro, sq_item, mp_subscript, sq_concat, sq_repeat,
104+
nb_add, nb_subtract, nb_multiply, nb_remainder, nb_lshift, nb_rshift,
105+
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
99106
true;
100107
};
101108
}
102109

103110
static boolean supportsSimple(SlotKind s) {
104111
return switch (s) {
105112
case nb_bool, sq_length, mp_length, tp_descr_get -> true;
106-
case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript,
107-
nb_add, sq_concat, sq_repeat, nb_multiply ->
113+
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,
115+
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
108116
false;
109117
};
110118
}
@@ -114,16 +122,27 @@ static String getUncachedExecuteCall(SlotKind s) {
114122
case nb_bool -> "executeBool(null, self)";
115123
case sq_length, mp_length -> "executeInt(null, self)";
116124
case tp_descr_get -> "execute(null, self, obj, type)";
117-
case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript,
118-
nb_add, sq_concat, nb_multiply, sq_repeat ->
125+
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,
127+
nb_and, nb_xor, nb_or, nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
119128
throw new AssertionError("Should not reach here: should be always complex");
120129
};
121130
}
122131

123132
public static String getExtraCtorArgs(TpSlotData slot) {
124133
return switch (slot.slot().value()) {
125134
case nb_add -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ADD__";
135+
case nb_subtract -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__";
126136
case nb_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MUL__";
137+
case nb_remainder -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__";
138+
case nb_lshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___LSHIFT__";
139+
case nb_rshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___RSHIFT__";
140+
case nb_and -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__";
141+
case nb_xor -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__";
142+
case nb_or -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__";
143+
case nb_floor_divide -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOORDIV__";
144+
case nb_true_divide -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__";
145+
case nb_matrix_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MATMUL__";
127146
default -> "";
128147
};
129148
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 11 additions & 6 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.
@@ -124,12 +124,14 @@
124124
import com.oracle.graal.python.builtins.modules.functools.LruCacheWrapperBuiltins;
125125
import com.oracle.graal.python.builtins.objects.NoneBuiltins;
126126
import com.oracle.graal.python.builtins.objects.array.ArrayBuiltins;
127+
import com.oracle.graal.python.builtins.objects.bool.BoolBuiltins;
127128
import com.oracle.graal.python.builtins.objects.bytes.ByteArrayBuiltins;
128129
import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins;
129130
import com.oracle.graal.python.builtins.objects.bytes.BytesCommonBuiltins;
130131
import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins;
131132
import com.oracle.graal.python.builtins.objects.contextvars.ContextBuiltins;
132133
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltins;
134+
import com.oracle.graal.python.builtins.objects.dict.DefaultDictBuiltins;
133135
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins;
134136
import com.oracle.graal.python.builtins.objects.dict.DictValuesBuiltins;
135137
import com.oracle.graal.python.builtins.objects.dict.DictViewBuiltins;
@@ -154,9 +156,12 @@
154156
import com.oracle.graal.python.builtins.objects.mmap.MMapBuiltins;
155157
import com.oracle.graal.python.builtins.objects.module.ModuleBuiltins;
156158
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
159+
import com.oracle.graal.python.builtins.objects.ordereddict.OrderedDictBuiltins;
157160
import com.oracle.graal.python.builtins.objects.property.PropertyBuiltins;
158161
import com.oracle.graal.python.builtins.objects.range.RangeBuiltins;
159162
import com.oracle.graal.python.builtins.objects.set.BaseSetBuiltins;
163+
import com.oracle.graal.python.builtins.objects.set.FrozenSetBuiltins;
164+
import com.oracle.graal.python.builtins.objects.set.SetBuiltins;
160165
import com.oracle.graal.python.builtins.objects.str.StringBuiltins;
161166
import com.oracle.graal.python.builtins.objects.superobject.SuperBuiltins;
162167
import com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins;
@@ -186,7 +191,7 @@
186191
@ExportLibrary(ReflectionLibrary.class)
187192
public enum PythonBuiltinClassType implements TruffleObject {
188193

189-
Boolean("bool", J_BUILTINS, Flags.PUBLIC_DERIVED_WODICT, BOOLEAN_M_FLAGS),
194+
Boolean("bool", J_BUILTINS, Flags.PUBLIC_DERIVED_WODICT, BOOLEAN_M_FLAGS, BoolBuiltins.SLOTS),
190195
PArray("array", "array", ARRAY_M_FLAGS, ArrayBuiltins.SLOTS),
191196
PArrayIterator("arrayiterator", Flags.PRIVATE_DERIVED_WODICT),
192197
PIterator("iterator", Flags.PRIVATE_DERIVED_WODICT),
@@ -211,12 +216,12 @@ public enum PythonBuiltinClassType implements TruffleObject {
211216
PPartial(J_PARTIAL, "_functools", "functools", Flags.PUBLIC_BASE_WDICT),
212217
PLruListElem("_lru_list_elem", null, "functools", Flags.PUBLIC_DERIVED_WODICT),
213218
PLruCacheWrapper(J_LRU_CACHE_WRAPPER, "_functools", "functools", Flags.PUBLIC_BASE_WDICT, LruCacheWrapperBuiltins.SLOTS),
214-
PDefaultDict(J_DEFAULTDICT, "_collections", "collections", Flags.PUBLIC_BASE_WODICT, DEFAULTDICT_M_FLAGS, DictBuiltins.SLOTS),
219+
PDefaultDict(J_DEFAULTDICT, "_collections", "collections", Flags.PUBLIC_BASE_WODICT, DEFAULTDICT_M_FLAGS, DefaultDictBuiltins.SLOTS),
215220
PDeque(J_DEQUE, "_collections", Flags.PUBLIC_BASE_WODICT, DEQUE_M_FLAGS, DequeBuiltins.SLOTS),
216221
PTupleGetter(J_TUPLE_GETTER, "_collections", Flags.PUBLIC_BASE_WODICT, TupleGetterBuiltins.SLOTS),
217222
PDequeIter(J_DEQUE_ITER, "_collections", Flags.PUBLIC_DERIVED_WODICT),
218223
PDequeRevIter(J_DEQUE_REV_ITER, "_collections", Flags.PUBLIC_DERIVED_WODICT),
219-
POrderedDict(J_ORDERED_DICT, "_collections", Flags.PUBLIC_BASE_WDICT, DICT_M_FLAGS),
224+
POrderedDict(J_ORDERED_DICT, "_collections", Flags.PUBLIC_BASE_WDICT, DICT_M_FLAGS, OrderedDictBuiltins.SLOTS),
220225
POrderedDictKeys("odict_keys", Flags.PRIVATE_DERIVED_WODICT, DICTKEYSVIEW_M_FLAGS),
221226
POrderedDictValues("odict_values", Flags.PRIVATE_DERIVED_WODICT, DICTVALUESVIEW_M_FLAGS),
222227
POrderedDictItems("odict_items", Flags.PRIVATE_DERIVED_WODICT, DICTITEMSVIEW_M_FLAGS),
@@ -237,7 +242,7 @@ public enum PythonBuiltinClassType implements TruffleObject {
237242
PMap("map", J_BUILTINS),
238243
PFloat("float", J_BUILTINS, FLOAT_M_FLAGS, FloatBuiltins.SLOTS),
239244
PFrame("frame", Flags.PRIVATE_DERIVED_WODICT),
240-
PFrozenSet("frozenset", J_BUILTINS, FROZENSET_M_FLAGS, BaseSetBuiltins.SLOTS),
245+
PFrozenSet("frozenset", J_BUILTINS, FROZENSET_M_FLAGS, TpSlots.merge(BaseSetBuiltins.SLOTS, FrozenSetBuiltins.SLOTS)),
241246
PFunction("function", Flags.PRIVATE_DERIVED_WDICT, FunctionBuiltins.SLOTS),
242247
PGenerator("generator", Flags.PRIVATE_DERIVED_WODICT, GENERATOR_M_FLAGS),
243248
PCoroutine("coroutine", Flags.PRIVATE_DERIVED_WODICT, COROUTINE_M_FLAGS),
@@ -261,7 +266,7 @@ public enum PythonBuiltinClassType implements TruffleObject {
261266
PReferenceType("ReferenceType", "_weakref"),
262267
PSentinelIterator("callable_iterator", Flags.PRIVATE_DERIVED_WODICT),
263268
PReverseIterator("reversed", J_BUILTINS),
264-
PSet("set", J_BUILTINS, SET_M_FLAGS, BaseSetBuiltins.SLOTS),
269+
PSet("set", J_BUILTINS, SET_M_FLAGS, TpSlots.merge(BaseSetBuiltins.SLOTS, SetBuiltins.SLOTS)),
265270
PSlice("slice", J_BUILTINS),
266271
PString("str", J_BUILTINS, STRING_M_FLAGS, StringBuiltins.SLOTS),
267272
PTraceback("traceback"),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bool/BoolBuiltins.java

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -25,31 +25,28 @@
2525
*/
2626
package com.oracle.graal.python.builtins.objects.bool;
2727

28-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__;
29-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__;
30-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__;
3128
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
32-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
33-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__;
3429
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__;
35-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__;
3630
import static com.oracle.graal.python.nodes.StringLiterals.T_FALSE;
3731
import static com.oracle.graal.python.nodes.StringLiterals.T_TRUE;
3832

3933
import java.util.List;
4034

35+
import com.oracle.graal.python.annotations.Slot;
36+
import com.oracle.graal.python.annotations.Slot.SlotKind;
4137
import com.oracle.graal.python.builtins.Builtin;
4238
import com.oracle.graal.python.builtins.CoreFunctions;
4339
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4440
import com.oracle.graal.python.builtins.PythonBuiltins;
4541
import com.oracle.graal.python.builtins.objects.ints.IntBuiltins;
4642
import com.oracle.graal.python.builtins.objects.ints.PInt;
47-
import com.oracle.graal.python.nodes.PGuards;
43+
import com.oracle.graal.python.builtins.objects.type.TpSlots;
44+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
4845
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4946
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
50-
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5147
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
5248
import com.oracle.truffle.api.dsl.Cached;
49+
import com.oracle.truffle.api.dsl.Fallback;
5350
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5451
import com.oracle.truffle.api.dsl.NodeFactory;
5552
import com.oracle.truffle.api.dsl.Specialization;
@@ -60,6 +57,8 @@
6057
@CoreFunctions(extendClasses = PythonBuiltinClassType.Boolean)
6158
public final class BoolBuiltins extends PythonBuiltins {
6259

60+
public static final TpSlots SLOTS = BoolBuiltinsSlotsGen.SLOTS;
61+
6362
@Override
6463
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
6564
return BoolBuiltinsFactory.getFactories();
@@ -85,57 +84,48 @@ public static TruffleString doPInt(PInt self) {
8584
abstract static class RepNode extends StrNode {
8685
}
8786

88-
abstract static class BaseBoolBinaryNode extends PythonBinaryBuiltinNode {
89-
static boolean atLeastOneIsNotBoolean(Object self, Object other) {
90-
return !PGuards.isBoolean(self) || !PGuards.isBoolean(other);
91-
}
92-
}
93-
94-
@Builtin(name = J___AND__, minNumOfPositionalArgs = 2)
95-
@Builtin(name = J___RAND__, minNumOfPositionalArgs = 2)
87+
@Slot(value = SlotKind.nb_and, isComplex = true)
9688
@TypeSystemReference(PythonArithmeticTypes.class)
9789
@GenerateNodeFactory
98-
abstract static class AndNode extends BaseBoolBinaryNode {
90+
abstract static class AndNode extends BinaryOpBuiltinNode {
9991
@Specialization
10092
static Object doBool(boolean self, boolean other) {
10193
return self && other;
10294
}
10395

104-
@Specialization(guards = "atLeastOneIsNotBoolean(self, other)")
96+
@Fallback
10597
static Object doOther(VirtualFrame frame, Object self, Object other,
10698
@Cached IntBuiltins.AndNode andNode) {
10799
return andNode.execute(frame, self, other);
108100
}
109101
}
110102

111-
@Builtin(name = J___OR__, minNumOfPositionalArgs = 2)
112-
@Builtin(name = J___ROR__, minNumOfPositionalArgs = 2)
103+
@Slot(value = SlotKind.nb_or, isComplex = true)
113104
@TypeSystemReference(PythonArithmeticTypes.class)
114105
@GenerateNodeFactory
115-
abstract static class OrNode extends BaseBoolBinaryNode {
106+
abstract static class OrNode extends BinaryOpBuiltinNode {
116107
@Specialization
117108
static Object doBool(boolean self, boolean other) {
118109
return self || other;
119110
}
120111

121-
@Specialization(guards = "atLeastOneIsNotBoolean(self, other)")
112+
@Fallback
122113
static Object doOther(VirtualFrame frame, Object self, Object other,
123114
@Cached IntBuiltins.OrNode orNode) {
124115
return orNode.execute(frame, self, other);
125116
}
126117
}
127118

128-
@Builtin(name = J___XOR__, minNumOfPositionalArgs = 2)
129-
@Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2)
119+
@Slot(value = SlotKind.nb_xor, isComplex = true)
130120
@TypeSystemReference(PythonArithmeticTypes.class)
131121
@GenerateNodeFactory
132-
abstract static class XorNode extends BaseBoolBinaryNode {
122+
abstract static class XorNode extends BinaryOpBuiltinNode {
133123
@Specialization
134124
static Object doBool(boolean self, boolean other) {
135125
return self ^ other;
136126
}
137127

138-
@Specialization(guards = "atLeastOneIsNotBoolean(self, other)")
128+
@Fallback
139129
static Object doOther(VirtualFrame frame, Object self, Object other,
140130
@Cached IntBuiltins.XorNode xorNode) {
141131
return xorNode.execute(frame, self, other);

0 commit comments

Comments
 (0)