Skip to content

Commit cb46cc8

Browse files
committed
[truffle] Implement nqp::until
1 parent f8da3a1 commit cb46cc8

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

src/vm/jvm/Truffle.nqp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class QAST::OperationsTruffle {
128128
return $comp.NYI("3 argument $op") if +@operands == 3 && $op ne 'while';
129129

130130
TAST.new($VOID, [
131-
'while',
131+
$op,
132132
$comp.as_truffle(@operands[0], :want($OBJ)).tree,
133133
$comp.as_truffle(@operands[1], :want($VOID)).tree
134134
]);

src/vm/jvm/runtime/org/perl6/nqp/truffle/nodes/control/NQPWhileNode.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,18 @@
1515
public final class NQPWhileNode extends NQPNode {
1616
@Child private LoopNode whileNode;
1717

18+
public NQPWhileNode(boolean isUntil, NQPNode condNode, NQPNode bodyNode) {
19+
whileNode = Truffle.getRuntime().createLoopNode(new WhileRepeatingNode(isUntil, condNode, bodyNode));
20+
}
21+
1822
@Deserializer("while")
19-
public NQPWhileNode(NQPNode condNode, NQPNode bodyNode) {
20-
whileNode = Truffle.getRuntime().createLoopNode(new WhileRepeatingNode(condNode, bodyNode));
23+
public static NQPWhileNode createWhile(NQPNode condNode, NQPNode bodyNode) {
24+
return new NQPWhileNode(false, condNode, bodyNode);
25+
}
26+
27+
@Deserializer("until")
28+
public static NQPWhileNode createUntil(NQPNode condNode, NQPNode bodyNode) {
29+
return new NQPWhileNode(true, condNode, bodyNode);
2130
}
2231

2332
@Override
@@ -32,17 +41,21 @@ public void executeVoid(VirtualFrame frame) {
3241
}
3342

3443
private static class WhileRepeatingNode extends NQPNodeWithBoolification implements RepeatingNode {
44+
private boolean isUntil;
3545
@Child private NQPNode condNode;
3646
@Child private NQPNode bodyNode;
3747

38-
public WhileRepeatingNode(NQPNode condNode, NQPNode bodyNode) {
48+
public WhileRepeatingNode(boolean isUntil, NQPNode condNode, NQPNode bodyNode) {
49+
this.isUntil = isUntil;
3950
this.condNode = condNode;
4051
this.bodyNode = bodyNode;
4152
}
4253

4354
@Override
4455
public boolean executeRepeating(VirtualFrame frame) {
45-
if (toBoolean(condNode.execute(frame))) {
56+
boolean condResult = toBoolean(condNode.execute(frame));
57+
condResult = isUntil ? !condResult : condResult;
58+
if (condResult) {
4659
try {
4760
bodyNode.executeVoid(frame);
4861
} catch (ContinueException ex) {

0 commit comments

Comments
 (0)