Skip to content

Commit 154c17c

Browse files
committed
Call uncached slot descriptors via call target
1 parent 66c2d7b commit 154c17c

File tree

9 files changed

+60
-267
lines changed

9 files changed

+60
-267
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,4 +857,9 @@ public RootCallTarget createCachedCallTarget(Function<PythonLanguage, RootNode>
857857
public RootCallTarget createCachedCallTarget(Function<PythonLanguage, RootNode> rootNodeFunction, Object... cacheKeys) {
858858
return createCachedCallTarget(rootNodeFunction, Arrays.asList(cacheKeys));
859859
}
860+
861+
@TruffleBoundary
862+
public RootCallTarget getCachedCallTarget(Object... cacheKeys) {
863+
return cachedCallTargets.get(Arrays.asList(cacheKeys));
864+
}
860865
}

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,19 @@ public static BuiltinMethodDescriptor get(PBuiltinFunction function) {
9191
assert enclosing == null;
9292
}
9393

94-
return get(factory, type);
94+
return get(factory, type, function.getName());
9595
}
9696

97-
public static BuiltinMethodDescriptor get(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type) {
97+
public static BuiltinMethodDescriptor get(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type, String name) {
9898
CompilerAsserts.neverPartOfCompilation();
9999
Class<? extends PythonBuiltinBaseNode> nodeClass = factory.getNodeClass();
100100
BuiltinMethodDescriptor result = null;
101101
if (PythonUnaryBuiltinNode.class.isAssignableFrom(nodeClass)) {
102-
result = new UnaryBuiltinInfo(factory, type);
102+
result = new UnaryBuiltinInfo(factory, type, name);
103103
} else if (PythonBinaryBuiltinNode.class.isAssignableFrom(nodeClass)) {
104-
result = new BinaryBuiltinInfo(factory, type);
104+
result = new BinaryBuiltinInfo(factory, type, name);
105105
} else if (PythonTernaryBuiltinNode.class.isAssignableFrom(nodeClass)) {
106-
result = new TernaryBuiltinInfo(factory, type);
106+
result = new TernaryBuiltinInfo(factory, type, name);
107107
}
108108
if (result != null) {
109109
return CACHE.computeIfAbsent(result, x -> x);
@@ -122,16 +122,22 @@ private static boolean needsFrame(NodeFactory<? extends PythonBuiltinBaseNode> f
122122

123123
private final NodeFactory<? extends PythonBuiltinBaseNode> factory;
124124
private final PythonBuiltinClassType type;
125+
private final String name;
125126

126-
private BuiltinMethodDescriptor(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type) {
127+
public BuiltinMethodDescriptor(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type, String name) {
127128
this.factory = factory;
128129
this.type = type;
130+
this.name = name;
129131
}
130132

131133
public final NodeFactory<? extends PythonBuiltinBaseNode> getFactory() {
132134
return factory;
133135
}
134136

137+
public String getName() {
138+
return name;
139+
}
140+
135141
@Override
136142
public boolean equals(Object o) {
137143
if (this == o) {
@@ -153,8 +159,8 @@ public int hashCode() {
153159
// generic class that would parametrize the 'factory' field
154160

155161
public static final class UnaryBuiltinInfo extends BuiltinMethodDescriptor {
156-
public UnaryBuiltinInfo(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type) {
157-
super(factory, type);
162+
public UnaryBuiltinInfo(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type, String name) {
163+
super(factory, type, name);
158164
}
159165

160166
public PythonUnaryBuiltinNode createNode() {
@@ -163,8 +169,8 @@ public PythonUnaryBuiltinNode createNode() {
163169
}
164170

165171
public static final class BinaryBuiltinInfo extends BuiltinMethodDescriptor {
166-
public BinaryBuiltinInfo(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type) {
167-
super(factory, type);
172+
public BinaryBuiltinInfo(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type, String name) {
173+
super(factory, type, name);
168174
}
169175

170176
public PythonBinaryBuiltinNode createNode() {
@@ -173,8 +179,8 @@ public PythonBinaryBuiltinNode createNode() {
173179
}
174180

175181
public static final class TernaryBuiltinInfo extends BuiltinMethodDescriptor {
176-
public TernaryBuiltinInfo(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type) {
177-
super(factory, type);
182+
public TernaryBuiltinInfo(NodeFactory<? extends PythonBuiltinBaseNode> factory, PythonBuiltinClassType type, String name) {
183+
super(factory, type, name);
178184
}
179185

180186
public PythonTernaryBuiltinNode createNode() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetMethod.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
*/
4141
package com.oracle.graal.python.lib;
4242

43+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETATTRIBUTE__;
44+
4345
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4446
import com.oracle.graal.python.builtins.objects.PNone;
4547
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
@@ -75,7 +77,8 @@
7577
@GenerateUncached
7678
@ImportStatic(SpecialMethodSlot.class)
7779
public abstract class PyObjectGetMethod extends Node {
78-
private static final BuiltinMethodDescriptor OBJ_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(ObjectBuiltinsFactory.GetAttributeNodeFactory.getInstance(), PythonBuiltinClassType.PythonObject);
80+
private static final BuiltinMethodDescriptor OBJ_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(ObjectBuiltinsFactory.GetAttributeNodeFactory.getInstance(), PythonBuiltinClassType.PythonObject,
81+
__GETATTRIBUTE__);
7982

8083
public abstract Object execute(Frame frame, Object receiver, String name);
8184

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/GetAttributeNode.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,10 @@ static Assumption singleContextAssumption() {
185185
}
186186

187187
public abstract static class GetFixedAttributeNode extends GetAttributeBaseNode {
188-
private static final BuiltinMethodDescriptor OBJ_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(ObjectBuiltinsFactory.GetAttributeNodeFactory.getInstance(), PythonBuiltinClassType.PythonObject);
188+
private static final BuiltinMethodDescriptor OBJ_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(ObjectBuiltinsFactory.GetAttributeNodeFactory.getInstance(), PythonBuiltinClassType.PythonObject, __GETATTRIBUTE__);
189189
private static final BuiltinMethodDescriptor MODULE_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(ModuleBuiltinsFactory.ModuleGetattritbuteNodeFactory.getInstance(),
190-
PythonBuiltinClassType.PythonModule);
191-
private static final BuiltinMethodDescriptor TYPE_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(TypeBuiltinsFactory.GetattributeNodeFactory.getInstance(), PythonBuiltinClassType.PythonClass);
190+
PythonBuiltinClassType.PythonModule, __GETATTRIBUTE__);
191+
private static final BuiltinMethodDescriptor TYPE_GET_ATTRIBUTE = BuiltinMethodDescriptor.get(TypeBuiltinsFactory.GetattributeNodeFactory.getInstance(), PythonBuiltinClassType.PythonClass, __GETATTRIBUTE__);
192192

193193
private final String key;
194194

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/GenericInvokeNode.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ public Assumption needNotPassFrameAssumption() {
102102
* @param arguments - the complete (runtime + user) frame arguments for the call
103103
*/
104104
public final Object execute(VirtualFrame frame, Object callee, Object[] arguments) {
105-
assert frame != null;
106105
return executeInternal(frame, callee, arguments);
107106
}
108107

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,19 @@
4343
import com.oracle.graal.python.PythonLanguage;
4444
import com.oracle.graal.python.builtins.objects.PNone;
4545
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinInfo;
46+
import com.oracle.graal.python.builtins.objects.function.PArguments;
4647
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4748
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4849
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
4950
import com.oracle.graal.python.nodes.call.CallNode;
51+
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
5052
import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode.BoundDescriptor;
5153
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5254
import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode;
5355
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
54-
import com.oracle.graal.python.runtime.PythonContext;
5556
import com.oracle.truffle.api.RootCallTarget;
5657
import com.oracle.truffle.api.dsl.Cached;
57-
import com.oracle.truffle.api.dsl.CachedContext;
58+
import com.oracle.truffle.api.dsl.CachedLanguage;
5859
import com.oracle.truffle.api.dsl.GenerateUncached;
5960
import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic;
6061
import com.oracle.truffle.api.dsl.Specialization;
@@ -94,9 +95,13 @@ Object callSpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unuse
9495

9596
@Specialization(replaces = "callSpecialMethodSlotInlined")
9697
Object callSpecialMethodSlotCallTarget(VirtualFrame frame, BinaryBuiltinInfo info, Object arg1, Object arg2,
97-
@CachedContext(PythonLanguage.class) PythonContext ctx,
98-
@Cached TruffleBoundaryCallNode.Binary boundaryCallNode) {
99-
return boundaryCallNode.execute(frame, ctx, info, arg1, arg2);
98+
@CachedLanguage PythonLanguage language,
99+
@Cached GenericInvokeNode invokeNode) {
100+
RootCallTarget callTarget = language.getCachedCallTarget(info.getFactory().getNodeClass(), info.getName());
101+
Object[] arguments = PArguments.create(2);
102+
PArguments.setArgument(arguments, 0, arg1);
103+
PArguments.setArgument(arguments, 1, arg2);
104+
return invokeNode.execute(frame, callTarget, arguments);
100105
}
101106

102107
@Specialization(guards = {"func == cachedFunc",

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,18 @@
4242

4343
import com.oracle.graal.python.PythonLanguage;
4444
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinInfo;
45+
import com.oracle.graal.python.builtins.objects.function.PArguments;
4546
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4647
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4748
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
4849
import com.oracle.graal.python.nodes.call.CallNode;
50+
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
4951
import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode.BoundDescriptor;
5052
import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode;
5153
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
52-
import com.oracle.graal.python.runtime.PythonContext;
5354
import com.oracle.truffle.api.RootCallTarget;
5455
import com.oracle.truffle.api.dsl.Cached;
55-
import com.oracle.truffle.api.dsl.CachedContext;
56+
import com.oracle.truffle.api.dsl.CachedLanguage;
5657
import com.oracle.truffle.api.dsl.GenerateUncached;
5758
import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic;
5859
import com.oracle.truffle.api.dsl.Specialization;
@@ -83,9 +84,14 @@ static Object callSpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings
8384

8485
@Specialization(replaces = "callSpecialMethodSlotInlined")
8586
static Object callSpecialMethodSlotCallTarget(VirtualFrame frame, TernaryBuiltinInfo info, Object arg1, Object arg2, Object arg3,
86-
@CachedContext(PythonLanguage.class) PythonContext ctx,
87-
@Cached TruffleBoundaryCallNode.Ternary callNode) {
88-
return callNode.execute(frame, ctx, info, arg1, arg2, arg3);
87+
@CachedLanguage PythonLanguage language,
88+
@Cached GenericInvokeNode invokeNode) {
89+
RootCallTarget callTarget = language.getCachedCallTarget(info.getFactory().getNodeClass(), info.getName());
90+
Object[] arguments = PArguments.create(3);
91+
PArguments.setArgument(arguments, 0, arg1);
92+
PArguments.setArgument(arguments, 1, arg2);
93+
PArguments.setArgument(arguments, 2, arg3);
94+
return invokeNode.execute(frame, callTarget, arguments);
8995
}
9096

9197
@Specialization(guards = {"func == cachedFunc", "builtinNode != null", "!isReverse",

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,19 @@
4343
import com.oracle.graal.python.PythonLanguage;
4444
import com.oracle.graal.python.builtins.objects.PNone;
4545
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinInfo;
46+
import com.oracle.graal.python.builtins.objects.function.PArguments;
4647
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4748
import com.oracle.graal.python.builtins.objects.function.PKeyword;
4849
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
4950
import com.oracle.graal.python.nodes.call.CallNode;
51+
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
5052
import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode.BoundDescriptor;
5153
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5254
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
53-
import com.oracle.graal.python.runtime.PythonContext;
5455
import com.oracle.graal.python.util.PythonUtils;
5556
import com.oracle.truffle.api.RootCallTarget;
5657
import com.oracle.truffle.api.dsl.Cached;
57-
import com.oracle.truffle.api.dsl.CachedContext;
58+
import com.oracle.truffle.api.dsl.CachedLanguage;
5859
import com.oracle.truffle.api.dsl.GenerateUncached;
5960
import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic;
6061
import com.oracle.truffle.api.dsl.Specialization;
@@ -111,9 +112,12 @@ Object callSpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unuse
111112

112113
@Specialization(replaces = "callSpecialMethodSlotInlined")
113114
Object callSpecialMethodSlotCallTarget(VirtualFrame frame, UnaryBuiltinInfo info, Object receiver,
114-
@CachedContext(PythonLanguage.class) PythonContext ctx,
115-
@Cached TruffleBoundaryCallNode.Unary callNode) {
116-
return callNode.execute(frame, ctx, info, receiver);
115+
@CachedLanguage PythonLanguage language,
116+
@Cached GenericInvokeNode invokeNode) {
117+
RootCallTarget callTarget = language.getCachedCallTarget(info.getFactory().getNodeClass(), info.getName());
118+
Object[] arguments = PArguments.create(1);
119+
PArguments.setArgument(arguments, 0, receiver);
120+
return invokeNode.execute(frame, callTarget, arguments);
117121
}
118122

119123
@Specialization(guards = {"func == cachedFunc",

0 commit comments

Comments
 (0)