diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java index a439a0b7db36dcd248ecc5f690dbac5da2861088..d0d48097d59d96b28d8e3770e37f6f31bb0d5131 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java @@ -92,6 +92,7 @@ import com.oracle.truffle.r.runtime.nodes.RCodeBuilder; import com.oracle.truffle.r.runtime.nodes.RCodeBuilder.Argument; import com.oracle.truffle.r.runtime.nodes.RInstrumentableNode; import com.oracle.truffle.r.runtime.nodes.RNode; +import com.oracle.truffle.r.runtime.nodes.RSourceSectionNode; import com.oracle.truffle.r.runtime.nodes.RSyntaxCall; import com.oracle.truffle.r.runtime.nodes.RSyntaxElement; import com.oracle.truffle.r.runtime.nodes.RSyntaxFunction; @@ -222,21 +223,27 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { @Override @TruffleBoundary - public Object fromList(RList list, RLanguage.RepType repType) { + public Object createLanguageFromList(RList list, RLanguage.RepType repType) { int length = list.getLength(); if (length == 0) { return RNull.instance; } else if (repType == RLanguage.RepType.CALL) { RStringVector formals = list.getNames(); - RSyntaxNode[] arguments = new RSyntaxNode[length - 1]; - String[] sigNames = new String[arguments.length]; + + List<RCodeBuilder.Argument<RSyntaxNode>> argList = new ArrayList<>(length - 1); for (int i = 1; i < length; i++) { - arguments[i - 1] = (RSyntaxNode) unwrapToRNode(list.getDataAtAsObject(i)); String formal = formals == null ? null : formals.getDataAt(i); - sigNames[i - 1] = formal != null && formal.length() > 0 ? formal : null; + RSyntaxNode syntaxArg = (RSyntaxNode) unwrapToRNode(list.getDataAtAsObject(i)); + if (formal != null) { + argList.add(RCodeBuilder.argument(RSourceSectionNode.LAZY_DEPARSE, formal, syntaxArg)); + } else { + argList.add(RCodeBuilder.argument(syntaxArg)); + } } + RNode fn = unwrapToRNode(list.getDataAtAsObject(0)); - RLanguage result = RDataFactory.createLanguage(RASTUtils.createCall(fn, false, ArgumentsSignature.get(sigNames), arguments).asRNode()); + RSyntaxNode call = RContext.getASTBuilder().call(RSourceSectionNode.LAZY_DEPARSE, fn.asRSyntaxNode(), argList); + RLanguage result = RDataFactory.createLanguage(call.asRNode()); if (formals != null && formals.getLength() > 0 && formals.getDataAt(0).length() > 0) { result.setCallLHSName(formals.getDataAt(0)); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java index 7ce6f47b092713c0e5503f85b28e24f883381c98..f6e1fdd15a338630359f8e342e595a831ae2df34 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java @@ -274,7 +274,7 @@ final class CachedExtractVectorNode extends CachedVectorNode { @TruffleBoundary private static Object materializeLanguage(RAbstractVector extractedVector) { - return RContext.getRRuntimeASTAccess().fromList((RList) extractedVector, RLanguage.RepType.CALL); + return RContext.getRRuntimeASTAccess().createLanguageFromList((RList) extractedVector, RLanguage.RepType.CALL); } private Object extract(int dimensionIndex, RAbstractStringVector vector, Object pos, PositionProfile profile) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java index 71a7e7c7183b7deb12ec8bcccd4e06d9167c3026..73b47fda388a25673352a3f2d033143354008629 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java @@ -318,7 +318,7 @@ final class CachedReplaceVectorNode extends CachedVectorNode { private Object wrapResult(RAbstractVector vector, RLanguage.RepType repType) { switch (vectorType) { case Language: - return RContext.getRRuntimeASTAccess().fromList((RList) vector, repType); + return RContext.getRRuntimeASTAccess().createLanguageFromList((RList) vector, repType); default: return vector; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java index fe78327aeb55db9317feefacba162cdefeb53f8e..cda344489795bd1c53400e6741bf16cb43d66dfc 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RRuntimeASTAccess.java @@ -73,7 +73,7 @@ public interface RRuntimeASTAccess { * object whose rep is a {@code RCallNode} with the first list element as the function and the * remainder as the arguments, or a {@code RFunction} (as determined by repType). */ - Object fromList(RList list, RLanguage.RepType repType); + Object createLanguageFromList(RList list, RLanguage.RepType repType); /** * Get the "names" attribute for an {@link RLanguage} object, or {@code null} if none. diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java index aa46ff8da7eb3ac5072177291084578551044f86..9595b1723d5c17dcc0d31deb33a7ee1db2fd77e5 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java @@ -84,7 +84,7 @@ public final class RLanguage extends RSharingAttributeStorage implements RAbstra } else { l = (RList) o; } - return RContext.getRRuntimeASTAccess().fromList(l, type); + return RContext.getRRuntimeASTAccess().createLanguageFromList(l, type); } public RBaseNode getRep() {