Skip to content
Snippets Groups Projects
Commit a20276af authored by Florian Angerer's avatar Florian Angerer
Browse files

Reverted changes to use operator '$' sending INOVKE message.

parent 65eeba37
Branches
No related tags found
No related merge requests found
......@@ -46,7 +46,6 @@ import com.oracle.truffle.r.nodes.function.FormalArguments;
import com.oracle.truffle.r.nodes.function.FunctionDefinitionNode;
import com.oracle.truffle.r.nodes.function.FunctionExpressionNode;
import com.oracle.truffle.r.nodes.function.PostProcessArgumentsNode;
import com.oracle.truffle.r.nodes.function.RCallNode;
import com.oracle.truffle.r.nodes.function.RCallSpecialNode;
import com.oracle.truffle.r.nodes.function.SaveArgumentsNode;
import com.oracle.truffle.r.nodes.function.WrapDefaultArgumentNode;
......@@ -63,8 +62,6 @@ import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
import com.oracle.truffle.r.runtime.nodes.EvaluatedArgumentsVisitor;
import com.oracle.truffle.r.runtime.nodes.RCodeBuilder;
import com.oracle.truffle.r.runtime.nodes.RNode;
import com.oracle.truffle.r.runtime.nodes.RSyntaxCall;
import com.oracle.truffle.r.runtime.nodes.RSyntaxConstant;
import com.oracle.truffle.r.runtime.nodes.RSyntaxElement;
import com.oracle.truffle.r.runtime.nodes.RSyntaxLookup;
import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
......@@ -98,7 +95,12 @@ public final class RASTBuilder implements RCodeBuilder<RSyntaxNode> {
switch (symbol) {
case "$":
case "@":
convertSymbol(args);
if (args.get(1).value instanceof RSyntaxLookup) {
RSyntaxLookup lookup = (RSyntaxLookup) args.get(1).value;
// FastR differs from GNUR: we only use string constants to represent
// field and slot lookups, while GNUR uses symbols
args.set(1, RCodeBuilder.argument(args.get(1).source, args.get(1).name, constant(lookup.getLazySourceSection(), lookup.getIdentifier())));
}
break;
case "while":
return new WhileNode(source, lhsLookup, args.get(0).value, args.get(1).value);
......@@ -145,39 +147,9 @@ public final class RASTBuilder implements RCodeBuilder<RSyntaxNode> {
}
}
if (canBeForeignInvoke(lhs)) {
return RCallNode.createCallDeferred(source, lhs.asRNode(), createSignature(args), createArguments(args));
}
return RCallSpecialNode.createCall(source, lhs.asRNode(), createSignature(args), createArguments(args));
}
/**
* Tests if some syntax expression can be a call in form of {@code lhsReceiver$lhsMember(args)}.
*/
private static boolean canBeForeignInvoke(RSyntaxNode expr) {
if (expr instanceof RSyntaxCall) {
RSyntaxCall call = (RSyntaxCall) expr;
RSyntaxElement lhs = call.getSyntaxLHS();
if (lhs instanceof RSyntaxLookup && "$".equals(((RSyntaxLookup) lhs).getIdentifier())) {
RSyntaxElement[] syntaxArguments = call.getSyntaxArguments();
return syntaxArguments.length == 2 && isAllowedElement(syntaxArguments[0]) && isAllowedElement(syntaxArguments[1]);
}
}
return false;
}
private void convertSymbol(List<Argument<RSyntaxNode>> args) {
if (args.get(1).value instanceof RSyntaxLookup) {
RSyntaxLookup lookup = (RSyntaxLookup) args.get(1).value;
// FastR differs from GNUR: we only use string constants to represent
// field and slot lookups, while GNUR uses symbols
args.set(1, RCodeBuilder.argument(args.get(1).source, args.get(1).name, constant(lookup.getLazySourceSection(), lookup.getIdentifier())));
}
}
private static ArgumentsSignature createSignature(List<Argument<RSyntaxNode>> args) {
String[] argumentNames = args.stream().map(arg -> arg.name).toArray(String[]::new);
ArgumentsSignature signature = ArgumentsSignature.get(argumentNames);
......@@ -308,8 +280,4 @@ public final class RASTBuilder implements RCodeBuilder<RSyntaxNode> {
}
return ReadVariableNode.wrap(source, functionLookup ? ReadVariableNode.createForcedFunctionLookup(symbol) : ReadVariableNode.create(symbol));
}
private static boolean isAllowedElement(RSyntaxElement e) {
return e instanceof RSyntaxLookup || e instanceof RSyntaxConstant;
}
}
......@@ -41,7 +41,6 @@ import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.interop.ArityException;
import com.oracle.truffle.api.interop.ForeignAccess;
import com.oracle.truffle.api.interop.KeyInfo;
import com.oracle.truffle.api.interop.Message;
import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.interop.UnknownIdentifierException;
......@@ -692,20 +691,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
* {@code src == RSyntaxNode.EAGER_DEPARSE} we force a deparse.
*/
public static RCallNode createCall(SourceSection src, RNode function, ArgumentsSignature signature, RSyntaxNode... arguments) {
return RCallNodeGen.create(src, arguments, signature, tagFunctionNode(function));
}
private static RNode tagFunctionNode(RNode function) {
// TODO Auto-generated method stub
return function;
}
/**
* The standard way to create a call to {@code function} with given arguments. If
* {@code src == RSyntaxNode.EAGER_DEPARSE} we force a deparse.
*/
public static RCallNode createCallDeferred(SourceSection src, RNode function, ArgumentsSignature signature, RSyntaxNode... arguments) {
return RCallNodeGen.create(src, arguments, signature, new DeferredFunctionNode(function));
return RCallNodeGen.create(src, arguments, signature, function);
}
/**
......@@ -1149,55 +1135,6 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
}
private static class DeferredFunctionNode extends RNode {
@Child private RNode function;
@Child private RNode lhsReceiver;
@Child private RNode lhsMember;
@Child private Node keyInfoNode;
private final ValueProfile receiverClassProfile = ValueProfile.createClassProfile();
private final ValueProfile memberClassProfile = ValueProfile.createClassProfile();
public RNode getLHSMember(RNode n) {
return (RNode) ((RSyntaxCall) n).getSyntaxArguments()[1];
}
public RNode getLHSReceiver(RNode n) {
return (RNode) ((RSyntaxCall) n).getSyntaxArguments()[0];
}
protected DeferredFunctionNode(RNode function) {
this.lhsReceiver = (RNode) getLHSReceiver(function).deepCopy();
this.lhsMember = (RNode) getLHSMember(function).deepCopy();
this.function = function;
}
@Override
public Object execute(VirtualFrame frame) {
Object lhsReceiverObj = lhsReceiver.execute(frame);
if (isForeignObject(receiverClassProfile.profile(lhsReceiverObj))) {
Object lhsMemberObj = memberClassProfile.profile(lhsMember.execute(frame));
if (lhsMemberObj instanceof String) {
if (keyInfoNode == null) {
keyInfoNode = insert(Message.KEY_INFO.createNode());
}
int keyInfo = ForeignAccess.sendKeyInfo(keyInfoNode, (TruffleObject) lhsReceiverObj, (String) lhsMemberObj);
if (KeyInfo.isInvocable(keyInfo)) {
return new DeferredFunctionValue((TruffleObject) lhsReceiverObj, (String) lhsMemberObj);
}
}
}
return function.execute(frame);
}
@Override
protected RSyntaxNode getRSyntaxNode() {
return function.asRSyntaxNode();
}
}
public static Object createDeferredMemberAccess(TruffleObject object, String name) {
return new DeferredFunctionValue(object, name);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment