Skip to content

Commit f6cb253

Browse files
committed
[truffle] Implement nqp::list
1 parent 91547a3 commit f6cb253

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

nqp-truffle.nqp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,21 @@ class QAST::OperationsTruffle {
124124
add_op('numify', sub ($comp, $node, :$want) {
125125
$comp.as_truffle($node[0], :want($NUM));
126126
});
127+
for ['_i', $INT, '', $OBJ, '_s', $STR, '_n', $NUM] -> $suffix, $type {
128+
my str $op_name := 'list' ~ $suffix;
129+
add_op($op_name, sub ($comp, $node, :$want) {
130+
131+
my @tree := [$op_name];
132+
133+
for $node.list -> $elem {
134+
my $tast := $comp.as_truffle($elem, :want($type));
135+
@tree.push($tast.tree);
136+
}
137+
138+
TAST.new($OBJ, @tree);
139+
});
140+
}
141+
127142
# explicit takeclosure is used by the JVM backend we no-op it.
128143
add_op('takeclosure', sub ($comp, $node, :$want) {
129144
$comp.as_truffle($node[0], :want($want));

src/vm/jvm/runtime/org/perl6/nqp/truffle/TruffleCompiler.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import org.perl6.nqp.truffle.nodes.control.NQPIfNode;
2929

30+
import org.perl6.nqp.truffle.nodes.expression.NQPListNode;
31+
3032
import org.perl6.nqp.truffle.nodes.variables.NQPReadLocalVariableNode;
3133
import org.perl6.nqp.truffle.nodes.variables.NQPBindLocalVariableNode;
3234
import org.perl6.nqp.truffle.nodes.variables.NQPGetPositionalNode;
@@ -70,6 +72,7 @@ public NQPNode build(SixModelObject node, NQPScope scope, ThreadContext tc) {
7072
NQPNode children[] = expressions(node, scope, tc);
7173
return new NQPStmts(children);
7274
}
75+
case "list": return new NQPListNode(expressions(node, scope, tc));
7376
case "ival":
7477
return new NQPIValNode(node.at_pos_boxed(tc, 1).get_int(tc));
7578
case "nval":
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.perl6.nqp.truffle.nodes.expression;
2+
3+
import com.oracle.truffle.api.CompilerAsserts;
4+
import com.oracle.truffle.api.frame.VirtualFrame;
5+
import com.oracle.truffle.api.nodes.ExplodeLoop;
6+
import com.oracle.truffle.api.nodes.NodeInfo;
7+
8+
import org.perl6.nqp.truffle.nodes.NQPNode;
9+
import org.perl6.nqp.truffle.runtime.NQPList;
10+
11+
@NodeInfo(shortName = "list")
12+
public final class NQPListNode extends NQPNode {
13+
@Children private final NQPNode[] bodyNodes;
14+
15+
public NQPListNode(NQPNode[] bodyNodes) {
16+
this.bodyNodes = bodyNodes;
17+
}
18+
19+
@Override
20+
@ExplodeLoop
21+
public Object execute(VirtualFrame frame) {
22+
NQPList list = new NQPList();
23+
24+
CompilerAsserts.compilationConstant(bodyNodes.length);
25+
26+
for (NQPNode statement : bodyNodes) {
27+
list.push(statement.execute(frame));
28+
}
29+
30+
return list;
31+
}
32+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.perl6.nqp.truffle.runtime;
2+
3+
import java.util.ArrayList;
4+
5+
public final class NQPList {
6+
ArrayList<Object> contents;
7+
8+
public NQPList() {
9+
this.contents = new ArrayList<Object>();
10+
}
11+
12+
public void push(Object element) {
13+
this.contents.add(element);
14+
}
15+
}

0 commit comments

Comments
 (0)