Skip to content

Commit 122ad01

Browse files
committed
[GR-10771] Handle final locations in ReadAttributeFromObjectNode.
PullRequest: graalpython/108
2 parents 425f9cf + d8e42a9 commit 122ad01

File tree

8 files changed

+106
-48
lines changed

8 files changed

+106
-48
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/grammar/TestParserTranslator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,13 @@ public void parsePropertyAccess() {
257257

258258
@Test
259259
public void parseSubscript() {
260-
getChild(parseAs("foobar[1]", GetItemNode.class), 1, ReadGlobalOrBuiltinNode.class);
260+
GetItemNode node = parseAs("foobar[1]", GetItemNode.class);
261+
assertInstanceOf(node.getLeftNode(), ReadGlobalOrBuiltinNode.class);
261262
parseAs("foobar[:]", GetItemNode.class);
262263
parseAs("foobar[::]", GetItemNode.class);
263264
parseAs("foobar[1:2:3]", GetItemNode.class);
264265
GetItemNode parseAs = parseAs("foobar[1,2]", GetItemNode.class);
265-
assert parseAs.getSlice() instanceof TupleLiteralNode;
266+
assertInstanceOf(parseAs.getSlice(), TupleLiteralNode.class);
266267
}
267268

268269
@Test

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public abstract class PythonBuiltinObject extends PythonObject {
4343

4444
public PythonBuiltinObject(PythonClass cls) {
4545
super(cls);
46-
assert cls != null : getClass().getSimpleName();
4746
}
4847

4948
private boolean isBuiltin() {

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import com.oracle.graal.python.builtins.objects.type.PythonClass;
4141
import com.oracle.truffle.api.CompilerAsserts;
4242
import com.oracle.truffle.api.CompilerDirectives;
43-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
4443
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4544
import com.oracle.truffle.api.object.DynamicObject;
4645
import com.oracle.truffle.api.object.Location;
@@ -49,23 +48,24 @@
4948

5049
public class PythonObject extends PythonAbstractObject {
5150
protected final PythonClass pythonClass;
52-
@CompilationFinal protected DynamicObject storage;
51+
protected final DynamicObject storage;
5352
private PDict dict;
5453

5554
public PythonObject(PythonClass pythonClass) {
55+
assert pythonClass != null : getClass().getSimpleName();
56+
this.pythonClass = pythonClass;
57+
storage = pythonClass.getInstanceShape().newInstance();
58+
}
59+
60+
public PythonObject(PythonClass pythonClass, Shape instanceShape) {
5661
if (pythonClass == null) {
5762
CompilerDirectives.transferToInterpreter();
5863
// special case for base type class
5964
assert this instanceof PythonBuiltinClass;
6065
this.pythonClass = (PythonClass) this;
6166
} else {
6267
this.pythonClass = pythonClass;
63-
storage = pythonClass.getInstanceShape().newInstance();
6468
}
65-
}
66-
67-
public PythonObject(PythonClass pythonClass, Shape instanceShape) {
68-
this.pythonClass = pythonClass;
6969
storage = instanceShape.newInstance();
7070
}
7171

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public final boolean isBuiltin() {
7373

7474
@TruffleBoundary
7575
public PythonClass(PythonClass typeClass, String name, PythonClass... baseClasses) {
76-
super(typeClass);
76+
super(typeClass, freshShape() /* do not inherit layout from the TypeClass */);
7777
this.className = name;
7878
this.lookupStableAssumption = new CyclicAssumption(className);
7979

@@ -89,8 +89,6 @@ public PythonClass(PythonClass typeClass, String name, PythonClass... baseClasse
8989
// Compute MRO
9090
computeMethodResolutionOrder();
9191

92-
// do not inherit layout from the TypeClass.
93-
storage = freshShape().newInstance();
9492
setAttribute(__NAME__, getBaseName(name));
9593
setAttribute(__QUALNAME__, className);
9694
setAttribute(__DOC__, PNone.NONE);

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

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,70 @@ public static ReadAttributeFromObjectNode create() {
6565

6666
public abstract Object execute(Object object, Object key);
6767

68-
protected Location getLocationOrNull(Property prop) {
68+
protected static Location getLocationOrNull(Property prop) {
6969
return prop == null ? null : prop.getLocation();
7070
}
7171

72+
protected static boolean isNull(Object value) {
73+
return value == null;
74+
}
75+
76+
protected static Object readFinalValue(PythonObject object, Location location) {
77+
Object value = location.get(object.getStorage());
78+
return value == null ? PNone.NO_VALUE : value;
79+
}
80+
81+
/*
82+
* Includes "object" as a parameter so that Truffle DSL sees this as a dynamic check.
83+
*/
84+
protected static boolean checkShape(@SuppressWarnings("unused") PythonObject object, PythonObject cachedObject, Shape cachedShape) {
85+
return cachedObject.getStorage().getShape() == cachedShape;
86+
}
87+
88+
@SuppressWarnings("unused")
89+
@Specialization(limit = "1", //
90+
guards = {
91+
"object == cachedObject",
92+
"checkShape(object, cachedObject, cachedShape)",
93+
"key == cachedKey",
94+
"!isNull(loc)",
95+
"loc.isAssumedFinal()"
96+
}, //
97+
assumptions = {
98+
"layoutAssumption",
99+
"finalAssumption"
100+
})
101+
protected Object readDirectFinal(PythonObject object, Object key,
102+
@Cached("object") PythonObject cachedObject,
103+
@Cached("key") Object cachedKey,
104+
@Cached("object.getStorage().getShape()") Shape cachedShape,
105+
@Cached("cachedShape.getValidAssumption()") Assumption layoutAssumption,
106+
@Cached("getLocationOrNull(cachedShape.getProperty(key))") Location loc,
107+
@Cached("loc.getFinalAssumption()") Assumption finalAssumption,
108+
@Cached("readFinalValue(object, loc)") Object cachedValue) {
109+
assert assertFinal(object, key, cachedValue);
110+
return cachedValue;
111+
}
112+
113+
private static boolean assertFinal(PythonObject object, Object key, Object cachedValue) {
114+
Object other = object.getStorage().get(key) == null ? PNone.NO_VALUE : object.getStorage().get(key);
115+
return cachedValue == other || cachedValue instanceof Number && other instanceof Number && ((Number) cachedValue).doubleValue() == ((Number) other).doubleValue();
116+
}
117+
72118
@SuppressWarnings("unused")
73119
@Specialization(limit = "getIntOption(getContext(), AttributeAccessInlineCacheMaxDepth)", //
74120
guards = {
75121
"object.getStorage().getShape() == cachedShape",
76-
"key == cachedKey"
122+
"key == cachedKey",
123+
"isNull(loc) || !loc.isAssumedFinal()"
77124
}, //
78125
assumptions = "layoutAssumption")
79126
protected Object readDirect(PythonObject object, Object key,
80127
@Cached("key") Object cachedKey,
81128
@Cached("object.getStorage().getShape()") Shape cachedShape,
82129
@Cached("cachedShape.getValidAssumption()") Assumption layoutAssumption,
83-
@Cached("cachedShape.getProperty(key)") Property prop,
84-
@Cached("getLocationOrNull(prop)") Location loc) {
85-
if (prop == null) {
130+
@Cached("getLocationOrNull(cachedShape.getProperty(key))") Location loc) {
131+
if (loc == null) {
86132
return PNone.NO_VALUE;
87133
} else {
88134
return loc.get(object.getStorage());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DestructuringAssignmentNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode;
4242
import com.oracle.graal.python.nodes.builtins.TupleNodes;
4343
import com.oracle.graal.python.nodes.subscript.GetItemNode;
44-
import com.oracle.graal.python.nodes.subscript.GetItemNodeFactory.GetItemNodeGen;
44+
import com.oracle.graal.python.nodes.subscript.GetItemNodeGen;
4545
import com.oracle.graal.python.runtime.exception.PException;
4646
import com.oracle.truffle.api.frame.VirtualFrame;
4747
import com.oracle.truffle.api.nodes.ExplodeLoop;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/subscript/GetItemNode.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,16 @@
4444
import com.oracle.graal.python.nodes.expression.BinaryOpNode;
4545
import com.oracle.graal.python.nodes.frame.ReadNode;
4646
import com.oracle.graal.python.runtime.sequence.SequenceUtil.NormalizeIndexNode;
47+
import com.oracle.truffle.api.CompilerDirectives;
4748
import com.oracle.truffle.api.dsl.Cached;
48-
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
4949
import com.oracle.truffle.api.dsl.Specialization;
5050
import com.oracle.truffle.api.frame.VirtualFrame;
5151
import com.oracle.truffle.api.nodes.NodeInfo;
5252

5353
@NodeInfo(shortName = __GETITEM__)
54-
@GenerateNodeFactory
5554
public abstract class GetItemNode extends BinaryOpNode implements ReadNode {
5655

57-
@Child private NormalizeIndexNode normalize = NormalizeIndexNode.create();
56+
@Child private NormalizeIndexNode normalize;
5857

5958
public abstract Object execute(Object primary, Object slice);
6059

@@ -69,11 +68,19 @@ public PNode getSlice() {
6968
public abstract Object execute(VirtualFrame frame, Object primary, Object slice);
7069

7170
public static GetItemNode create() {
72-
return GetItemNodeFactory.create(null, null);
71+
return GetItemNodeGen.create(null, null);
7372
}
7473

7574
public static GetItemNode create(PNode primary, PNode slice) {
76-
return GetItemNodeFactory.create(primary, slice);
75+
return GetItemNodeGen.create(primary, slice);
76+
}
77+
78+
private NormalizeIndexNode ensureNormalize() {
79+
if (normalize == null) {
80+
CompilerDirectives.transferToInterpreterAndInvalidate();
81+
normalize = insert(NormalizeIndexNode.create());
82+
}
83+
return normalize;
7784
}
7885

7986
private int toInt(PInt index) {
@@ -87,7 +94,7 @@ private int toInt(PInt index) {
8794

8895
@Override
8996
public PNode makeWriteNode(PNode rhs) {
90-
return SetItemNodeFactory.create(getPrimary(), getSlice(), rhs);
97+
return SetItemNode.create(getPrimary(), getSlice(), rhs);
9198
}
9299

93100
@Specialization
@@ -145,7 +152,7 @@ public String doString(String primary, PInt idx) {
145152

146153
@Specialization
147154
public Object doPBytes(PBytes primary, int idx) {
148-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
155+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
149156
}
150157

151158
@Specialization
@@ -155,7 +162,7 @@ public Object doPBytes(PBytes bytes, PInt idx) {
155162

156163
@Specialization
157164
public Object doPByteArray(PByteArray primary, int idx) {
158-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
165+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
159166
}
160167

161168
@Specialization
@@ -165,62 +172,62 @@ public Object doPByteArray(PByteArray bytearray, PInt idx) {
165172

166173
@Specialization
167174
public Object doPRange(PRange primary, int idx) {
168-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
175+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
169176
}
170177

171178
@Specialization
172179
public Object doPRange(PRange primary, long idx) {
173-
return primary.getItemNormalized(normalize.forRange(idx, primary.len()));
180+
return primary.getItemNormalized(ensureNormalize().forRange(idx, primary.len()));
174181
}
175182

176183
@Specialization
177184
public int doPIntArray(PIntArray primary, int idx) {
178-
return primary.getIntItemNormalized(normalize.forArray(idx, primary.len()));
185+
return primary.getIntItemNormalized(ensureNormalize().forArray(idx, primary.len()));
179186
}
180187

181188
@Specialization
182189
public int doPIntArray(PIntArray primary, long idx) {
183-
return primary.getIntItemNormalized(normalize.forArray(idx, primary.len()));
190+
return primary.getIntItemNormalized(ensureNormalize().forArray(idx, primary.len()));
184191
}
185192

186193
@Specialization
187194
public long doPLongArray(PLongArray primary, int idx) {
188-
return primary.getLongItemNormalized(normalize.forArray(idx, primary.len()));
195+
return primary.getLongItemNormalized(ensureNormalize().forArray(idx, primary.len()));
189196
}
190197

191198
@Specialization
192199
public long doPLongArray(PLongArray primary, long idx) {
193-
return primary.getLongItemNormalized(normalize.forArray(idx, primary.len()));
200+
return primary.getLongItemNormalized(ensureNormalize().forArray(idx, primary.len()));
194201
}
195202

196203
@Specialization
197204
public double doPDoubleArray(PDoubleArray primary, int idx) {
198-
return primary.getDoubleItemNormalized(normalize.forArray(idx, primary.len()));
205+
return primary.getDoubleItemNormalized(ensureNormalize().forArray(idx, primary.len()));
199206
}
200207

201208
@Specialization
202209
public double doPDoubleArray(PDoubleArray primary, long idx) {
203-
return primary.getDoubleItemNormalized(normalize.forArray(idx, primary.len()));
210+
return primary.getDoubleItemNormalized(ensureNormalize().forArray(idx, primary.len()));
204211
}
205212

206213
@Specialization
207214
public char doPCharArray(PCharArray primary, int idx) {
208-
return primary.getCharItemNormalized(normalize.forArray(idx, primary.len()));
215+
return primary.getCharItemNormalized(ensureNormalize().forArray(idx, primary.len()));
209216
}
210217

211218
@Specialization
212219
public char doPCharArray(PCharArray primary, long idx) {
213-
return primary.getCharItemNormalized(normalize.forArray(idx, primary.len()));
220+
return primary.getCharItemNormalized(ensureNormalize().forArray(idx, primary.len()));
214221
}
215222

216223
@Specialization
217224
public Object doPArray(PArray primary, long idx) {
218-
return primary.getItemNormalized(normalize.forArray(idx, primary.len()));
225+
return primary.getItemNormalized(ensureNormalize().forArray(idx, primary.len()));
219226
}
220227

221228
@Specialization
222229
public Object doPArray(PArray primary, PInt idx) {
223-
return primary.getItemNormalized(normalize.forArray(toInt(idx), primary.len()));
230+
return primary.getItemNormalized(ensureNormalize().forArray(toInt(idx), primary.len()));
224231
}
225232

226233
@Specialization

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/subscript/SetItemNode.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,19 @@
4646
import com.oracle.graal.python.nodes.statement.StatementNode;
4747
import com.oracle.graal.python.runtime.sequence.PSequence;
4848
import com.oracle.graal.python.runtime.sequence.SequenceUtil.NormalizeIndexNode;
49+
import com.oracle.truffle.api.CompilerDirectives;
4950
import com.oracle.truffle.api.dsl.Cached;
50-
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
5151
import com.oracle.truffle.api.dsl.NodeChild;
5252
import com.oracle.truffle.api.dsl.NodeChildren;
5353
import com.oracle.truffle.api.dsl.Specialization;
5454
import com.oracle.truffle.api.frame.VirtualFrame;
5555
import com.oracle.truffle.api.nodes.NodeInfo;
5656

5757
@NodeInfo(shortName = __SETITEM__)
58-
@GenerateNodeFactory
5958
@NodeChildren({@NodeChild(value = "primary", type = PNode.class), @NodeChild(value = "slice", type = PNode.class), @NodeChild(value = "right", type = PNode.class)})
6059
public abstract class SetItemNode extends StatementNode implements WriteNode {
6160

62-
@Child private NormalizeIndexNode normalize = NormalizeIndexNode.create();
61+
@Child private NormalizeIndexNode normalize;
6362

6463
public abstract PNode getPrimary();
6564

@@ -68,18 +67,26 @@ public abstract class SetItemNode extends StatementNode implements WriteNode {
6867
public abstract PNode getRight();
6968

7069
public static SetItemNode create(PNode primary, PNode slice, PNode right) {
71-
return SetItemNodeFactory.create(primary, slice, right);
70+
return SetItemNodeGen.create(primary, slice, right);
7271
}
7372

7473
public static SetItemNode create() {
75-
return SetItemNodeFactory.create(null, null, null);
74+
return SetItemNodeGen.create(null, null, null);
7675
}
7776

7877
@Override
7978
public PNode getRhs() {
8079
return getRight();
8180
}
8281

82+
private NormalizeIndexNode ensureNormalize() {
83+
if (normalize == null) {
84+
CompilerDirectives.transferToInterpreterAndInvalidate();
85+
normalize = insert(NormalizeIndexNode.create());
86+
}
87+
return normalize;
88+
}
89+
8390
private int toInt(PInt index) {
8491
try {
8592
return index.intValueExact();
@@ -142,7 +149,7 @@ public Object doPArray(PArray primary, PSlice slice, PArray value) {
142149

143150
@Specialization
144151
public Object doPByteArray1(PByteArray primary, int index, Object value) {
145-
primary.setItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
152+
primary.setItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
146153
return PNone.NONE;
147154
}
148155

@@ -156,19 +163,19 @@ public Object doPByteArray(PByteArray primary, PInt index, Object value) {
156163
*/
157164
@Specialization
158165
public Object doPArrayInt(PIntArray primary, int index, int value) {
159-
primary.setIntItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
166+
primary.setIntItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
160167
return PNone.NONE;
161168
}
162169

163170
@Specialization
164171
public Object doPArrayDouble(PDoubleArray primary, int index, double value) {
165-
primary.setDoubleItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
172+
primary.setDoubleItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
166173
return PNone.NONE;
167174
}
168175

169176
@Specialization
170177
public Object doPArrayChar(PCharArray primary, int index, char value) {
171-
primary.setCharItemNormalized(normalize.forArrayAssign(index, primary.len()), value);
178+
primary.setCharItemNormalized(ensureNormalize().forArrayAssign(index, primary.len()), value);
172179
return PNone.NONE;
173180
}
174181

0 commit comments

Comments
 (0)