Skip to content

Commit e682ac1

Browse files
committed
Align the wrapper/function of tp_descrget with CPython w.r.t. NULL<->None transformation
1 parent e436dda commit e682ac1

26 files changed

+312
-235
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static String getSlotBaseClass(Slot s) {
6060

6161
static String getSlotNodeBaseClass(Slot s) {
6262
return switch (s.value()) {
63-
case tp_descr_get -> "com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode";
63+
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";
6565
case sq_length, mp_length, tp_get_attro ->
6666
"com.oracle.graal.python.builtins.objects.type.slots." + getSlotBaseClass(s).replace(".TpSlot", ".") + "Node";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import java.util.concurrent.Semaphore;
5252
import java.util.logging.Level;
5353

54-
import com.oracle.graal.python.runtime.PythonImageBuildOptions;
5554
import org.graalvm.home.Version;
5655
import org.graalvm.nativeimage.ImageInfo;
5756
import org.graalvm.options.OptionDescriptors;
@@ -74,6 +73,7 @@
7473
import com.oracle.graal.python.builtins.objects.type.MroShape;
7574
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
7675
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
76+
import com.oracle.graal.python.builtins.objects.type.TpSlots;
7777
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
7878
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
7979
import com.oracle.graal.python.compiler.CodeUnit;
@@ -100,6 +100,7 @@
100100
import com.oracle.graal.python.runtime.IndirectCallData;
101101
import com.oracle.graal.python.runtime.PythonContext;
102102
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
103+
import com.oracle.graal.python.runtime.PythonImageBuildOptions;
103104
import com.oracle.graal.python.runtime.PythonOptions;
104105
import com.oracle.graal.python.runtime.exception.PException;
105106
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -337,6 +338,13 @@ public boolean isSingleContext() {
337338

338339
@CompilationFinal(dimensions = 1) private final RootCallTarget[] builtinSlotsCallTargets;
339340

341+
/**
342+
* We cannot initialize call targets in language ctor and the next suitable hook is context
343+
* initialization, but that is called multiple times. We use this flag to run the language
344+
* specific initialization only once.
345+
*/
346+
private volatile boolean isLanguageInitialized;
347+
340348
/**
341349
* A map to retrieve call targets of special slot methods for a given BuiltinMethodDescriptor.
342350
* Used to perform uncached calls to slots. The call targets are not directly part of
@@ -467,9 +475,19 @@ protected OptionDescriptors getOptionDescriptors() {
467475

468476
@Override
469477
protected void initializeContext(PythonContext context) {
478+
if (!isLanguageInitialized) {
479+
initializeLanguage();
480+
}
470481
context.initialize();
471482
}
472483

484+
private synchronized void initializeLanguage() {
485+
if (!isLanguageInitialized) {
486+
TpSlots.initializeBuiltinSlots(this);
487+
isLanguageInitialized = true;
488+
}
489+
}
490+
473491
private static String optFlagsToMime(int optimize, int flags) {
474492
if (optimize < 0) {
475493
optimize = 0;

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

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@
261261
import com.oracle.graal.python.builtins.objects.function.FunctionBuiltins;
262262
import com.oracle.graal.python.builtins.objects.function.MethodDescriptorBuiltins;
263263
import com.oracle.graal.python.builtins.objects.function.PArguments;
264-
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
265264
import com.oracle.graal.python.builtins.objects.function.PFunction;
266265
import com.oracle.graal.python.builtins.objects.function.WrapperDescriptorBuiltins;
267266
import com.oracle.graal.python.builtins.objects.generator.CommonGeneratorBuiltins;
@@ -352,7 +351,6 @@
352351
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
353352
import com.oracle.graal.python.builtins.objects.type.TpSlots;
354353
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
355-
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinWithSignature;
356354
import com.oracle.graal.python.builtins.objects.types.GenericAliasBuiltins;
357355
import com.oracle.graal.python.builtins.objects.types.GenericAliasIteratorBuiltins;
358356
import com.oracle.graal.python.lib.PyDictSetItem;
@@ -795,10 +793,6 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed,
795793
// not using EnumMap, HashMap, etc. to allow this to fold away during partial evaluation
796794
@CompilationFinal(dimensions = 1) private final PythonBuiltinClass[] builtinTypes = new PythonBuiltinClass[PythonBuiltinClassType.VALUES.length];
797795

798-
// Mapping from builtin slots (context independent) to corresponding builtin function
799-
// Not all slots used this mapping
800-
@CompilationFinal(dimensions = 1) private PBuiltinFunction[] builtinSlotsFunctions;
801-
802796
private final Map<TruffleString, PythonModule> builtinModules = new HashMap<>();
803797
@CompilationFinal private PythonModule builtinsModule;
804798
@CompilationFinal private PythonModule sysModule;
@@ -1134,27 +1128,11 @@ private PythonBuiltinClass initializeBuiltinClass(PythonBuiltinClassType type) {
11341128
return builtinTypes[index];
11351129
}
11361130

1137-
public void initializeBuiltinSlotsFunctionsMapping() {
1138-
// The slots themselves are initialized once per VM in PythonBuiltinClassType static ctor
1139-
// This array is going to be filled by the slots when they create their corresponding
1140-
// builtins
1141-
builtinSlotsFunctions = new PBuiltinFunction[TpSlotBuiltinWithSignature.getBuiltinFunctionsCount()];
1142-
}
1143-
1144-
public void setBuiltinSlotFunction(int index, PBuiltinFunction function) {
1145-
builtinSlotsFunctions[index] = function;
1146-
}
1147-
1148-
public PBuiltinFunction lookupBuiltinSlotFunction(int index) {
1149-
return builtinSlotsFunctions[index];
1150-
}
1151-
11521131
private void initializeTypes() {
11531132
// create class objects for builtin types
11541133
for (PythonBuiltinClassType builtinClass : PythonBuiltinClassType.VALUES) {
11551134
initializeBuiltinClass(builtinClass);
11561135
}
1157-
initializeBuiltinSlotsFunctionsMapping();
11581136
// n.b.: the builtin modules and classes and their constructors are initialized first here,
11591137
// so we have the mapping from java classes to python classes and builtin names to modules
11601138
// available.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CFieldBuiltins.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
8383
import com.oracle.graal.python.builtins.objects.type.TpSlots;
8484
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
85+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
8586
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.DescrSetBuiltinNode;
8687
import com.oracle.graal.python.lib.PyFloatAsDoubleNode;
8788
import com.oracle.graal.python.lib.PyLongAsLongNode;
@@ -91,7 +92,6 @@
9192
import com.oracle.graal.python.nodes.PGuards;
9293
import com.oracle.graal.python.nodes.PRaiseNode;
9394
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
94-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
9595
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
9696
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
9797
import com.oracle.graal.python.runtime.PythonContext;
@@ -172,15 +172,15 @@ static void doit(CFieldObject self, Object inst, Object value,
172172
@Slot(SlotKind.tp_descr_get)
173173
@GenerateUncached
174174
@GenerateNodeFactory
175-
abstract static class GetNode extends PythonTernaryBuiltinNode {
175+
abstract static class GetNode extends DescrGetBuiltinNode {
176176

177177
@Specialization
178178
static Object doit(CFieldObject self, Object inst, @SuppressWarnings("unused") Object type,
179179
@Bind("this") Node inliningTarget,
180180
@Cached PyCDataGetNode pyCDataGetNode,
181181
@Cached PyTypeCheck pyTypeCheck,
182182
@Cached PRaiseNode.Lazy raiseNode) {
183-
if (inst instanceof PNone) {
183+
if (inst == PNone.NO_VALUE) {
184184
return self;
185185
}
186186
if (!pyTypeCheck.isCDataObject(inliningTarget, inst)) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/LruCacheWrapperBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import com.oracle.graal.python.builtins.objects.dict.PDict;
7373
import com.oracle.graal.python.builtins.objects.function.PKeyword;
7474
import com.oracle.graal.python.builtins.objects.type.TpSlots;
75+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
7576
import com.oracle.graal.python.lib.PyCallableCheckNode;
7677
import com.oracle.graal.python.lib.PyIndexCheckNode;
7778
import com.oracle.graal.python.lib.PyLongCheckExactNode;
@@ -87,7 +88,6 @@
8788
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
8889
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
8990
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
90-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
9191
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
9292
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
9393
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
@@ -580,7 +580,7 @@ Object clear(LruCacheObject self) {
580580
@Slot(SlotKind.tp_descr_get)
581581
@GenerateUncached
582582
@GenerateNodeFactory
583-
abstract static class GetNode extends PythonTernaryBuiltinNode {
583+
abstract static class GetNode extends DescrGetBuiltinNode {
584584

585585
@Specialization
586586
static Object getmethod(LruCacheObject self, Object obj, @SuppressWarnings("unused") Object type,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/FunctionBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@
6666
import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
6767
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6868
import com.oracle.graal.python.builtins.objects.type.TpSlots;
69+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
6970
import com.oracle.graal.python.nodes.ErrorMessages;
7071
import com.oracle.graal.python.nodes.PRaiseNode;
7172
import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetFunctionCodeNode;
7273
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7374
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
74-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
7575
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
7676
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
7777
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -102,7 +102,7 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
102102
@Slot(SlotKind.tp_descr_get)
103103
@GenerateUncached
104104
@GenerateNodeFactory
105-
public abstract static class GetNode extends PythonTernaryBuiltinNode {
105+
public abstract static class GetNode extends DescrGetBuiltinNode {
106106
@Specialization(guards = {"!isPNone(instance)"})
107107
static PMethod doMethod(PFunction self, Object instance, @SuppressWarnings("unused") Object klass,
108108
@Cached PythonObjectFactory factory) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/MethodDescriptorBuiltins.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,13 @@
5050
import com.oracle.graal.python.builtins.CoreFunctions;
5151
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5252
import com.oracle.graal.python.builtins.PythonBuiltins;
53-
import com.oracle.graal.python.builtins.objects.PNone;
5453
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
5554
import com.oracle.graal.python.builtins.objects.method.PMethod;
5655
import com.oracle.graal.python.builtins.objects.str.StringUtils;
5756
import com.oracle.graal.python.builtins.objects.type.TpSlots;
5857
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
58+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
5959
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
60-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
6160
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6261
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
6362
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -83,32 +82,32 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8382
@GenerateUncached
8483
@GenerateNodeFactory
8584
@SuppressWarnings("unused")
86-
public abstract static class GetNode extends PythonTernaryBuiltinNode {
87-
@Specialization(guards = {"!isPNone(instance)"})
85+
public abstract static class GetNode extends DescrGetBuiltinNode {
86+
@Specialization(guards = "!isNoValue(instance)")
8887
static PMethod doMethod(PFunction self, Object instance, Object klass,
8988
@Shared @Cached PythonObjectFactory factory) {
9089
return factory.createMethod(instance, self);
9190
}
9291

93-
@Specialization
94-
static Object doFunction(PFunction self, PNone instance, Object klass) {
92+
@Specialization(guards = "isNoValue(instance)")
93+
static Object doFunction(PFunction self, Object instance, Object klass) {
9594
return self;
9695
}
9796

98-
@Specialization(guards = {"!isPNone(instance)", "!self.needsDeclaringType()"})
97+
@Specialization(guards = {"!isNoValue(instance)", "!self.needsDeclaringType()"})
9998
static PBuiltinMethod doBuiltinMethod(PBuiltinFunction self, Object instance, Object klass,
10099
@Shared @Cached PythonObjectFactory factory) {
101100
return factory.createBuiltinMethod(instance, self);
102101
}
103102

104-
@Specialization(guards = {"!isPNone(instance)", "self.needsDeclaringType()"})
103+
@Specialization(guards = {"!isNoValue(instance)", "self.needsDeclaringType()"})
105104
static PBuiltinMethod doBuiltinMethodWithDeclaringClass(PBuiltinFunction self, Object instance, Object klass,
106105
@Shared @Cached PythonObjectFactory factory) {
107106
return factory.createBuiltinMethod(instance, self, self.getEnclosingType());
108107
}
109108

110-
@Specialization
111-
static Object doBuiltinFunction(PBuiltinFunction self, PNone instance, Object klass) {
109+
@Specialization(guards = "isNoValue(instance)")
110+
static Object doBuiltinFunction(PBuiltinFunction self, Object instance, Object klass) {
112111
return self;
113112
}
114113
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/WrapperDescriptorBuiltins.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,13 @@
5050
import com.oracle.graal.python.builtins.CoreFunctions;
5151
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5252
import com.oracle.graal.python.builtins.PythonBuiltins;
53-
import com.oracle.graal.python.builtins.objects.PNone;
5453
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
5554
import com.oracle.graal.python.builtins.objects.method.PMethod;
5655
import com.oracle.graal.python.builtins.objects.str.StringUtils;
5756
import com.oracle.graal.python.builtins.objects.type.TpSlots;
5857
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
58+
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
5959
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
60-
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
6160
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6261
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
6362
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -83,26 +82,26 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8382
@GenerateUncached
8483
@GenerateNodeFactory
8584
@SuppressWarnings("unused")
86-
public abstract static class GetNode extends PythonTernaryBuiltinNode {
87-
@Specialization(guards = {"!isPNone(instance)"})
85+
public abstract static class GetNode extends DescrGetBuiltinNode {
86+
@Specialization(guards = {"!isNoValue(instance)"})
8887
static PMethod doMethod(PFunction self, Object instance, Object klass,
8988
@Shared @Cached PythonObjectFactory factory) {
9089
return factory.createMethod(PythonBuiltinClassType.MethodWrapper, instance, self);
9190
}
9291

93-
@Specialization
94-
static Object doFunction(PFunction self, PNone instance, Object klass) {
92+
@Specialization(guards = "isNoValue(instance)")
93+
static Object doFunction(PFunction self, Object instance, Object klass) {
9594
return self;
9695
}
9796

98-
@Specialization(guards = {"!isPNone(instance)"})
97+
@Specialization(guards = {"!isNoValue(instance)"})
9998
static PBuiltinMethod doBuiltinMethod(PBuiltinFunction self, Object instance, Object klass,
10099
@Shared @Cached PythonObjectFactory factory) {
101100
return factory.createBuiltinMethod(PythonBuiltinClassType.MethodWrapper, instance, self);
102101
}
103102

104-
@Specialization
105-
static Object doBuiltinFunction(PBuiltinFunction self, PNone instance, Object klass) {
103+
@Specialization(guards = "isNoValue(instance)")
104+
static Object doBuiltinFunction(PBuiltinFunction self, Object instance, Object klass) {
106105
return self;
107106
}
108107
}

0 commit comments

Comments
 (0)