diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java index b459887c3e7b27730c2d4f2fb85fe16ba16a8d8b..81e8940e45ef8ac53c0f6a3857aaea1db95e4d55 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java @@ -688,15 +688,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { @Override public Object SETCAR(Object x, Object y) { - RPairList pl; - if (x instanceof RLanguage) { - pl = ((RLanguage) x).getPairList(); - } else { - guaranteeInstanceOf(x, RPairList.class); - pl = (RPairList) x; - } - pl.setCar(y); - return y; + throw implementedAsNode(); } @Override @@ -708,8 +700,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { @Override public Object SETCADR(Object x, Object y) { - SETCAR(CDR(x), y); - return y; + throw implementedAsNode(); } @Override diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java index a5a57f7b338a8acd950575d63bd37eb8e3e44e64..051567f2a264727f4d7270ee5f5f7cedb51629d5 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java @@ -31,6 +31,7 @@ import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CARNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDDRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDRNodeGen; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.SETCARNodeGen; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetNamesAttributeNode; import com.oracle.truffle.r.runtime.RInternalError; @@ -93,6 +94,41 @@ public final class ListAccessNodes { } } + @TypeSystemReference(RTypes.class) + public static final class SETCADRNode extends FFIUpCallNode.Arg2 { + @Child private SETCARNode setcarNode = SETCARNode.create(); + @Child private CDRNode cdrNode = CDRNode.create(); + + @Override + public Object executeObject(Object x, Object y) { + return setcarNode.executeObject(cdrNode.executeObject(x), y); + } + } + + @TypeSystemReference(RTypes.class) + public abstract static class SETCARNode extends FFIUpCallNode.Arg2 { + public static SETCARNode create() { + return SETCARNodeGen.create(); + } + + @Specialization + protected Object doRLang(RLanguage x, Object y) { + x.getPairList().setCar(y); + return y; + } + + @Specialization + protected Object doRLang(RPairList x, Object y) { + x.setCar(y); + return y; + } + + @Fallback + protected Object car(@SuppressWarnings("unused") Object x, @SuppressWarnings("unused") Object y) { + throw RInternalError.unimplemented("SETCAR only works on pair lists or language objects"); + } + } + @TypeSystemReference(RTypes.class) public abstract static class CDRNode extends FFIUpCallNode.Arg1 { @Specialization diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java index d6dff9a1df3609c3548429a12a3b9e81b03ca595..ff460ed40591f81dd108c10dc4633eb5a52eaa13 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java @@ -36,6 +36,8 @@ import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CARNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDDRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDRNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.SETCADRNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.SETCARNode; import com.oracle.truffle.r.ffi.impl.nodes.MatchNodes; import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes; import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes.LENGTHNode; @@ -208,10 +210,12 @@ public interface StdUpCallsRFFI { Object SET_TAG(Object x, Object y); + @RFFIUpCallNode(SETCARNode.class) Object SETCAR(Object x, Object y); Object SETCDR(Object x, Object y); + @RFFIUpCallNode(SETCADRNode.class) Object SETCADR(Object x, Object y); Object SYMVALUE(Object x);