Skip to content

Commit 6ce1e36

Browse files
committed
Improve function object creation for fast path.
1 parent 6eefbd8 commit 6ce1e36

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ public class PFunction extends PythonObject {
5050
private static final Object[] EMPTY_DEFAULTS = new Object[0];
5151
private final String name;
5252
private final String enclosingClassName;
53-
private final Assumption codeStableAssumption = Truffle.getRuntime().createAssumption();
54-
private final Assumption defaultsStableAssumption = Truffle.getRuntime().createAssumption();
53+
private final Assumption codeStableAssumption;
54+
private final Assumption defaultsStableAssumption;
5555
private final PythonObject globals;
5656
private final PCell[] closure;
5757
private final boolean isStatic;
@@ -65,11 +65,11 @@ public PFunction(LazyPythonClass clazz, String name, String enclosingClassName,
6565

6666
public PFunction(LazyPythonClass clazz, String name, String enclosingClassName, RootCallTarget callTarget, PythonObject globals, Object[] defaultValues, PKeyword[] kwDefaultValues,
6767
PCell[] closure) {
68-
this(clazz, name, enclosingClassName, callTarget, globals, defaultValues, kwDefaultValues, closure, null);
68+
this(clazz, name, enclosingClassName, callTarget, globals, defaultValues, kwDefaultValues, closure, null, Truffle.getRuntime().createAssumption(), Truffle.getRuntime().createAssumption());
6969
}
7070

7171
public PFunction(LazyPythonClass clazz, String name, String enclosingClassName, RootCallTarget callTarget, PythonObject globals, Object[] defaultValues, PKeyword[] kwDefaultValues,
72-
PCell[] closure, WriteAttributeToDynamicObjectNode writeAttrNode) {
72+
PCell[] closure, WriteAttributeToDynamicObjectNode writeAttrNode, Assumption codeStableAssumption, Assumption defaultsStableAssumption) {
7373
super(clazz);
7474
this.name = name;
7575
this.code = new PCode(PythonBuiltinClassType.PCode, callTarget);
@@ -79,6 +79,8 @@ public PFunction(LazyPythonClass clazz, String name, String enclosingClassName,
7979
this.defaultValues = defaultValues == null ? EMPTY_DEFAULTS : defaultValues;
8080
this.kwDefaultValues = kwDefaultValues == null ? PKeyword.EMPTY_KEYWORDS : kwDefaultValues;
8181
this.closure = closure;
82+
this.codeStableAssumption = codeStableAssumption;
83+
this.defaultsStableAssumption = defaultsStableAssumption;
8284
addDefaultConstants(writeAttrNode, getStorage(), name, enclosingClassName);
8385
}
8486

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/FunctionDefinitionNode.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@
3838
import com.oracle.graal.python.parser.ExecutionCellSlots;
3939
import com.oracle.graal.python.runtime.PythonContext;
4040
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
41+
import com.oracle.truffle.api.Assumption;
42+
import com.oracle.truffle.api.CompilerDirectives;
4143
import com.oracle.truffle.api.RootCallTarget;
44+
import com.oracle.truffle.api.Truffle;
4245
import com.oracle.truffle.api.TruffleLanguage.ContextReference;
4346
import com.oracle.truffle.api.frame.VirtualFrame;
4447
import com.oracle.truffle.api.nodes.ExplodeLoop;
@@ -57,6 +60,9 @@ public class FunctionDefinitionNode extends ExpressionDefinitionNode {
5760
@Child private WriteAttributeToDynamicObjectNode writeNameNode = WriteAttributeToDynamicObjectNode.create();
5861
@Child private PythonObjectFactory factory = PythonObjectFactory.create();
5962

63+
private final Assumption sharedCodeStableAssumption = Truffle.getRuntime().createAssumption("shared code stable assumption");
64+
private final Assumption sharedDefaultsStableAssumption = Truffle.getRuntime().createAssumption("shared defaults stable assumption");
65+
6066
public FunctionDefinitionNode(String functionName, String enclosingClassName, ExpressionNode doc, ExpressionNode[] defaults, KwDefaultExpressionNode[] kwDefaults,
6167
RootCallTarget callTarget,
6268
DefinitionCellSlots definitionCellSlots, ExecutionCellSlots executionCellSlots) {
@@ -94,7 +100,26 @@ public Object execute(VirtualFrame frame) {
94100
Object[] defaultValues = computeDefaultValues(frame);
95101
PKeyword[] kwDefaultValues = computeKwDefaultValues(frame);
96102
PCell[] closure = getClosureFromGeneratorOrFunctionLocals(frame);
97-
return withDocString(frame, factory().createFunction(functionName, enclosingClassName, callTarget, PArguments.getGlobals(frame), defaultValues, kwDefaultValues, closure, writeNameNode));
103+
Assumption codeStableAssumption;
104+
Assumption defaultsStableAssumption;
105+
if (CompilerDirectives.inCompiledCode()) {
106+
codeStableAssumption = getSharedCodeStableAssumption();
107+
defaultsStableAssumption = getSharedDefaultsStableAssumption();
108+
} else {
109+
codeStableAssumption = Truffle.getRuntime().createAssumption();
110+
defaultsStableAssumption = Truffle.getRuntime().createAssumption();
111+
}
112+
return withDocString(frame, factory().createFunction(functionName, enclosingClassName, callTarget, PArguments.getGlobals(frame), defaultValues, kwDefaultValues, closure, writeNameNode,
113+
codeStableAssumption, defaultsStableAssumption));
114+
115+
}
116+
117+
private Assumption getSharedDefaultsStableAssumption() {
118+
return sharedDefaultsStableAssumption;
119+
}
120+
121+
private Assumption getSharedCodeStableAssumption() {
122+
return sharedCodeStableAssumption;
98123
}
99124

100125
@ExplodeLoop

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PythonObjectFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage;
124124
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
125125
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorageFactory;
126+
import com.oracle.truffle.api.Assumption;
126127
import com.oracle.truffle.api.RootCallTarget;
127128
import com.oracle.truffle.api.TruffleFile;
128129
import com.oracle.truffle.api.TruffleLanguage.ContextReference;
@@ -365,8 +366,9 @@ public PFunction createFunction(String name, String enclosingClassName, RootCall
365366
}
366367

367368
public PFunction createFunction(String name, String enclosingClassName, RootCallTarget callTarget, PythonObject globals, Object[] defaultValues, PKeyword[] kwDefaultValues,
368-
PCell[] closure, WriteAttributeToDynamicObjectNode writeAttrNode) {
369-
return trace(new PFunction(PythonBuiltinClassType.PFunction, name, enclosingClassName, callTarget, globals, defaultValues, kwDefaultValues, closure, writeAttrNode));
369+
PCell[] closure, WriteAttributeToDynamicObjectNode writeAttrNode, Assumption codeStableAssumption, Assumption defaultsStableAssumption) {
370+
return trace(new PFunction(PythonBuiltinClassType.PFunction, name, enclosingClassName, callTarget, globals, defaultValues, kwDefaultValues, closure, writeAttrNode, codeStableAssumption,
371+
defaultsStableAssumption));
370372
}
371373

372374
public PBuiltinFunction createBuiltinFunction(String name, LazyPythonClass type, int numDefaults, RootCallTarget callTarget) {

0 commit comments

Comments
 (0)