Skip to content

Commit af060cc

Browse files
committed
Read/WriteAttributeFromDynamicObjectNode: rely on DynamicObjectLibrary caching
1 parent 7b14abe commit af060cc

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/HiddenPythonKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
/**
4646
* Use instead of {@link HiddenKey} which does comparison based on object identity.
4747
*/
48-
public class HiddenPythonKey {
48+
public final class HiddenPythonKey {
4949
private final String name;
5050

5151
public HiddenPythonKey(String name) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/ObjectAttributeNode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.oracle.graal.python.nodes.util.CannotCastException;
4747
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
4848
import com.oracle.graal.python.runtime.PythonOptions;
49+
import com.oracle.truffle.api.CompilerDirectives;
4950
import com.oracle.truffle.api.dsl.ImportStatic;
5051
import com.oracle.truffle.api.nodes.NodeCost;
5152
import com.oracle.truffle.api.object.HiddenKey;
@@ -58,7 +59,7 @@ protected static Object attrKey(Object key, CastToJavaStringNode castNode) {
5859
try {
5960
return castNode.execute(key);
6061
} catch (CannotCastException e) {
61-
return key;
62+
throw CompilerDirectives.shouldNotReachHere();
6263
}
6364
}
6465

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/ReadAttributeFromDynamicObjectNode.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.truffle.api.library.CachedLibrary;
5656
import com.oracle.truffle.api.object.DynamicObject;
5757
import com.oracle.truffle.api.object.DynamicObjectLibrary;
58+
import com.oracle.truffle.api.object.HiddenKey;
5859
import com.oracle.truffle.api.object.Location;
5960
import com.oracle.truffle.api.object.Shape;
6061

@@ -72,6 +73,8 @@ public static ReadAttributeFromDynamicObjectNode getUncached() {
7273

7374
public abstract Object execute(Object object, Object key);
7475

76+
public abstract Object execute(Object object, HiddenKey key);
77+
7578
protected static Object getAttribute(DynamicObject object, String key) {
7679
return DynamicObjectLibrary.getUncached().getOrDefault(object, key, PNone.NO_VALUE);
7780
}
@@ -101,14 +104,19 @@ protected Object readFinalAttr(DynamicObject dynamicObject, String key,
101104
return value;
102105
}
103106

104-
@Specialization(guards = "key == cachedKey", limit = "getAttributeAccessInlineCacheMaxDepth()", replaces = "readFinalAttr")
105-
protected Object readDirect(DynamicObject dynamicObject, @SuppressWarnings("unused") String key,
106-
@Cached("key") String cachedKey,
107+
@Specialization(limit = "getAttributeAccessInlineCacheMaxDepth()", replaces = "readFinalAttr")
108+
protected Object readDirect(DynamicObject dynamicObject, String key,
109+
@CachedLibrary("dynamicObject") DynamicObjectLibrary dylib) {
110+
return dylib.getOrDefault(dynamicObject, key, PNone.NO_VALUE);
111+
}
112+
113+
@Specialization(guards = "isHiddenKey(key)", limit = "getAttributeAccessInlineCacheMaxDepth()")
114+
protected Object readDirectHidden(DynamicObject dynamicObject, Object key,
107115
@CachedLibrary("dynamicObject") DynamicObjectLibrary dylib) {
108-
return dylib.getOrDefault(dynamicObject, cachedKey, PNone.NO_VALUE);
116+
return dylib.getOrDefault(dynamicObject, key, PNone.NO_VALUE);
109117
}
110118

111-
@Specialization(limit = "getAttributeAccessInlineCacheMaxDepth()", replaces = {"readDirect", "readFinalAttr"})
119+
@Specialization(guards = "!isHiddenKey(key)", replaces = {"readDirect", "readFinalAttr"}, limit = "getAttributeAccessInlineCacheMaxDepth()")
112120
protected Object read(DynamicObject dynamicObject, Object key,
113121
@Cached CastToJavaStringNode castNode,
114122
@CachedLibrary("dynamicObject") DynamicObjectLibrary dylib) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToDynamicObjectNode.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import com.oracle.truffle.api.library.CachedLibrary;
5151
import com.oracle.truffle.api.object.DynamicObject;
5252
import com.oracle.truffle.api.object.DynamicObjectLibrary;
53+
import com.oracle.truffle.api.object.HiddenKey;
5354

5455
@ImportStatic(PythonOptions.class)
5556
@ReportPolymorphism
@@ -58,6 +59,8 @@ public abstract class WriteAttributeToDynamicObjectNode extends ObjectAttributeN
5859

5960
public abstract boolean execute(Object primary, Object key, Object value);
6061

62+
public abstract boolean execute(Object primary, HiddenKey key, Object value);
63+
6164
public abstract boolean execute(Object primary, String key, Object value);
6265

6366
public static WriteAttributeToDynamicObjectNode create() {
@@ -68,17 +71,21 @@ public static WriteAttributeToDynamicObjectNode getUncached() {
6871
return WriteAttributeToDynamicObjectNodeGen.getUncached();
6972
}
7073

71-
@SuppressWarnings("unused")
72-
@Specialization(guards = "key == cachedKey", limit = "getAttributeAccessInlineCacheMaxDepth()")
73-
protected boolean writeDirect(DynamicObject dynamicObject, @SuppressWarnings("unused") String key, Object value,
74-
@Cached("key") String cachedKey,
74+
@Specialization(limit = "getAttributeAccessInlineCacheMaxDepth()")
75+
protected boolean writeDirect(DynamicObject dynamicObject, String key, Object value,
76+
@CachedLibrary("dynamicObject") DynamicObjectLibrary dylib) {
77+
dylib.put(dynamicObject, key, value);
78+
return true;
79+
}
80+
81+
@Specialization(guards = "isHiddenKey(key)", limit = "getAttributeAccessInlineCacheMaxDepth()")
82+
protected boolean writeDirectHidden(DynamicObject dynamicObject, Object key, Object value,
7583
@CachedLibrary("dynamicObject") DynamicObjectLibrary dylib) {
76-
dylib.put(dynamicObject, cachedKey, value);
84+
dylib.put(dynamicObject, key, value);
7785
return true;
7886
}
7987

80-
@SuppressWarnings("unused")
81-
@Specialization(limit = "getAttributeAccessInlineCacheMaxDepth()", replaces = "writeDirect")
88+
@Specialization(guards = "!isHiddenKey(key)", replaces = "writeDirect", limit = "getAttributeAccessInlineCacheMaxDepth()")
8289
protected boolean write(DynamicObject dynamicObject, Object key, Object value,
8390
@Cached CastToJavaStringNode castNode,
8491
@CachedLibrary("dynamicObject") DynamicObjectLibrary dylib) {

0 commit comments

Comments
 (0)