Skip to content

Commit 2f00ef3

Browse files
committed
use a singleContextAssumption to cache class objects in GetClassNode
1 parent 5b23bc9 commit 2f00ef3

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.oracle.graal.python.runtime.PythonOptions;
5454
import com.oracle.graal.python.runtime.PythonParser.ParserMode;
5555
import com.oracle.graal.python.runtime.exception.PException;
56+
import com.oracle.truffle.api.Assumption;
5657
import com.oracle.truffle.api.CallTarget;
5758
import com.oracle.truffle.api.CompilerAsserts;
5859
import com.oracle.truffle.api.CompilerDirectives;
@@ -89,6 +90,8 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
8990
public static final String MIME_TYPE = "text/x-python";
9091
public static final String EXTENSION = ".py";
9192

93+
public static Assumption singleContextAssumption = Truffle.getRuntime().createAssumption("Only a single context is active");
94+
9295
@CompilationFinal private boolean nativeBuildTime = TruffleOptions.AOT;
9396
private final NodeFactory nodeFactory;
9497

@@ -394,4 +397,10 @@ private static Source newSource(PythonContext ctxt, SourceBuilder srcBuilder, St
394397
public boolean isNativeBuildTime() {
395398
return nativeBuildTime;
396399
}
400+
401+
@Override
402+
protected void initializeMultipleContexts() {
403+
super.initializeMultipleContexts();
404+
singleContextAssumption.invalidate();
405+
}
397406
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PBaseNode.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.oracle.graal.python.runtime.exception.PException;
5050
import com.oracle.graal.python.runtime.exception.PythonErrorType;
5151
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
52+
import com.oracle.truffle.api.Assumption;
5253
import com.oracle.truffle.api.CompilerDirectives;
5354
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
5455
import com.oracle.truffle.api.TruffleLanguage.ContextReference;
@@ -101,4 +102,8 @@ public final PythonContext getContext() {
101102
}
102103
return contextRef.get();
103104
}
105+
106+
protected Assumption singleContextAssumption() {
107+
return PythonLanguage.singleContextAssumption;
108+
}
104109
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ public static GetClassNode create() {
7474

7575
public abstract PythonClass execute(Object object);
7676

77+
@Specialization(assumptions = "singleContextAssumption()")
78+
protected PythonClass getIt(@SuppressWarnings("unused") GetSetDescriptor object,
79+
@Cached("getIt(object)") PythonClass klass) {
80+
return klass;
81+
}
82+
7783
@Specialization
7884
protected PythonClass getIt(@SuppressWarnings("unused") GetSetDescriptor object) {
7985
return getCore().lookupType(PythonBuiltinClassType.GetSetDescriptor);
@@ -85,47 +91,95 @@ protected PythonClass getIt(PythonObject object,
8591
return profile.profile(object.getPythonClass());
8692
}
8793

94+
@Specialization(assumptions = "singleContextAssumption()")
95+
protected PythonClass getIt(@SuppressWarnings("unused") PNone object,
96+
@Cached("getIt(object)") PythonClass klass) {
97+
return klass;
98+
}
99+
88100
@Specialization
89101
protected PythonClass getIt(@SuppressWarnings("unused") PNone object) {
90102
return getCore().lookupType(PythonBuiltinClassType.PNone);
91103
}
92104

105+
@Specialization(assumptions = "singleContextAssumption()")
106+
protected PythonClass getIt(@SuppressWarnings("unused") PNotImplemented object,
107+
@Cached("getIt(object)") PythonClass klass) {
108+
return klass;
109+
}
110+
93111
@SuppressWarnings("unused")
94112
@Specialization
95113
protected PythonClass getIt(PNotImplemented object) {
96114
return getCore().lookupType(PythonBuiltinClassType.PNotImplemented);
97115
}
98116

117+
@Specialization(assumptions = "singleContextAssumption()")
118+
protected PythonClass getIt(@SuppressWarnings("unused") PEllipsis object,
119+
@Cached("getIt(object)") PythonClass klass) {
120+
return klass;
121+
}
122+
99123
@SuppressWarnings("unused")
100124
@Specialization
101125
protected PythonClass getIt(PEllipsis object) {
102126
return getCore().lookupType(PythonBuiltinClassType.PEllipsis);
103127
}
104128

129+
@Specialization(assumptions = "singleContextAssumption()")
130+
protected PythonClass getIt(@SuppressWarnings("unused") boolean object,
131+
@Cached("getIt(object)") PythonClass klass) {
132+
return klass;
133+
}
134+
105135
@SuppressWarnings("unused")
106136
@Specialization
107137
protected PythonClass getIt(boolean object) {
108138
return getCore().lookupType(PythonBuiltinClassType.Boolean);
109139
}
110140

141+
@Specialization(assumptions = "singleContextAssumption()")
142+
protected PythonClass getIt(@SuppressWarnings("unused") int object,
143+
@Cached("getIt(object)") PythonClass klass) {
144+
return klass;
145+
}
146+
111147
@SuppressWarnings("unused")
112148
@Specialization
113149
protected PythonClass getIt(int object) {
114150
return getCore().lookupType(PythonBuiltinClassType.PInt);
115151
}
116152

153+
@Specialization(assumptions = "singleContextAssumption()")
154+
protected PythonClass getIt(@SuppressWarnings("unused") long object,
155+
@Cached("getIt(object)") PythonClass klass) {
156+
return klass;
157+
}
158+
117159
@SuppressWarnings("unused")
118160
@Specialization
119161
protected PythonClass getIt(long object) {
120162
return getCore().lookupType(PythonBuiltinClassType.PInt);
121163
}
122164

165+
@Specialization(assumptions = "singleContextAssumption()")
166+
protected PythonClass getIt(@SuppressWarnings("unused") double object,
167+
@Cached("getIt(object)") PythonClass klass) {
168+
return klass;
169+
}
170+
123171
@SuppressWarnings("unused")
124172
@Specialization
125173
protected PythonClass getIt(double object) {
126174
return getCore().lookupType(PythonBuiltinClassType.PFloat);
127175
}
128176

177+
@Specialization(assumptions = "singleContextAssumption()")
178+
protected PythonClass getIt(@SuppressWarnings("unused") String object,
179+
@Cached("getIt(object)") PythonClass klass) {
180+
return klass;
181+
}
182+
129183
@SuppressWarnings("unused")
130184
@Specialization
131185
protected PythonClass getIt(String object) {
@@ -143,6 +197,12 @@ protected PythonClass getIt(PythonNativeObject object,
143197
return getNativeClassNode.execute(object);
144198
}
145199

200+
@Specialization(guards = "isForeignObject(object)", assumptions = "singleContextAssumption()")
201+
protected PythonClass getIt(@SuppressWarnings("unused") TruffleObject object,
202+
@Cached("getIt(object)") PythonClass klass) {
203+
return klass;
204+
}
205+
146206
@SuppressWarnings("unused")
147207
@Specialization(guards = "isForeignObject(object)")
148208
protected PythonClass getIt(TruffleObject object) {

0 commit comments

Comments
 (0)