Skip to content

Commit 65d39e5

Browse files
committed
only readable members should be iterated in a for loop
1 parent c7fe452 commit 65d39e5

File tree

1 file changed

+19
-7
lines changed
  • com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control

1 file changed

+19
-7
lines changed

com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)