Skip to content

Commit f4d427e

Browse files
committed
[GR-57755] Migrate nb_index, nb_int, nb_float to new slots
PullRequest: graalpython/3645
2 parents a45b371 + 43024d7 commit f4d427e

File tree

56 files changed

+1328
-1484
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1328
-1484
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@
9595
enum SlotKind {
9696
/** Whether this object is treated as true or false for {@code if object} */
9797
nb_bool("__bool__"),
98+
/** Conversion to index (operator.index) */
99+
nb_index("__index__"),
100+
/** Conversion to int */
101+
nb_int("__int__"),
102+
/** Conversion to float */
103+
nb_float("__float__"),
98104
/** foo + bar */
99105
nb_add("__add__, __radd__"),
100106
/** foo - bar */

graalpython/com.oracle.graal.python.cext/src/longobject.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2018, 2024, Oracle and/or its affiliates.
1+
/* Copyright (c) 2018, 2025, Oracle and/or its affiliates.
22
* Copyright (C) 1996-2017 Python Software Foundation
33
*
44
* Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
@@ -1914,6 +1914,7 @@ PyLong_FromString(const char *str, char **pend, int base)
19141914
while (*str != '\0' && Py_ISSPACE(Py_CHARMASK(*str))) {
19151915
str++;
19161916
}
1917+
const char *orig_str = str;
19171918
if (*str == '+') {
19181919
++str;
19191920
} else if (*str == '-') {
@@ -1985,10 +1986,7 @@ PyLong_FromString(const char *str, char **pend, int base)
19851986
if (error_if_nonzero) {
19861987
base = 0;
19871988
}
1988-
PyObject* string = PyUnicode_FromStringAndSize(numberStart, digits);
1989-
PyObject* result = GraalPyTruffleLong_FromString(string, base, negative);
1990-
Py_DecRef(string);
1991-
return result;
1989+
return GraalPyTruffleLong_FromString(orig_str, base);
19921990
} else {
19931991
return PyLong_FromLong(negative ? value : -value);
19941992
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +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_index, nb_int, nb_float -> "TpSlotUnaryFunc.TpSlotUnaryFuncBuiltin";
5556
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
5657
nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
5758
"TpSlotBinaryOp.TpSlotBinaryOpBuiltin";
@@ -72,6 +73,7 @@ static String getSlotNodeBaseClass(Slot s) {
7273
return switch (s.value()) {
7374
case tp_descr_get -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode";
7475
case nb_bool -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode";
76+
case nb_index, nb_int, nb_float -> "com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode";
7577
case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or,
7678
nb_floor_divide, nb_true_divide, nb_matrix_multiply ->
7779
"com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode";
@@ -122,6 +124,9 @@ static String getUncachedExecuteCall(SlotKind s) {
122124

123125
public static String getExtraCtorArgs(TpSlotData slot) {
124126
return switch (slot.slot().value()) {
127+
case nb_index -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___INDEX__";
128+
case nb_int -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___INT__";
129+
case nb_float -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__";
125130
case nb_add -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ADD__";
126131
case nb_subtract -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__";
127132
case nb_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MUL__";

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -549,11 +549,8 @@ def __index__(self):
549549
self.assertEqual([0, 1, 0, 0, 0, 0], a)
550550

551551
a = [0]
552-
a.insert(LONG_NUMBER, 1)
553-
self.assertEqual([0, 1], a)
554-
555552
a.insert(False, -1)
556-
self.assertEqual([-1, 0, 1], a)
553+
self.assertEqual([-1, 0], a)
557554

558555
def test_StopIteration(self):
559556
l = [1.0]

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

Lines changed: 73 additions & 603 deletions
Large diffs are not rendered by default.

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

Lines changed: 10 additions & 24 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.
@@ -38,9 +38,6 @@
3838
import static com.oracle.graal.python.nodes.ErrorMessages.S_FOR_ISLICE_MUST_BE;
3939
import static com.oracle.graal.python.nodes.ErrorMessages.S_MUST_BE_S;
4040
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COPY__;
41-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__;
42-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__;
43-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__;
4441

4542
import java.util.ArrayList;
4643
import java.util.List;
@@ -79,9 +76,9 @@
7976
import com.oracle.graal.python.lib.PyCallableCheckNode;
8077
import com.oracle.graal.python.lib.PyLongAsIntNode;
8178
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
79+
import com.oracle.graal.python.lib.PyNumberCheckNode;
8280
import com.oracle.graal.python.lib.PyObjectGetIter;
8381
import com.oracle.graal.python.lib.PyObjectLookupAttr;
84-
import com.oracle.graal.python.lib.PyObjectTypeCheck;
8582
import com.oracle.graal.python.nodes.ErrorMessages;
8683
import com.oracle.graal.python.nodes.PGuards;
8784
import com.oracle.graal.python.nodes.PRaiseNode;
@@ -878,37 +875,26 @@ protected ArgumentClinicProvider getArgumentClinic() {
878875
}
879876

880877
@Specialization
881-
static Object construct(VirtualFrame frame, Object cls, Object start, Object step,
878+
static Object construct(Object cls, Object start, Object step,
882879
@Bind("this") Node inliningTarget,
883-
@Cached PyObjectTypeCheck typeCheckNode,
884-
@Cached PyObjectLookupAttr lookupAttrNode,
885-
@Cached InlinedBranchProfile startNumberProfile,
886-
@Cached InlinedBranchProfile stepNumberProfile,
880+
@Cached PyNumberCheckNode checkNode,
887881
@Cached IsTypeNode isTypeNode,
888882
@Cached PythonObjectFactory factory,
889883
@Cached PRaiseNode.Lazy raiseNode) {
890884
if (!isTypeNode.execute(inliningTarget, cls)) {
891885
throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
892886
}
887+
if (!checkNode.execute(inliningTarget, start)) {
888+
throw raiseNode.get(inliningTarget).raise(TypeError, NUMBER_IS_REQUIRED);
889+
}
890+
if (!checkNode.execute(inliningTarget, step)) {
891+
throw raiseNode.get(inliningTarget).raise(TypeError, NUMBER_IS_REQUIRED);
892+
}
893893
PCount self = factory.createCount(cls);
894-
checkType(frame, inliningTarget, start, typeCheckNode, lookupAttrNode, startNumberProfile, raiseNode);
895-
checkType(frame, inliningTarget, step, typeCheckNode, lookupAttrNode, stepNumberProfile, raiseNode);
896894
self.setCnt(start);
897895
self.setStep(step);
898896
return self;
899897
}
900-
901-
private static void checkType(VirtualFrame frame, Node inliningTarget, Object obj, PyObjectTypeCheck typeCheckNode, PyObjectLookupAttr lookupAttrNode, InlinedBranchProfile isNumberProfile,
902-
PRaiseNode.Lazy raiseNode) {
903-
if (typeCheckNode.execute(inliningTarget, obj, PythonBuiltinClassType.PComplex) ||
904-
lookupAttrNode.execute(frame, inliningTarget, obj, T___INDEX__) != PNone.NO_VALUE ||
905-
lookupAttrNode.execute(frame, inliningTarget, obj, T___FLOAT__) != PNone.NO_VALUE ||
906-
lookupAttrNode.execute(frame, inliningTarget, obj, T___INT__) != PNone.NO_VALUE) {
907-
isNumberProfile.enter(inliningTarget);
908-
return;
909-
}
910-
throw raiseNode.get(inliningTarget).raise(TypeError, NUMBER_IS_REQUIRED);
911-
}
912898
}
913899

914900
@Builtin(name = "starmap", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PStarmap, doc = "starmap(function, sequence) --> starmap object\n\n" +

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__;
6565

6666
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
67-
import com.oracle.graal.python.builtins.modules.BuiltinConstructors;
6867
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode;
6968
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TupleNode;
7069
import com.oracle.graal.python.builtins.modules.BuiltinFunctions.AbsNode;
@@ -108,6 +107,7 @@
108107
import com.oracle.graal.python.lib.PyNumberCheckNode;
109108
import com.oracle.graal.python.lib.PyNumberFloatNode;
110109
import com.oracle.graal.python.lib.PyNumberIndexNode;
110+
import com.oracle.graal.python.lib.PyNumberLongNode;
111111
import com.oracle.graal.python.lib.PyNumberMultiplyNode;
112112
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
113113
import com.oracle.graal.python.lib.PyObjectGetAttr;
@@ -197,19 +197,10 @@ static Object index(Object obj,
197197
abstract static class PyNumber_Long extends CApiUnaryBuiltinNode {
198198

199199
@Specialization
200-
static int nlong(int i) {
201-
return i;
202-
}
203-
204-
@Specialization
205-
static long nlong(long i) {
206-
return i;
207-
}
208-
209-
@Fallback
210-
static Object nlong(Object obj,
211-
@Cached BuiltinConstructors.IntNode intNode) {
212-
return intNode.executeWith(null, obj, PNone.NO_VALUE);
200+
static Object nlong(Object object,
201+
@Bind("this") Node inliningTarget,
202+
@Cached PyNumberLongNode pyNumberLongNode) {
203+
return pyNumberLongNode.execute(null, inliningTarget, object);
213204
}
214205
}
215206

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextLongBuiltins.java

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 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
@@ -44,12 +44,12 @@
4444
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
4545
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored;
4646
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.CONST_UNSIGNED_CHAR_PTR;
47+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.CharPtrAsTruffleString;
4748
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
4849
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.LONG_LONG;
4950
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer;
5051
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyLongObject;
5152
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
52-
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectAsTruffleString;
5353
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
5454
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.SIZE_T;
5555
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UNSIGNED_CHAR_PTR;
@@ -60,8 +60,6 @@
6060
import java.math.BigInteger;
6161

6262
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
63-
import com.oracle.graal.python.builtins.modules.BuiltinConstructors;
64-
import com.oracle.graal.python.builtins.modules.BuiltinConstructors.IntNode;
6563
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode;
6664
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode;
6765
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
@@ -77,15 +75,14 @@
7775
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.TransformExceptionToNativeNodeGen;
7876
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
7977
import com.oracle.graal.python.builtins.objects.ints.IntBuiltins;
80-
import com.oracle.graal.python.builtins.objects.ints.IntBuiltins.NegNode;
8178
import com.oracle.graal.python.builtins.objects.ints.IntNodes;
8279
import com.oracle.graal.python.builtins.objects.ints.PInt;
8380
import com.oracle.graal.python.lib.PyLongFromDoubleNode;
81+
import com.oracle.graal.python.lib.PyLongFromUnicodeObject;
8482
import com.oracle.graal.python.nodes.ErrorMessages;
8583
import com.oracle.graal.python.nodes.PRaiseNode;
8684
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
8785
import com.oracle.graal.python.nodes.object.GetClassNode;
88-
import com.oracle.graal.python.nodes.truffle.PythonTypes;
8986
import com.oracle.graal.python.runtime.exception.PException;
9087
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
9188
import com.oracle.graal.python.util.OverflowException;
@@ -98,15 +95,13 @@
9895
import com.oracle.truffle.api.dsl.Cached.Shared;
9996
import com.oracle.truffle.api.dsl.Fallback;
10097
import com.oracle.truffle.api.dsl.Specialization;
101-
import com.oracle.truffle.api.dsl.TypeSystemReference;
10298
import com.oracle.truffle.api.interop.InteropLibrary;
10399
import com.oracle.truffle.api.interop.UnsupportedMessageException;
104100
import com.oracle.truffle.api.library.CachedLibrary;
105101
import com.oracle.truffle.api.nodes.Node;
106102
import com.oracle.truffle.api.nodes.UnexpectedResultException;
107103
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
108104
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
109-
import com.oracle.truffle.api.strings.TruffleString;
110105

111106
public final class PythonCextLongBuiltins {
112107

@@ -212,21 +207,14 @@ static Object fromDouble(double d,
212207
}
213208
}
214209

215-
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObjectAsTruffleString, Int, Int}, call = Ignored)
216-
@TypeSystemReference(PythonTypes.class)
217-
abstract static class PyTruffleLong_FromString extends CApiTernaryBuiltinNode {
210+
@CApiBuiltin(ret = PyObjectTransfer, args = {CharPtrAsTruffleString, Int}, call = Ignored)
211+
abstract static class PyTruffleLong_FromString extends CApiBinaryBuiltinNode {
218212

219-
@Specialization(guards = "negative == 0")
220-
Object fromString(Object s, int base, @SuppressWarnings("unused") int negative,
221-
@Shared @Cached BuiltinConstructors.IntNode intNode) {
222-
return intNode.executeWith(null, s, base);
223-
}
224-
225-
@Specialization(guards = "negative != 0")
226-
Object fromString(Object s, int base, @SuppressWarnings("unused") int negative,
227-
@Shared @Cached BuiltinConstructors.IntNode intNode,
228-
@Cached NegNode negNode) {
229-
return negNode.execute(null, intNode.executeWith(null, s, base));
213+
@Specialization
214+
Object fromString(Object s, int base,
215+
@Bind("this") Node inliningTarget,
216+
@Cached PyLongFromUnicodeObject fromUnicodeObject) {
217+
return fromUnicodeObject.execute(inliningTarget, s, base);
230218
}
231219
}
232220

@@ -459,12 +447,13 @@ static Object get(PInt value, Object bytes, long n, int littleEndian, int isSign
459447
}
460448
}
461449

462-
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObjectAsTruffleString, Int}, call = Direct)
450+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Int}, call = Direct)
463451
abstract static class PyLong_FromUnicodeObject extends CApiBinaryBuiltinNode {
464452
@Specialization
465-
static Object convert(TruffleString s, int base,
466-
@Cached IntNode intNode) {
467-
return intNode.executeWith(null, s, base);
453+
static Object convert(Object s, int base,
454+
@Bind("this") Node inliningTarget,
455+
@Cached PyLongFromUnicodeObject pyLongFromUnicodeObject) {
456+
return pyLongFromUnicodeObject.execute(inliningTarget, s, base);
468457
}
469458
}
470459

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperBuiltins.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 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
@@ -146,7 +146,7 @@
146146
import com.oracle.graal.python.lib.PyErrChainExceptions;
147147
import com.oracle.graal.python.lib.PyLongAsLongNode;
148148
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
149-
import com.oracle.graal.python.lib.PyNumberIndexNode;
149+
import com.oracle.graal.python.lib.PyNumberLongNode;
150150
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
151151
import com.oracle.graal.python.lib.PyObjectGetAttr;
152152
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
@@ -665,7 +665,7 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence,
665665
@Bind("this") Node inliningTarget,
666666
@Cached InlinedConditionProfile overflow,
667667
@Cached CastToJavaLongLossyNode toLong,
668-
@Cached PyNumberIndexNode indexNode,
668+
@Cached PyNumberLongNode longNode,
669669
@Cached TextIOWrapperNodes.DecoderSetStateNode decoderSetStateNode,
670670
@Cached TextIOWrapperNodes.DecoderResetNode decoderResetNode,
671671
@Cached TextIOWrapperNodes.EncoderResetNode encoderResetNode,
@@ -729,7 +729,7 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence,
729729
throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_WHENCE_D_SHOULD_BE_D_D_OR_D, whence, SEEK_SET, SEEK_CUR, SEEK_END);
730730
}
731731

732-
Object cookieLong = indexNode.execute(frame, inliningTarget, cookieObj);
732+
Object cookieLong = longNode.execute(frame, inliningTarget, cookieObj);
733733
PTextIO.CookieType cookie;
734734
if (cookieLong instanceof PInt) {
735735
if (((PInt) cookieLong).isNegative()) {

0 commit comments

Comments
 (0)