Skip to content

Commit 0309773

Browse files
committed
Store BuiltinMethodDescriptor in PBuiltinFunction to make AreSameCallable checks faster
1 parent 323be3b commit 0309773

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,7 @@ public final <T extends NodeFactory<? extends PythonBuiltinBaseNode>> boolean is
177177
}
178178

179179
public final boolean isDescriptorOf(PBuiltinFunction fun) {
180-
assert fun.getEnclosingType() instanceof PythonBuiltinClassType;
181-
return fun.getName().equals(name) && fun.getBuiltinNodeFactory() == getFactory() && fun.getEnclosingType() == type;
180+
return fun.getDescriptor() == this;
182181
}
183182

184183
public final PythonBuiltinClassType getEnclosingType() {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public final class PBuiltinFunction extends PythonBuiltinObject implements Bound
6262
private final RootCallTarget callTarget;
6363
private final Signature signature;
6464
private final int flags;
65+
private BuiltinMethodDescriptor descriptor;
6566
@CompilationFinal(dimensions = 1) private final Object[] defaults;
6667
@CompilationFinal(dimensions = 1) private final PKeyword[] kwDefaults;
6768

@@ -228,4 +229,12 @@ boolean hasExecutableName() {
228229
String getExecutableName() {
229230
return getName();
230231
}
232+
233+
public void setDescriptor(BuiltinMethodDescriptor descriptor) {
234+
this.descriptor = descriptor;
235+
}
236+
237+
public BuiltinMethodDescriptor getDescriptor() {
238+
return descriptor;
239+
}
231240
}

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
141141
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
142142
import com.oracle.truffle.api.dsl.NodeFactory;
143+
import com.oracle.truffle.api.memory.MemoryFence;
143144
import com.oracle.truffle.api.object.DynamicObject;
144145
import com.oracle.truffle.api.object.DynamicObjectLibrary;
145146

@@ -650,9 +651,19 @@ private static void fixupSpecialMethodInSubClasses(java.util.Set<PythonAbstractC
650651

651652
private static Object asSlotValue(SpecialMethodSlot slot, Object value, PythonLanguage language) {
652653
if (value instanceof PBuiltinFunction && slot.allowsBuiltinDescriptors) {
653-
BuiltinMethodDescriptor info = BuiltinMethodDescriptor.get((PBuiltinFunction) value);
654+
PBuiltinFunction builtinFun = (PBuiltinFunction) value;
655+
BuiltinMethodDescriptor info = BuiltinMethodDescriptor.get(builtinFun);
654656
if (info != null) {
655-
language.registerBuiltinDescriptorCallTarget(info, ((PBuiltinFunction) value).getCallTarget());
657+
if (builtinFun.getDescriptor() == null) {
658+
// Note: number of all builtins >> number of builtins used in slots, so it is
659+
// better to do this lazily
660+
language.registerBuiltinDescriptorCallTarget(info, builtinFun.getCallTarget());
661+
// Only make sure that info is fully initialized, otherwise it is fine if it is
662+
// set multiple times from different threads, all of them should set the same
663+
// value
664+
MemoryFence.storeStore();
665+
builtinFun.setDescriptor(info);
666+
}
656667
return info;
657668
}
658669
}

0 commit comments

Comments
 (0)