Skip to content

Commit ee38db2

Browse files
committed
more efficient class lookup in PythonObject
1 parent 04953a8 commit ee38db2

File tree

1 file changed

+13
-5
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object

1 file changed

+13
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.oracle.graal.python.runtime.PythonOptions;
4343
import com.oracle.truffle.api.CompilerAsserts;
4444
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
45+
import com.oracle.truffle.api.dsl.Bind;
4546
import com.oracle.truffle.api.dsl.Cached;
4647
import com.oracle.truffle.api.dsl.Cached.Shared;
4748
import com.oracle.truffle.api.dsl.Specialization;
@@ -92,24 +93,31 @@ public void setLazyPythonClass(Object cls,
9293

9394
@ExportMessage
9495
public static class GetLazyPythonClass {
95-
public static boolean hasInitialClass(PythonObject self, DynamicObjectLibrary dylib) {
96-
return (dylib.getShapeFlags(self) & CLASS_CHANGED_FLAG) == 0;
96+
public static boolean hasInitialClass(Shape shape) {
97+
return (shape.getFlags() & CLASS_CHANGED_FLAG) == 0;
9798
}
9899

99100
public static Object getInitialClass(PythonObject self) {
100101
return self.initialPythonClass;
101102
}
102103

103104
@SuppressWarnings("unused")
104-
@Specialization(guards = {"klass != null", "self.getShape() == cachedShape", "hasInitialClass(self, dylib)"}, limit = "1", assumptions = "singleContextAssumption()")
105+
@Specialization(guards = {"klass != null", "self.getShape() == cachedShape", "hasInitialClass(cachedShape)"}, limit = "1", assumptions = "singleContextAssumption()")
105106
public static Object getConstantClass(PythonObject self,
106-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib,
107107
@Cached("self.getShape()") Shape cachedShape,
108108
@Cached(value = "getInitialClass(self)", weak = true) Object klass) {
109109
return klass;
110110
}
111111

112-
@Specialization(replaces = "getConstantClass")
112+
@SuppressWarnings("unused")
113+
@Specialization(guards = "hasInitialClass(self.getShape())")
114+
public static Object getClass(PythonObject self,
115+
@Bind("getInitialClass(self)") Object klass) {
116+
assert klass != null;
117+
return klass;
118+
}
119+
120+
@Specialization(guards = "!hasInitialClass(self.getShape())", replaces = "getConstantClass")
113121
public static Object getPythonClass(PythonObject self,
114122
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
115123
return dylib.getOrDefault(self, CLASS, self.initialPythonClass);

0 commit comments

Comments
 (0)