Skip to content
Snippets Groups Projects
Commit 6b7fde25 authored by stepan's avatar stepan
Browse files

FFI: implement SETCARD as node

parent 8ed7ea74
No related branches found
No related tags found
No related merge requests found
...@@ -688,15 +688,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { ...@@ -688,15 +688,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
@Override @Override
public Object SETCAR(Object x, Object y) { public Object SETCAR(Object x, Object y) {
RPairList pl; throw implementedAsNode();
if (x instanceof RLanguage) {
pl = ((RLanguage) x).getPairList();
} else {
guaranteeInstanceOf(x, RPairList.class);
pl = (RPairList) x;
}
pl.setCar(y);
return y;
} }
@Override @Override
...@@ -708,8 +700,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { ...@@ -708,8 +700,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
@Override @Override
public Object SETCADR(Object x, Object y) { public Object SETCADR(Object x, Object y) {
SETCAR(CDR(x), y); throw implementedAsNode();
return y;
} }
@Override @Override
......
...@@ -31,6 +31,7 @@ import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADRNodeGen; ...@@ -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.CARNodeGen;
import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDDRNodeGen; 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.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.GetNamesAttributeNode;
import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetNamesAttributeNode; import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetNamesAttributeNode;
import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RInternalError;
...@@ -93,6 +94,41 @@ public final class ListAccessNodes { ...@@ -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) @TypeSystemReference(RTypes.class)
public abstract static class CDRNode extends FFIUpCallNode.Arg1 { public abstract static class CDRNode extends FFIUpCallNode.Arg1 {
@Specialization @Specialization
......
...@@ -36,6 +36,8 @@ import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADRNode; ...@@ -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.CARNode;
import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDDRNode; 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.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.MatchNodes;
import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes; import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes;
import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes.LENGTHNode; import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes.LENGTHNode;
...@@ -208,10 +210,12 @@ public interface StdUpCallsRFFI { ...@@ -208,10 +210,12 @@ public interface StdUpCallsRFFI {
Object SET_TAG(Object x, Object y); Object SET_TAG(Object x, Object y);
@RFFIUpCallNode(SETCARNode.class)
Object SETCAR(Object x, Object y); Object SETCAR(Object x, Object y);
Object SETCDR(Object x, Object y); Object SETCDR(Object x, Object y);
@RFFIUpCallNode(SETCADRNode.class)
Object SETCADR(Object x, Object y); Object SETCADR(Object x, Object y);
Object SYMVALUE(Object x); Object SYMVALUE(Object x);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment