Skip to content

Commit cc6a27e

Browse files
committed
sq/mp_length slots can be 'complex'
1 parent 754519e commit cc6a27e

File tree

4 files changed

+62
-17
lines changed

4 files changed

+62
-17
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ private static String getSuffix(boolean isComplex) {
5151
static String getSlotBaseClass(Slot s) {
5252
return switch (s.value()) {
5353
case nb_bool -> "TpSlotInquiry.TpSlotInquiryBuiltin";
54-
case sq_length, mp_length -> "TpSlotLen.TpSlotLenBuiltin";
54+
case sq_length, mp_length -> "TpSlotLen.TpSlotLenBuiltin" + getSuffix(s.isComplex());
5555
case tp_get_attro -> "TpSlotGetAttr.TpSlotGetAttrBuiltin";
5656
case tp_descr_get -> "TpSlotDescrGet.TpSlotDescrGetBuiltin" + getSuffix(s.isComplex());
5757
case tp_descr_set -> "TpSlotDescrSet.TpSlotDescrSetBuiltin";
@@ -62,8 +62,8 @@ static String getSlotNodeBaseClass(Slot s) {
6262
return switch (s.value()) {
6363
case tp_descr_get -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode";
6464
case nb_bool -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode";
65-
case sq_length, mp_length, tp_get_attro ->
66-
"com.oracle.graal.python.builtins.objects.type.slots." + getSlotBaseClass(s).replace(".TpSlot", ".") + "Node";
65+
case sq_length, mp_length -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode";
66+
case tp_get_attro -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode";
6767
case tp_descr_set -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.DescrSetBuiltinNode";
6868
};
6969
}
@@ -80,8 +80,8 @@ static String getUncachedExecuteSignature(SlotKind s) {
8080

8181
static boolean supportsComplex(SlotKind s) {
8282
return switch (s) {
83-
case nb_bool, sq_length, mp_length -> false;
84-
case tp_get_attro, tp_descr_get, tp_descr_set -> true;
83+
case nb_bool -> false;
84+
case sq_length, mp_length, tp_get_attro, tp_descr_get, tp_descr_set -> true;
8585
};
8686
}
8787

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mappingproxy/MappingproxyBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ Object run(VirtualFrame frame, PMappingproxy self, Object key,
196196
}
197197
}
198198

199-
@Slot(SlotKind.mp_length)
199+
@Slot(value = SlotKind.mp_length, isComplex = true)
200200
@GenerateUncached
201201
@GenerateNodeFactory
202202
public abstract static class LenNode extends LenBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ public static TruffleString repr(PRange self,
183183
}
184184
}
185185

186-
@Slot(SlotKind.sq_length)
187-
@Slot(SlotKind.mp_length)
186+
@Slot(value = SlotKind.sq_length, isComplex = true)
187+
@Slot(value = SlotKind.mp_length, isComplex = true)
188188
@GenerateUncached
189189
@GenerateNodeFactory
190190
public abstract static class LenNode extends LenBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotLen.java

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,22 @@
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
45+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LEN__;
4546
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__;
4647

48+
import com.oracle.graal.python.PythonLanguage;
4749
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckPrimitiveFunctionResultNode;
4850
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
4951
import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
5052
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
5153
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
54+
import com.oracle.graal.python.builtins.objects.function.PArguments;
5255
import com.oracle.graal.python.builtins.objects.ints.PInt;
5356
import com.oracle.graal.python.builtins.objects.type.slots.HPyDispatchers.UnaryHPySlotDispatcherNode;
5457
import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.UnaryPythonSlotDispatcherNode;
58+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
5559
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative;
5660
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
57-
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotSimpleBuiltinBase;
5861
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
5962
import com.oracle.graal.python.lib.PyNumberIndexNode;
6063
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -63,11 +66,13 @@
6366
import com.oracle.graal.python.nodes.PRaiseNode.Lazy;
6467
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6568
import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
69+
import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
6670
import com.oracle.graal.python.runtime.PythonContext;
6771
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
6872
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
6973
import com.oracle.graal.python.runtime.exception.PException;
7074
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
75+
import com.oracle.truffle.api.RootCallTarget;
7176
import com.oracle.truffle.api.dsl.Bind;
7277
import com.oracle.truffle.api.dsl.Cached;
7378
import com.oracle.truffle.api.dsl.GenerateCached;
@@ -76,9 +81,11 @@
7681
import com.oracle.truffle.api.dsl.NodeFactory;
7782
import com.oracle.truffle.api.dsl.Specialization;
7883
import com.oracle.truffle.api.frame.VirtualFrame;
84+
import com.oracle.truffle.api.nodes.IndirectCallNode;
7985
import com.oracle.truffle.api.nodes.Node;
8086
import com.oracle.truffle.api.nodes.UnexpectedResultException;
8187
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
88+
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
8289

8390
public abstract class TpSlotLen {
8491
private TpSlotLen() {
@@ -88,16 +95,44 @@ private TpSlotLen() {
8895
// the BCI interpreter. For the time being we do what GraalPy used to do before slots were
8996
// introduced: raise overflow error if native code returns number larger than INT_MAX
9097

91-
public abstract static class TpSlotLenBuiltin<T extends LenBuiltinNode> extends TpSlotSimpleBuiltinBase<T> {
98+
public abstract static sealed class TpSlotLenBuiltin<T extends LenBuiltinNode>
99+
extends TpSlotBuiltinBase<T> permits TpSlotLenBuiltinSimple, TpSlotLenBuiltinComplex {
100+
static final BuiltinSlotWrapperSignature SIGNATURE = BuiltinSlotWrapperSignature.UNARY;
101+
92102
protected TpSlotLenBuiltin(NodeFactory<T> nodeFactory) {
93-
super(nodeFactory, BuiltinSlotWrapperSignature.UNARY, PExternalFunctionWrapper.LENFUNC);
103+
super(nodeFactory, SIGNATURE, PExternalFunctionWrapper.LENFUNC);
94104
}
95105

96106
final LenBuiltinNode createSlotNode() {
97107
return createNode();
98108
}
109+
}
110+
111+
public abstract static non-sealed class TpSlotLenBuiltinSimple<T extends LenBuiltinNode> extends TpSlotLenBuiltin<T> {
112+
protected TpSlotLenBuiltinSimple(NodeFactory<T> nodeFactory) {
113+
super(nodeFactory);
114+
}
99115

100116
protected abstract int executeUncached(Object self);
117+
118+
@Override
119+
public final void initialize(PythonLanguage language) {
120+
// nop
121+
}
122+
}
123+
124+
public abstract static non-sealed class TpSlotLenBuiltinComplex<T extends LenBuiltinNode> extends TpSlotLenBuiltin<T> {
125+
private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
126+
127+
protected TpSlotLenBuiltinComplex(NodeFactory<T> nodeFactory) {
128+
super(nodeFactory);
129+
}
130+
131+
@Override
132+
public final void initialize(PythonLanguage language) {
133+
RootCallTarget callTarget = createBuiltinCallTarget(language, SIGNATURE, getNodeFactory(), J___LEN__);
134+
language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
135+
}
101136
}
102137

103138
@GenerateInline(value = false, inherit = true)
@@ -125,12 +160,6 @@ static int callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpS
125160
return slotNode.executeInt(frame, self);
126161
}
127162

128-
@Specialization(replaces = "callCachedBuiltin")
129-
static int callGenericSimpleBuiltin(TpSlotLenBuiltin<?> slot, Object self) {
130-
// Assumption: all len builtins don't need a frame and PE
131-
return slot.executeUncached(self);
132-
}
133-
134163
@Specialization
135164
static int callPython(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
136165
@Cached(inline = false) CallSlotLenPythonNode callSlotNode) {
@@ -155,6 +184,22 @@ static int callNative(VirtualFrame frame, Node inliningTarget, TpSlotNative slot
155184
return (int) l;
156185
}
157186

187+
@Specialization(replaces = "callCachedBuiltin")
188+
static int callGenericSimpleBuiltin(TpSlotLenBuiltinSimple<?> slot, Object self) {
189+
return slot.executeUncached(self);
190+
}
191+
192+
@Specialization(replaces = "callCachedBuiltin")
193+
@InliningCutoff
194+
static int callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotLenBuiltinComplex<?> slot, Object self,
195+
@Cached(inline = false) CallContext callContext,
196+
@Cached InlinedConditionProfile isNullFrameProfile,
197+
@Cached(inline = false) IndirectCallNode indirectCallNode) {
198+
Object[] arguments = PArguments.create(1);
199+
PArguments.setArgument(arguments, 0, self);
200+
return (int) BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
201+
}
202+
158203
// @Specialization(guards = "slot.isHPySlot()")
159204
// @InliningCutoff
160205
@SuppressWarnings("unused")

0 commit comments

Comments
 (0)