Skip to content

Commit c786f6c

Browse files
committed
cache call targets for builtin functions per language, so they are shared across shared contexts and we can have a better invoke cache
1 parent c471b16 commit c786f6c

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.net.URL;
3030
import java.text.MessageFormat;
3131
import java.util.ArrayList;
32+
import java.util.concurrent.ConcurrentHashMap;
3233

3334
import org.graalvm.options.OptionDescriptors;
3435

@@ -46,6 +47,7 @@
4647
import com.oracle.graal.python.nodes.PNode;
4748
import com.oracle.graal.python.nodes.call.InvokeNode;
4849
import com.oracle.graal.python.nodes.control.TopLevelExceptionHandler;
50+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4951
import com.oracle.graal.python.nodes.object.GetClassNode;
5052
import com.oracle.graal.python.nodes.statement.ImportNode;
5153
import com.oracle.graal.python.parser.PythonParserImpl;
@@ -60,6 +62,7 @@
6062
import com.oracle.truffle.api.CompilerDirectives;
6163
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
6264
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
65+
import com.oracle.truffle.api.RootCallTarget;
6366
import com.oracle.truffle.api.Scope;
6467
import com.oracle.truffle.api.Truffle;
6568
import com.oracle.truffle.api.TruffleFile;
@@ -95,6 +98,7 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
9598

9699
@CompilationFinal private boolean nativeBuildTime = TruffleOptions.AOT;
97100
private final NodeFactory nodeFactory;
101+
public final ConcurrentHashMap<Class<? extends PythonBuiltinBaseNode>, RootCallTarget> builtinCallTargetCache = new ConcurrentHashMap<>();
98102

99103
public PythonLanguage() {
100104
this.nodeFactory = NodeFactory.create(this);

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,18 @@ public void initialize(PythonCore core) {
6262
}
6363
initializeEachFactoryWith((factory, builtin) -> {
6464
CoreFunctions annotation = getClass().getAnnotation(CoreFunctions.class);
65-
boolean declaresExplicitSelf = true;
65+
final boolean declaresExplicitSelf;
6666
if (annotation.defineModule().length() > 0 && builtin.constructsClass().length == 0) {
6767
assert !builtin.isGetter();
6868
assert !builtin.isSetter();
6969
assert annotation.extendClasses().length == 0;
7070
// for module functions, explicit self is false by default
7171
declaresExplicitSelf = builtin.declaresExplicitSelf();
72+
} else {
73+
declaresExplicitSelf = true;
7274
}
73-
RootCallTarget callTarget = Truffle.getRuntime().createCallTarget(new BuiltinFunctionRootNode(core.getLanguage(), builtin, factory, declaresExplicitSelf));
75+
RootCallTarget callTarget = core.getLanguage().builtinCallTargetCache.computeIfAbsent(factory.getNodeClass(),
76+
(b) -> Truffle.getRuntime().createCallTarget(new BuiltinFunctionRootNode(core.getLanguage(), builtin, factory, declaresExplicitSelf)));
7477
if (builtin.constructsClass().length > 0) {
7578
PBuiltinFunction newFunc = core.factory().createBuiltinFunction(__NEW__, null, createArity(builtin, declaresExplicitSelf), callTarget);
7679
PythonBuiltinClass builtinClass = createBuiltinClassFor(core, builtin);

0 commit comments

Comments
 (0)