Skip to content

Commit d74aeac

Browse files
committed
Cache native type for (builtin) classes.
1 parent 692c42e commit d74aeac

File tree

1 file changed

+50
-3
lines changed

1 file changed

+50
-3
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/PythonObjectNativeWrapperMR.java

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PythonClassNativeWrapper;
6363
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PythonNativeWrapper;
6464
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PythonObjectNativeWrapper;
65+
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.GetSulongTypeNodeGen;
6566
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.PAsPointerNodeGen;
6667
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.ReadNativeMemberNodeGen;
6768
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapperMRFactory.ToPyObjectNodeGen;
@@ -84,6 +85,7 @@
8485
import com.oracle.graal.python.builtins.objects.object.PythonObject;
8586
import com.oracle.graal.python.builtins.objects.slice.PSlice;
8687
import com.oracle.graal.python.builtins.objects.str.PString;
88+
import com.oracle.graal.python.builtins.objects.type.LazyPythonClass;
8789
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
8890
import com.oracle.graal.python.builtins.objects.type.PythonClass;
8991
import com.oracle.graal.python.nodes.PGuards;
@@ -135,11 +137,51 @@ public class PythonObjectNativeWrapperMR {
135137
@SuppressWarnings("unknown-message")
136138
@Resolve(message = "com.oracle.truffle.llvm.spi.GetDynamicType")
137139
abstract static class GetDynamicTypeNode extends Node {
138-
@Child GetClassNode getClass = GetClassNode.create();
139-
@Child AsPythonObjectNode getDelegate = AsPythonObjectNode.create();
140+
@Child private GetLazyClassNode getLazyClassNode = GetLazyClassNode.create();
141+
@Child private GetSulongTypeNode getSulongTypeNode = GetSulongTypeNode.create();
142+
@Child private AsPythonObjectNode getDelegate = AsPythonObjectNode.create();
140143

141144
public Object access(PythonNativeWrapper object) {
142-
PythonClass klass = getClass.execute(getDelegate.execute(object));
145+
return getSulongTypeNode.execute(getLazyClassNode.execute(getDelegate.execute(object)));
146+
}
147+
}
148+
149+
abstract static class GetSulongTypeNode extends PNodeWithContext {
150+
151+
private final ConditionProfile profile = ConditionProfile.createBinaryProfile();
152+
153+
public abstract Object execute(LazyPythonClass clazz);
154+
155+
@Specialization(guards = "clazz == cachedClass", limit = "10")
156+
Object doBuiltinCached(@SuppressWarnings("unused") PythonBuiltinClassType clazz,
157+
@Cached("clazz") @SuppressWarnings("unused") PythonBuiltinClassType cachedClass,
158+
@Cached("getSulongTypeForBuiltinClass(clazz)") Object sulongType) {
159+
return sulongType;
160+
}
161+
162+
@Specialization(replaces = "doBuiltinCached")
163+
Object doBuiltinGeneric(PythonBuiltinClassType clazz) {
164+
return getSulongTypeForBuiltinClass(clazz);
165+
}
166+
167+
@Specialization(assumptions = "singleContextAssumption()", guards = "clazz == cachedClass")
168+
Object doGeneric(@SuppressWarnings("unused") PythonClass clazz,
169+
@Cached("clazz") @SuppressWarnings("unused") PythonClass cachedClass,
170+
@Cached("doGeneric(clazz)") Object sulongType) {
171+
return sulongType;
172+
}
173+
174+
@Specialization
175+
Object doGeneric(PythonClass clazz) {
176+
return getSulongTypeForClass(clazz);
177+
}
178+
179+
protected Object getSulongTypeForBuiltinClass(PythonBuiltinClassType clazz) {
180+
PythonClass pythonClass = getPythonClass(clazz, profile);
181+
return getSulongTypeForClass(pythonClass);
182+
}
183+
184+
private static Object getSulongTypeForClass(PythonClass klass) {
143185
Object sulongType = klass.getSulongType();
144186
if (sulongType == null) {
145187
CompilerDirectives.transferToInterpreter();
@@ -163,6 +205,11 @@ private static Object findBuiltinClass(PythonClass klass) {
163205
}
164206
return sulongType;
165207
}
208+
209+
public static GetSulongTypeNode create() {
210+
return GetSulongTypeNodeGen.create();
211+
}
212+
166213
}
167214

168215
@Resolve(message = "READ")

0 commit comments

Comments
 (0)