@@ -239,7 +239,7 @@ private static RNode createPositionLoad(String positionName, String rangeName) {
239239 return builder .call (RSyntaxNode .INTERNAL , access , receiver , position ).asRNode ();
240240 }
241241
242- protected abstract void writePosition (VirtualFrame frame , int index );
242+ protected abstract boolean writePosition (VirtualFrame frame , int index );
243243
244244 @ Override
245245 public boolean executeRepeating (VirtualFrame frame ) {
@@ -253,9 +253,10 @@ public boolean executeRepeating(VirtualFrame frame) {
253253 }
254254 try {
255255 if (conditionProfile .profile (index <= length )) {
256- writePosition (frame , index );
257- writeElementNode .voidExecute (frame );
258- body .voidExecute (frame );
256+ if (writePosition (frame , index )) {
257+ writeElementNode .voidExecute (frame );
258+ body .voidExecute (frame );
259+ }
259260 return true ;
260261 } else {
261262 return false ;
@@ -285,33 +286,44 @@ private static final class ForIndexRepeatingNode extends AbstractIndexRepeatingN
285286 }
286287
287288 @ Override
288- protected void writePosition (VirtualFrame frame , int index ) {
289+ protected boolean writePosition (VirtualFrame frame , int index ) {
289290 // index already used as position
291+ return true ;
290292 }
291293
292294 }
293295
294296 private static final class ForMembersRepeatingNode extends AbstractIndexRepeatingNode {
295297
296298 @ Child private LocalReadVariableNode readMembersNode ;
299+ @ Child private LocalReadVariableNode readRangeNode ;
297300 @ Child private WriteVariableNode writePositionNode ;
298301 @ Child private InteropLibrary membersInterop ;
302+ @ Child private InteropLibrary rangeInterop ;
299303
300304 ForMembersRepeatingNode (ForNode forNode , String var , RNode body , String indexName , String positionName , String lengthName , String rangeName , String membersName ) {
301305 super (forNode , var , body , indexName , positionName , lengthName , rangeName );
302306
303307 this .writePositionNode = WriteVariableNode .createAnonymous (positionName , Mode .REGULAR , null );
304308 this .readMembersNode = LocalReadVariableNode .create (membersName , true );
309+ this .readRangeNode = LocalReadVariableNode .create (rangeName , true );
305310 this .membersInterop = InteropLibrary .getFactory ().createDispatched (DSLConfig .getInteropLibraryCacheSize ());
311+ this .rangeInterop = InteropLibrary .getFactory ().createDispatched (1 );
306312 }
307313
308314 @ Override
309- protected void writePosition (VirtualFrame frame , int index ) {
315+ protected boolean writePosition (VirtualFrame frame , int index ) {
310316 try {
311317 Object members = readMembersNode .execute (frame );
312318 assert members != null ;
319+ Object range = readRangeNode .execute (frame );
313320 Object position = membersInterop .readArrayElement (members , index - 1 );
314- writePositionNode .execute (frame , position );
321+ if (rangeInterop .isMemberReadable (range , (String ) position )) {
322+ writePositionNode .execute (frame , position );
323+ return true ;
324+ } else {
325+ return false ;
326+ }
315327 } catch (UnsupportedMessageException | InvalidArrayIndexException ex ) {
316328 throw RInternalError .shouldNotReachHere (ex , "could not read foreign member: " + (index - 1 ));
317329 }
0 commit comments