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 c5c1f77155583854dda5b608987981a3b333d0b2..54ab531ca98802cc6137e11a1314feb92b802432 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 @@ -136,7 +136,12 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { private final Map<String, Object> nameSymbolCache = new ConcurrentHashMap<>(); private static RuntimeException implementedAsNode() { - throw RInternalError.shouldNotReachHere("upcall function is implemented via a node"); + // TODO: Exception handling over native boundaries is currently missing. Once this works, + // remove the following two lines. + System.err.println("upcall function is implemented via a node"); + System.exit(1); + + return RInternalError.shouldNotReachHere("upcall function is implemented via a node"); } // Checkstyle: stop method name check diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java index 9a448ed172eff64a57b9d7ea066742f5c6cf685e..515524a94b9a9918eb060ebca0e589d53b01d1ad 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java @@ -113,7 +113,7 @@ public final class MiscNodes { } @TypeSystemReference(RTypes.class) - abstract static class RDoSlotNode extends FFIUpCallNode.Arg2 { + public abstract static class RDoSlotNode extends FFIUpCallNode.Arg2 { @Child private AccessSlotNode accessSlotNode; @@ -137,7 +137,7 @@ public final class MiscNodes { } @TypeSystemReference(RTypes.class) - abstract static class RDoSlotAssignNode extends FFIUpCallNode.Arg3 { + public abstract static class RDoSlotAssignNode extends FFIUpCallNode.Arg3 { @Child private UpdateSlotNode updateSlotNode; @@ -166,7 +166,7 @@ public final class MiscNodes { } @TypeSystemReference(RTypes.class) - abstract static class RDoNewObjectNode extends FFIUpCallNode.Arg1 { + public abstract static class RDoNewObjectNode extends FFIUpCallNode.Arg1 { @Child private NewObject newObjectNode; @@ -185,7 +185,7 @@ public final class MiscNodes { } @TypeSystemReference(RTypes.class) - abstract static class NamesGetsNode extends FFIUpCallNode.Arg2 { + public abstract static class NamesGetsNode extends FFIUpCallNode.Arg2 { @Child private SetNamesAttributeNode setNamesNode; @@ -198,6 +198,10 @@ public final class MiscNodes { setNamesNode.execute(vec, val); return vec; } + + public static NamesGetsNode create() { + return MiscNodesFactory.NamesGetsNodeGen.create(); + } } } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RandFunctionsNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RandFunctionsNodes.java index f168c1caeda218a4a7589d1e2a6edc979faa8fb8..a626970a7e77ca884c63f9dc0580fc8b6ef2d303 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RandFunctionsNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RandFunctionsNodes.java @@ -24,13 +24,16 @@ package com.oracle.truffle.r.ffi.impl.nodes; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.runtime.nmath.MathFunctions; +import com.oracle.truffle.r.runtime.nmath.MathFunctions.Function3_1; +import com.oracle.truffle.r.runtime.nmath.MathFunctions.Function3_2; import com.oracle.truffle.r.runtime.nmath.RandomFunctions; import com.oracle.truffle.r.runtime.nmath.RandomFunctions.RandFunction2_Double; import com.oracle.truffle.r.runtime.nmath.RandomFunctions.RandomNumberProvider; +import com.oracle.truffle.r.runtime.nmath.distr.Unif; public final class RandFunctionsNodes { - public abstract static class RandFunction3_2Node extends FFIUpCallNode.Arg5 { + abstract static class RandFunction3_2Node extends FFIUpCallNode.Arg5 { private final MathFunctions.Function3_2 inner; protected RandFunction3_2Node(MathFunctions.Function3_2 inner) { @@ -43,7 +46,7 @@ public final class RandFunctionsNodes { } } - public abstract static class RandFunction3_1Node extends FFIUpCallNode.Arg4 { + abstract static class RandFunction3_1Node extends FFIUpCallNode.Arg4 { private final MathFunctions.Function3_1 inner; protected RandFunction3_1Node(MathFunctions.Function3_1 inner) { @@ -56,7 +59,7 @@ public final class RandFunctionsNodes { } } - public abstract static class RandFunction2Node extends FFIUpCallNode.Arg2 { + abstract static class RandFunction2Node extends FFIUpCallNode.Arg2 { @Child private RandomFunctions.RandFunction2_Double inner; protected RandFunction2Node(RandFunction2_Double inner) { @@ -69,4 +72,51 @@ public final class RandFunctionsNodes { } } + public abstract static class RunifNode extends RandFunction2Node { + + protected RunifNode(RandFunction2_Double inner) { + super(inner); + } + + public static RunifNode create() { + return RandFunctionsNodesFactory.RunifNodeGen.create(new Unif.Runif()); + } + + } + + public abstract static class DunifNode extends RandFunction3_1Node { + + protected DunifNode(Function3_1 inner) { + super(inner); + } + + public static DunifNode create() { + return RandFunctionsNodesFactory.DunifNodeGen.create(new Unif.DUnif()); + } + + } + + public abstract static class QunifNode extends RandFunction3_2Node { + + protected QunifNode(Function3_2 inner) { + super(inner); + } + + public static QunifNode create() { + return RandFunctionsNodesFactory.QunifNodeGen.create(new Unif.QUnif()); + } + + } + + public abstract static class PunifNode extends RandFunction3_2Node { + + protected PunifNode(Function3_2 inner) { + super(inner); + } + + public static PunifNode create() { + return RandFunctionsNodesFactory.PunifNodeGen.create(new Unif.PUnif()); + } + + } } 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 50a20bc8e1ef9fde6f4d7c98bf03de997ce114b2..881f80c785ea2f30ac1379ca3c1bbcf1ce1432d8 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 @@ -37,7 +37,9 @@ 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.MatchNodes; +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.RandFunctionsNodes; import com.oracle.truffle.r.ffi.processor.RFFICstring; import com.oracle.truffle.r.ffi.processor.RFFIRunGC; import com.oracle.truffle.r.ffi.processor.RFFIUpCallNode; @@ -96,6 +98,7 @@ public interface StdUpCallsRFFI { Object R_do_MAKE_CLASS(@RFFICstring String clazz); + @RFFIUpCallNode(MiscNodes.RDoNewObjectNode.class) Object R_do_new_object(Object classDef); /** @@ -316,8 +319,10 @@ public interface StdUpCallsRFFI { boolean isSeekable(Object x); + @RFFIUpCallNode(MiscNodes.RDoSlotNode.class) Object R_do_slot(Object o, Object name); + @RFFIUpCallNode(MiscNodes.RDoSlotAssignNode.class) Object R_do_slot_assign(Object o, Object name, Object value); Object R_MethodsNamespace(); @@ -326,14 +331,19 @@ public interface StdUpCallsRFFI { int FASTR_getConnectionChar(Object obj); + @RFFIUpCallNode(RandFunctionsNodes.DunifNode.class) double Rf_dunif(double a, double b, double c, int d); + @RFFIUpCallNode(RandFunctionsNodes.QunifNode.class) double Rf_qunif(double a, double b, double c, int d, int e); + @RFFIUpCallNode(RandFunctionsNodes.PunifNode.class) double Rf_punif(double a, double b, double c, int d, int e); + @RFFIUpCallNode(RandFunctionsNodes.RunifNode.class) double Rf_runif(double a, double b); + @RFFIUpCallNode(MiscNodes.NamesGetsNode.class) Object Rf_namesgets(Object vec, Object val); @RFFIUpCallNode(CopyMostAttrib.class)