Skip to content

Commit 20a2073

Browse files
committed
[truffle] Teach our DSL processor how to handle int, num, str arguments to nodes
1 parent 988d0c9 commit 20a2073

File tree

6 files changed

+46
-13
lines changed

6 files changed

+46
-13
lines changed

src/vm/jvm/dsl/org/perl6/nqp/dsl/AstBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@
1010
public @interface AstBuilder {
1111
Class nodeClass();
1212
Class nodesClass();
13+
Class intClass();
14+
Class numClass();
15+
Class strClass();
1316
}

src/vm/jvm/dsl/org/perl6/nqp/dsl/Processor.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ private String opNameFromClassName(String className) {
4040
.toLowerCase();
4141
}
4242

43-
private void writeBuildMethod(TypeMirror nodeClass, TypeMirror nodesClass, PrintWriter writer, RoundEnvironment roundEnv) {
43+
private void writeBuildMethod(TypeMirror nodeClass, TypeMirror nodesClass, TypeMirror intClass, TypeMirror numClass, TypeMirror strClass, PrintWriter writer, RoundEnvironment roundEnv) {
4444
writer.append(" public NQPNode buildSimple(SixModelObject node, NQPScope scope, ThreadContext tc) {\n");
4545

4646
writer.append(" switch (node.at_pos_boxed(tc, 0).get_str(tc)) {\n");
@@ -71,6 +71,12 @@ private void writeBuildMethod(TypeMirror nodeClass, TypeMirror nodesClass, Print
7171
writer.append("build(node.at_pos_boxed(tc, " + (i+1) + "), scope, tc)");
7272
} else if (paramType.equals(nodesClass)) {
7373
writer.append("expressions(node, " + (i+1) + ", scope, tc)");
74+
} else if (paramType.equals(intClass)) {
75+
writer.append("node.at_pos_boxed(tc, " + (i+1) + ").get_int(tc)");
76+
} else if (paramType.equals(numClass)) {
77+
writer.append("node.at_pos_boxed(tc, " + (i+1) + ").get_num(tc)");
78+
} else if (paramType.equals(strClass)) {
79+
writer.append("node.at_pos_boxed(tc, " + (i+1) + ").get_str(tc)");
7480
} else {
7581
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Wrong param type: " + paramType.toString());
7682
}
@@ -106,6 +112,9 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
106112

107113
TypeMirror nodeClass = null;
108114
TypeMirror nodesClass = null;
115+
TypeMirror intClass = null;
116+
TypeMirror numClass = null;
117+
TypeMirror strClass = null;
109118

110119
try {
111120
annotation.nodeClass();
@@ -119,6 +128,24 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
119128
nodesClass = e.getTypeMirror();
120129
}
121130

131+
try {
132+
annotation.intClass();
133+
} catch (MirroredTypeException e) {
134+
intClass = e.getTypeMirror();
135+
}
136+
137+
try {
138+
annotation.numClass();
139+
} catch (MirroredTypeException e) {
140+
numClass = e.getTypeMirror();
141+
}
142+
143+
try {
144+
annotation.strClass();
145+
} catch (MirroredTypeException e) {
146+
strClass = e.getTypeMirror();
147+
}
148+
122149
String builderClass = type.getQualifiedName().toString();
123150
String generatedClassQualified = builderClass + "Gen";
124151
String generatedClassSimple = type.getSimpleName().toString() + "Gen";
@@ -136,7 +163,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
136163

137164
writer.append("public class " + generatedClassSimple + " extends " + builderClass + " {\n");
138165

139-
writeBuildMethod(nodeClass, nodesClass, writer, roundEnv);
166+
writeBuildMethod(nodeClass, nodesClass, intClass, numClass, strClass, writer, roundEnv);
140167

141168
writer.append("}\n");
142169
}

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

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
import org.perl6.nqp.truffle.nodes.NQPBlockBodyNode;
1414
import org.perl6.nqp.truffle.nodes.control.NQPBlockNode;
1515

16-
import org.perl6.nqp.truffle.nodes.expression.NQPIValNode;
17-
import org.perl6.nqp.truffle.nodes.expression.NQPSValNode;
18-
import org.perl6.nqp.truffle.nodes.expression.NQPNValNode;
19-
2016
import org.perl6.nqp.truffle.nodes.io.NQPSayNode;
2117
import org.perl6.nqp.truffle.nodes.io.NQPPrintNode;
2218

@@ -36,7 +32,13 @@
3632
import org.perl6.nqp.truffle.runtime.NQPCodeRef;
3733
import org.perl6.nqp.dsl.AstBuilder;
3834

39-
@AstBuilder(nodeClass = NQPNode.class, nodesClass = NQPNode[].class)
35+
@AstBuilder(
36+
nodeClass = NQPNode.class,
37+
nodesClass = NQPNode[].class,
38+
intClass = long.class,
39+
numClass = double.class,
40+
strClass = String.class
41+
)
4042

4143
abstract class TruffleCompiler {
4244
public void run(SixModelObject node, ThreadContext tc) {
@@ -68,12 +70,6 @@ public NQPNode build(SixModelObject node, NQPScope scope, ThreadContext tc) {
6870
if (trySimple != null) return trySimple;
6971

7072
switch (node.at_pos_boxed(tc, 0).get_str(tc)) {
71-
case "ival":
72-
return new NQPIValNode(node.at_pos_boxed(tc, 1).get_int(tc));
73-
case "nval":
74-
return new NQPNValNode(node.at_pos_boxed(tc, 1).get_num(tc));
75-
case "sval":
76-
return new NQPSValNode(node.at_pos_boxed(tc, 1).get_str(tc));
7773
case "unless":
7874
case "if":
7975
return new NQPIfNode(

src/vm/jvm/runtime/org/perl6/nqp/truffle/nodes/expression/NQPIValNode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,14 @@
4444
import com.oracle.truffle.api.nodes.NodeInfo;
4545
import org.perl6.nqp.truffle.nodes.NQPNode;
4646
import org.perl6.nqp.truffle.nodes.NQPIntNode;
47+
import org.perl6.nqp.truffle.runtime.Coercions;
48+
import org.perl6.nqp.dsl.Deserializer;
4749

4850
@NodeInfo(shortName = "const")
4951
public final class NQPIValNode extends NQPIntNode {
5052
private final long value;
5153

54+
@Deserializer
5255
public NQPIValNode(long value) {
5356
this.value = value;
5457
}

src/vm/jvm/runtime/org/perl6/nqp/truffle/nodes/expression/NQPNValNode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import com.oracle.truffle.api.nodes.NodeInfo;
4545
import org.perl6.nqp.truffle.nodes.NQPNode;
4646
import org.perl6.nqp.truffle.nodes.NQPNumNode;
47+
import org.perl6.nqp.dsl.Deserializer;
4748

4849
@NodeInfo(shortName = "const")
4950
public final class NQPNValNode extends NQPNumNode {
5051
private final double value;
5152

53+
@Deserializer
5254
public NQPNValNode(double value) {
5355
this.value = value;
5456
}

src/vm/jvm/runtime/org/perl6/nqp/truffle/nodes/expression/NQPSValNode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import com.oracle.truffle.api.nodes.NodeInfo;
4545
import org.perl6.nqp.truffle.nodes.NQPNode;
4646
import org.perl6.nqp.truffle.nodes.NQPStrNode;
47+
import org.perl6.nqp.dsl.Deserializer;
4748

4849
@NodeInfo(shortName = "const")
4950
public final class NQPSValNode extends NQPStrNode {
5051
private final String value;
5152

53+
@Deserializer
5254
public NQPSValNode(String value) {
5355
this.value = value;
5456
}

0 commit comments

Comments
 (0)