Skip to content

Commit 5542114

Browse files
committed
Fix: Correctly do list generalization.
1 parent 94efaf8 commit 5542114

File tree

1 file changed

+46
-13
lines changed

1 file changed

+46
-13
lines changed

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

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import com.oracle.graal.python.builtins.objects.cext.PySequenceArrayWrapperMRFactory.WriteArrayItemNodeGen;
5656
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
5757
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
58+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode;
59+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.NormalizeIndexNode;
5860
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.StorageToNativeNode;
5961
import com.oracle.graal.python.builtins.objects.list.ListBuiltins;
6062
import com.oracle.graal.python.builtins.objects.list.ListBuiltinsFactory;
@@ -86,7 +88,11 @@
8688
import com.oracle.truffle.api.interop.TruffleObject;
8789
import com.oracle.truffle.api.interop.UnsupportedMessageException;
8890
import com.oracle.truffle.api.nodes.Node;
91+
<<<<<<< 5cb233f6d9b5e1571b6a3b50f81049fa5f4c3263
8992
import com.oracle.truffle.api.nodes.UnexpectedResultException;
93+
=======
94+
import com.oracle.truffle.api.profiles.ConditionProfile;
95+
>>>>>>> Fix: Correctly do list generalization.
9096
import com.oracle.truffle.api.profiles.ValueProfile;
9197

9298
@MessageResolution(receiverType = PySequenceArrayWrapper.class)
@@ -234,36 +240,55 @@ public static ReadArrayItemNode create() {
234240
@TypeSystemReference(PythonTypes.class)
235241
abstract static class WriteArrayItemNode extends Node {
236242
@Child private CExtNodes.ToJavaNode toJavaNode;
243+
@Child private LookupAndCallTernaryNode setItemNode;
237244

238245
public abstract Object execute(Object arrayObject, Object idx, Object value);
239246

240247
@Specialization
241-
Object doTuple(PBytes s, long idx, byte value,
242-
@Cached("createStorageSetItem()") SequenceStorageNodes.SetItemNode setItemNode) {
243-
setItemNode.executeLong(s.getSequenceStorage(), idx, value);
248+
Object doBytes(PBytes s, long idx, byte value,
249+
@Cached("createSetItem()") SequenceStorageNodes.SetItemNode setBytesItemNode) {
250+
setBytesItemNode.executeLong(s.getSequenceStorage(), idx, value);
244251
return value;
245252
}
246253

247254
@Specialization
248-
Object doTuple(PSequence s, long idx, Object value,
249-
@Cached("createStorageSetItem()") SequenceStorageNodes.SetItemNode setItemNode) {
250-
setItemNode.execute(s.getSequenceStorage(), idx, getToJavaNode().execute(value));
255+
Object doByteArray(PByteArray s, long idx, byte value,
256+
@Cached("createSetItem()") SequenceStorageNodes.SetItemNode setByteArrayItemNode) {
257+
setByteArrayItemNode.executeLong(s.getSequenceStorage(), idx, value);
251258
return value;
252259
}
253260

254261
@Specialization
255-
Object doGeneric(Object tuple, Object idx, Object value,
256-
@Cached("createSetItem()") LookupAndCallTernaryNode setItemNode) {
257-
setItemNode.execute(tuple, idx, value);
262+
Object doList(PList s, long idx, Object value,
263+
@Cached("createSetListItem()") SequenceStorageNodes.SetItemNode setListItemNode,
264+
@Cached("createBinaryProfile()") ConditionProfile updateStorageProfile) {
265+
SequenceStorage storage = s.getSequenceStorage();
266+
SequenceStorage updatedStorage = setListItemNode.executeLong(storage, idx, getToJavaNode().execute(value));
267+
if (updateStorageProfile.profile(storage != updatedStorage)) {
268+
s.setSequenceStorage(updatedStorage);
269+
}
258270
return value;
259271
}
260272

261-
protected static SequenceStorageNodes.SetItemNode createStorageSetItem() {
262-
return SequenceStorageNodes.SetItemNode.create("invalid item for assignment");
273+
@Specialization
274+
Object doTuple(PTuple s, long idx, Object value,
275+
@Cached("createSetItem()") SequenceStorageNodes.SetItemNode setListItemNode) {
276+
setListItemNode.executeLong(s.getSequenceStorage(), idx, getToJavaNode().execute(value));
277+
return value;
278+
}
279+
280+
@Fallback
281+
Object doGeneric(Object sequence, Object idx, Object value) {
282+
setItemNode().execute(sequence, idx, getToJavaNode().execute(value));
283+
return value;
263284
}
264285

265-
protected static LookupAndCallTernaryNode createSetItem() {
266-
return LookupAndCallTernaryNode.create(__SETITEM__);
286+
protected static SequenceStorageNodes.SetItemNode createSetListItem() {
287+
return SequenceStorageNodes.SetItemNode.create(NormalizeIndexNode.forArrayAssign(), () -> ListGeneralizationNode.create());
288+
}
289+
290+
protected static SequenceStorageNodes.SetItemNode createSetItem() {
291+
return SequenceStorageNodes.SetItemNode.create("invalid item for assignment");
267292
}
268293

269294
private CExtNodes.ToJavaNode getToJavaNode() {
@@ -274,6 +299,14 @@ private CExtNodes.ToJavaNode getToJavaNode() {
274299
return toJavaNode;
275300
}
276301

302+
private LookupAndCallTernaryNode setItemNode() {
303+
if (setItemNode == null) {
304+
CompilerDirectives.transferToInterpreterAndInvalidate();
305+
setItemNode = insert(LookupAndCallTernaryNode.create(__SETITEM__));
306+
}
307+
return setItemNode;
308+
}
309+
277310
public static WriteArrayItemNode create() {
278311
return WriteArrayItemNodeGen.create();
279312
}

0 commit comments

Comments
 (0)