55
55
import com .oracle .graal .python .builtins .objects .cext .PySequenceArrayWrapperMRFactory .WriteArrayItemNodeGen ;
56
56
import com .oracle .graal .python .builtins .objects .common .SequenceNodes ;
57
57
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 ;
58
60
import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .StorageToNativeNode ;
59
61
import com .oracle .graal .python .builtins .objects .list .ListBuiltins ;
60
62
import com .oracle .graal .python .builtins .objects .list .ListBuiltinsFactory ;
86
88
import com .oracle .truffle .api .interop .TruffleObject ;
87
89
import com .oracle .truffle .api .interop .UnsupportedMessageException ;
88
90
import com .oracle .truffle .api .nodes .Node ;
91
+ <<<<<<< 5 cb233f6d9b5e1571b6a3b50f81049fa5f4c3263
89
92
import com .oracle .truffle .api .nodes .UnexpectedResultException ;
93
+ =======
94
+ import com .oracle .truffle .api .profiles .ConditionProfile ;
95
+ >>>>>>> Fix : Correctly do list generalization .
90
96
import com .oracle .truffle .api .profiles .ValueProfile ;
91
97
92
98
@ MessageResolution (receiverType = PySequenceArrayWrapper .class )
@@ -234,36 +240,55 @@ public static ReadArrayItemNode create() {
234
240
@ TypeSystemReference (PythonTypes .class )
235
241
abstract static class WriteArrayItemNode extends Node {
236
242
@ Child private CExtNodes .ToJavaNode toJavaNode ;
243
+ @ Child private LookupAndCallTernaryNode setItemNode ;
237
244
238
245
public abstract Object execute (Object arrayObject , Object idx , Object value );
239
246
240
247
@ 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 );
244
251
return value ;
245
252
}
246
253
247
254
@ 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 );
251
258
return value ;
252
259
}
253
260
254
261
@ 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
+ }
258
270
return value ;
259
271
}
260
272
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 ;
263
284
}
264
285
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" );
267
292
}
268
293
269
294
private CExtNodes .ToJavaNode getToJavaNode () {
@@ -274,6 +299,14 @@ private CExtNodes.ToJavaNode getToJavaNode() {
274
299
return toJavaNode ;
275
300
}
276
301
302
+ private LookupAndCallTernaryNode setItemNode () {
303
+ if (setItemNode == null ) {
304
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
305
+ setItemNode = insert (LookupAndCallTernaryNode .create (__SETITEM__ ));
306
+ }
307
+ return setItemNode ;
308
+ }
309
+
277
310
public static WriteArrayItemNode create () {
278
311
return WriteArrayItemNodeGen .create ();
279
312
}
0 commit comments