@@ -1021,15 +1021,19 @@ protected static SequenceStorage doScalarGeneric(GenNodeSupplier generalizationN
1021
1021
protected static SequenceStorage doSlice (GenNodeSupplier generalizationNodeProvider , SequenceStorage storage , PSlice slice , Object iterable ,
1022
1022
@ Shared ("generalizeProfile" ) @ Cached BranchProfile generalizeProfile ,
1023
1023
@ Cached SetItemSliceNode setItemSliceNode ,
1024
- @ Shared ("doGenNode" ) @ Cached DoGeneralizationNode doGenNode ) {
1024
+ @ Shared ("doGenNode" ) @ Cached DoGeneralizationNode doGenNode ,
1025
+ @ Cached ListNodes .ConstructListNode constructListNode ) {
1025
1026
SliceInfo info = slice .computeIndices (storage .length ());
1027
+ // We need to construct the list eagerly because if a SequenceStoreException occurs, we
1028
+ // must not use iterable again. It could have sice-effects.
1029
+ PList values = constructListNode .execute (iterable );
1026
1030
try {
1027
- setItemSliceNode .execute (storage , info , iterable );
1031
+ setItemSliceNode .execute (storage , info , values );
1028
1032
return storage ;
1029
1033
} catch (SequenceStoreException e ) {
1030
1034
generalizeProfile .enter ();
1031
1035
SequenceStorage generalized = doGenNode .execute (generalizationNodeProvider , storage , e .getIndicationValue ());
1032
- setItemSliceNode .execute (generalized , info , iterable );
1036
+ setItemSliceNode .execute (generalized , info , values );
1033
1037
return generalized ;
1034
1038
}
1035
1039
}
@@ -1158,15 +1162,20 @@ protected SequenceStorage doScalarGeneric(SequenceStorage storage, Object idx, O
1158
1162
@ Specialization
1159
1163
protected SequenceStorage doSlice (SequenceStorage storage , PSlice slice , Object iterable ,
1160
1164
@ Shared ("generalizeProfile" ) @ Cached BranchProfile generalizeProfile ,
1161
- @ Cached SetItemSliceNode setItemSliceNode ) {
1165
+ @ Cached SetItemSliceNode setItemSliceNode ,
1166
+ @ Cached ListNodes .ConstructListNode constructListNode ) {
1162
1167
SliceInfo info = slice .computeIndices (storage .length ());
1168
+
1169
+ // We need to construct the list eagerly because if a SequenceStoreException occurs, we
1170
+ // must not use iterable again. It could have sice-effects.
1171
+ PList values = constructListNode .execute (iterable );
1163
1172
try {
1164
- setItemSliceNode .execute (storage , info , iterable );
1173
+ setItemSliceNode .execute (storage , info , values );
1165
1174
return storage ;
1166
1175
} catch (SequenceStoreException e ) {
1167
1176
generalizeProfile .enter ();
1168
1177
SequenceStorage generalized = generalizeStore (storage , e .getIndicationValue ());
1169
- setItemSliceNode .execute (generalized , info , iterable );
1178
+ setItemSliceNode .execute (generalized , info , values );
1170
1179
return generalized ;
1171
1180
}
1172
1181
}
0 commit comments