Skip to content

Commit

Permalink
RD-9867 convert RootNodes to RootCallTarget in parsers (#331)
Browse files Browse the repository at this point in the history
- Converted RootNodes to callTargets where needed
  • Loading branch information
alexzerntev authored Jan 25, 2024
1 parent 9b61c13 commit 384773a
Show file tree
Hide file tree
Showing 15 changed files with 145 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,21 @@
import raw.runtime.truffle.RawLanguage;
import raw.runtime.truffle.ast.ProgramExpressionNode;
import raw.runtime.truffle.ast.io.json.reader.parser.*;
import raw.runtime.truffle.ast.io.json.reader.parser.BinaryParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.BooleanParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.ByteParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.DateParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.DecimalParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.DoubleParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.FloatParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.IntParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.IntervalParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.ListParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.LongParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.ShortParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.StringParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.TimeParseJsonNodeGen;
import raw.runtime.truffle.ast.io.json.reader.parser.TimestampParseJsonNodeGen;
import raw.runtime.truffle.runtime.exceptions.RawTruffleInternalErrorException;
import scala.collection.JavaConverters;

Expand Down Expand Up @@ -58,12 +73,12 @@ private ProgramExpressionNode recurse(Rql2TypeWithProperties tipe, boolean appen
case Rql2ListType r ->{
ProgramExpressionNode child = recurse((Rql2TypeWithProperties)r.innerType(), lang);
yield ListParseJsonNodeGen.create(
(Rql2TypeWithProperties)r.innerType(),child
(Rql2TypeWithProperties)r.innerType(), child.getCallTarget()
);
}
case Rql2IterableType r ->{
ProgramExpressionNode child = recurse((Rql2TypeWithProperties)r.innerType(), lang);
yield new IterableParseJsonNode(program(ListParseJsonNodeGen.create((Rql2TypeWithProperties)r.innerType(),child),lang));
yield new IterableParseJsonNode(program(ListParseJsonNodeGen.create((Rql2TypeWithProperties)r.innerType(), child.getCallTarget()),lang));
}
case Rql2RecordType r ->{
LinkedHashMap<String,Integer> hashMap = new LinkedHashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra

JsonParseNode parseNode =
JsonParseNodeGen.create(
unnamedArgs[0], parser.recurse((Rql2TypeWithProperties) type, rawLanguage));
unnamedArgs[0],
parser.recurse((Rql2TypeWithProperties) type, rawLanguage).getCallTarget());
if (((Rql2TypeWithProperties) type).props().contains(tryable))
return new TryableTopLevelWrapper(parseNode);
else return parseNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
public class TrufflePrintJsonEntry extends PrintJsonEntry implements TruffleEntryExtension {
@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
JsonWriter jsonWriter = new JsonWriter();
return JsonPrintNodeGen.create(
args.get(0).exprNode(),
jsonWriter.recurse((Rql2TypeWithProperties) args.get(0).type(), rawLanguage));
args.getFirst().exprNode(),
JsonWriter.recurse((Rql2TypeWithProperties) args.getFirst().type(), rawLanguage)
.getCallTarget());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@

import static raw.compiler.snapi.truffle.builtin.CompilerScalaConsts.*;

public class TruffleReadJsonEntry extends ReadJsonEntry implements TruffleEntryExtension, WithJsonArgs {
public class TruffleReadJsonEntry extends ReadJsonEntry
implements TruffleEntryExtension, WithJsonArgs {

@Override
public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage rawLanguage) {
Expand All @@ -46,7 +47,9 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
} else {
JsonReadValueNode parseNode =
new JsonReadValueNode(
unnamedArgs[0], encoding, parser.recurse((Rql2TypeWithProperties) type, rawLanguage));
unnamedArgs[0],
encoding,
parser.recurse((Rql2TypeWithProperties) type, rawLanguage).getCallTarget());
if (((Rql2TypeWithProperties) type).props().contains(tryable))
return new TryableTopLevelWrapper(parseNode);
else return parseNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,18 @@

public class TruffleParseXmlEntry extends ParseXmlEntry implements TruffleEntryExtension {

private static ExpressionNode getArg(List<TruffleArg> namedArgs, String identifier, ExpressionNode defExp) {
return namedArgs.stream().filter(arg -> arg.identifier() != null && arg.identifier().equals(identifier)).map(TruffleArg::exprNode).findFirst().orElse(defExp);
private static ExpressionNode getArg(
List<TruffleArg> namedArgs, String identifier, ExpressionNode defExp) {
return namedArgs.stream()
.filter(arg -> arg.identifier() != null && arg.identifier().equals(identifier))
.map(TruffleArg::exprNode)
.findFirst()
.orElse(defExp);
}

private static final ExpressionNode defaultEncoding = new StringNode("utf-8");
private static final ExpressionNode defaultTimestampFormat = new StringNode("yyyy-M-d['T'][ ]HH:mm[:ss[.SSS]]");
private static final ExpressionNode defaultTimestampFormat =
new StringNode("yyyy-M-d['T'][ ]HH:mm[:ss[.SSS]]");
private static final ExpressionNode defaultDateFormat = new StringNode("yyyy-M-d");
private static final ExpressionNode defaultTimeFormat = new StringNode("HH:mm[:ss[.SSS]]");

Expand All @@ -49,17 +55,19 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
ExpressionNode encoding = getArg(namedArgs, "encoding", defaultEncoding);
ExpressionNode timeFormatExp = getArg(namedArgs, "timeFormat", defaultTimeFormat);
ExpressionNode dateFormatExp = getArg(namedArgs, "dateFormat", defaultDateFormat);
ExpressionNode timestampFormatExp = getArg(namedArgs, "timestampFormat", defaultTimestampFormat);
ExpressionNode timestampFormatExp =
getArg(namedArgs, "timestampFormat", defaultTimestampFormat);

return switch (type) {
case Rql2IterableType iterableType -> {
ExpressionNode parseNode = new XmlParseCollectionNode(
unnamedArgs.get(0).exprNode(),
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse
.recurseXmlParser((Rql2TypeWithProperties) iterableType.innerType(), rawLanguage));
ExpressionNode parseNode =
new XmlParseCollectionNode(
unnamedArgs.get(0).exprNode(),
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse.recurseXmlParser(
(Rql2TypeWithProperties) iterableType.innerType(), rawLanguage));
if (XmlRecurse.isTryable(iterableType)) {
// Probably will need to be either reused in json and xml or create a copy
yield new TryableTopLevelWrapper(parseNode);
Expand All @@ -68,13 +76,14 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
}
}
case Rql2ListType listType -> {
ExpressionNode parseNode = new XmlParseCollectionNode(
unnamedArgs.get(0).exprNode(),
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse
.recurseXmlParser((Rql2TypeWithProperties) listType.innerType(), rawLanguage));
ExpressionNode parseNode =
new XmlParseCollectionNode(
unnamedArgs.get(0).exprNode(),
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse.recurseXmlParser(
(Rql2TypeWithProperties) listType.innerType(), rawLanguage));
if (XmlRecurse.isTryable(listType)) {
// Probably will need to be either reused in json and xml or create a copy
yield ListFromNodeGen.create(parseNode, (Rql2Type) listType.innerType());
Expand All @@ -83,13 +92,13 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
}
}
case Rql2TypeWithProperties t -> {
ExpressionNode parseNode = new XmlParseValueNode(
unnamedArgs.get(0).exprNode(),
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse
.recurseXmlParser(t, rawLanguage));
ExpressionNode parseNode =
new XmlParseValueNode(
unnamedArgs.get(0).exprNode(),
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse.recurseXmlParser(t, rawLanguage).getCallTarget());
if (XmlRecurse.isTryable(t)) {
yield new TryableTopLevelWrapper(parseNode);
} else {
Expand All @@ -98,6 +107,5 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
}
default -> throw new IllegalStateException("Unexpected value: " + type);
};

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,18 @@

public class TruffleReadXmlEntry extends ReadXmlEntry implements TruffleEntryExtension {

private static ExpressionNode getArg(List<TruffleArg> namedArgs, String identifier, ExpressionNode defExp) {
return namedArgs.stream().filter(arg -> arg.identifier() != null && arg.identifier().equals(identifier)).map(TruffleArg::exprNode).findFirst().orElse(defExp);
private static ExpressionNode getArg(
List<TruffleArg> namedArgs, String identifier, ExpressionNode defExp) {
return namedArgs.stream()
.filter(arg -> arg.identifier() != null && arg.identifier().equals(identifier))
.map(TruffleArg::exprNode)
.findFirst()
.orElse(defExp);
}

private static final ExpressionNode defaultEncoding = new StringNode("utf-8");
private static final ExpressionNode defaultTimestampFormat = new StringNode("yyyy-M-d['T'][ ]HH:mm[:ss[.SSS]]");
private static final ExpressionNode defaultTimestampFormat =
new StringNode("yyyy-M-d['T'][ ]HH:mm[:ss[.SSS]]");
private static final ExpressionNode defaultDateFormat = new StringNode("yyyy-M-d");
private static final ExpressionNode defaultTimeFormat = new StringNode("HH:mm[:ss[.SSS]]");

Expand All @@ -49,18 +55,20 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
ExpressionNode encoding = getArg(namedArgs, "encoding", defaultEncoding);
ExpressionNode timeFormatExp = getArg(namedArgs, "timeFormat", defaultTimeFormat);
ExpressionNode dateFormatExp = getArg(namedArgs, "dateFormat", defaultDateFormat);
ExpressionNode timestampFormatExp = getArg(namedArgs, "timestampFormat", defaultTimestampFormat);
ExpressionNode timestampFormatExp =
getArg(namedArgs, "timestampFormat", defaultTimestampFormat);

return switch (type) {
case Rql2IterableType iterableType -> {
ExpressionNode parseNode = new XmlReadCollectionNode(
unnamedArgs.get(0).exprNode(),
encoding,
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse
.recurseXmlParser((Rql2TypeWithProperties) iterableType.innerType(), rawLanguage));
ExpressionNode parseNode =
new XmlReadCollectionNode(
unnamedArgs.get(0).exprNode(),
encoding,
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse.recurseXmlParser(
(Rql2TypeWithProperties) iterableType.innerType(), rawLanguage));
if (XmlRecurse.isTryable(iterableType)) {
// Probably will need to be either reused in json and xml or create a copy
yield new TryableTopLevelWrapper(parseNode);
Expand All @@ -69,14 +77,15 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
}
}
case Rql2ListType listType -> {
ExpressionNode parseNode = new XmlReadCollectionNode(
unnamedArgs.get(0).exprNode(),
encoding,
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse
.recurseXmlParser((Rql2TypeWithProperties) listType.innerType(), rawLanguage));
ExpressionNode parseNode =
new XmlReadCollectionNode(
unnamedArgs.get(0).exprNode(),
encoding,
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse.recurseXmlParser(
(Rql2TypeWithProperties) listType.innerType(), rawLanguage));
if (XmlRecurse.isTryable(listType)) {
// Probably will need to be either reused in json and xml or create a copy
yield ListFromNodeGen.create(parseNode, (Rql2Type) listType.innerType());
Expand All @@ -85,14 +94,14 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
}
}
case Rql2TypeWithProperties t -> {
ExpressionNode parseNode = new XmlReadValueNode(
unnamedArgs.get(0).exprNode(),
encoding,
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse
.recurseXmlParser(t, rawLanguage));
ExpressionNode parseNode =
new XmlReadValueNode(
unnamedArgs.get(0).exprNode(),
encoding,
dateFormatExp,
timeFormatExp,
timestampFormatExp,
XmlRecurse.recurseXmlParser(t, rawLanguage).getCallTarget());
if (XmlRecurse.isTryable(t)) {
yield new TryableTopLevelWrapper(parseNode);
} else {
Expand All @@ -101,6 +110,5 @@ public ExpressionNode toTruffle(Type type, List<TruffleArg> args, RawLanguage ra
}
default -> throw new IllegalStateException("Unexpected value: " + type);
};

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
import com.fasterxml.jackson.dataformat.csv.CsvGenerator;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.RootNode;
import java.io.IOException;
import java.io.OutputStream;
import raw.runtime.truffle.ExpressionNode;
Expand Down Expand Up @@ -63,11 +63,14 @@ public class CsvIterableWriterNode extends StatementNode {
private final String lineSeparator;

public CsvIterableWriterNode(
ExpressionNode dataNode, RootNode writerNode, String[] columnNames, String lineSeparator) {
ExpressionNode dataNode,
RootCallTarget writeRootCallTarget,
String[] columnNames,
String lineSeparator) {
this.dataNode = dataNode;
this.columnNames = columnNames;
this.lineSeparator = lineSeparator;
itemWriter = DirectCallNode.create(writerNode.getCallTarget());
itemWriter = DirectCallNode.create(writeRootCallTarget);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
import com.fasterxml.jackson.dataformat.csv.CsvGenerator;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.RootNode;
import java.io.IOException;
import java.io.OutputStream;
import raw.runtime.truffle.ExpressionNode;
Expand All @@ -46,9 +46,12 @@ public class CsvListWriterNode extends StatementNode {
private final String lineSeparator;

public CsvListWriterNode(
ExpressionNode dataNode, RootNode writerNode, String[] columnNames, String lineSeparator) {
ExpressionNode dataNode,
RootCallTarget writeRootCallTarget,
String[] columnNames,
String lineSeparator) {
this.dataNode = dataNode;
itemWriter = DirectCallNode.create(writerNode.getCallTarget());
itemWriter = DirectCallNode.create(writeRootCallTarget);
this.columnNames = columnNames;
this.lineSeparator = lineSeparator;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,30 +13,30 @@
package raw.runtime.truffle.ast.io.json.reader;

import com.fasterxml.jackson.core.JsonParser;
import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.dsl.*;
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.NodeInfo;
import com.oracle.truffle.api.nodes.RootNode;
import raw.runtime.truffle.ExpressionNode;
import raw.runtime.truffle.ast.io.json.reader.JsonParserNodes.*;
import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException;
import raw.runtime.truffle.runtime.exceptions.json.JsonReaderRawTruffleException;

@NodeInfo(shortName = "ParseJson")
@NodeChild(value = "str")
@NodeField(name = "childNode", type = RootNode.class)
@NodeField(name = "childCallTarget", type = RootCallTarget.class)
public abstract class JsonParseNode extends ExpressionNode {

@Idempotent
protected abstract RootNode getChildNode();
protected abstract RootCallTarget getChildCallTarget();

@Specialization
protected Object doParse(
String str,
@Cached(inline = true) InitJsonParserNode initParserNode,
@Cached(inline = true) CloseJsonParserNode closeParserNode,
@Cached(inline = true) NextTokenJsonParserNode nextTokenNode,
@Cached("create(getChildNode().getCallTarget())") DirectCallNode childDirectCall) {
@Cached("create(getChildCallTarget())") DirectCallNode childDirectCall) {
JsonParser parser = null;
try {
parser = initParserNode.execute(this, str);
Expand Down
Loading

0 comments on commit 384773a

Please sign in to comment.