From 57fa631d9ce79788397670c3df628e2f91015dd6 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Tue, 6 Mar 2018 15:11:10 +0100
Subject: [PATCH] Auto-generate wrappers for RFFI functions in testrffi

---
 .../r/ffi/codegen/FFITestsCodeGen.java        | 208 ++++
 .../ffi/impl/common/JavaUpCallsRFFIImpl.java  |  18 +-
 .../r/ffi/impl/upcalls/FastRUpCalls.java      |  44 +
 .../r/ffi/impl/upcalls/StdUpCallsRFFI.java    |  34 +-
 .../r/ffi/impl/upcalls/UpCallsRFFI.java       |   4 +-
 .../ffi/impl/upcalls/VariableUpCallsRFFI.java |   5 +-
 .../fficall/src/common/rffi_upcallsindex.h    |  12 +-
 .../Rinternals_truffle_common.h               |   2 +-
 .../fficall/src/truffle_common/Rmath.c        |   6 +-
 com.oracle.truffle.r.native/version.source    |   2 +-
 .../packages/testrffi/testrffi/NAMESPACE      |   1 +
 .../packages/testrffi/testrffi/R/testrffi.R   | 229 +++++
 .../packages/testrffi/testrffi/src/init.c     | 231 +++++
 .../testrffi/testrffi/src/rffiwrappers.c      | 973 ++++++++++++++++++
 .../testrffi/testrffi/src/rffiwrappers.h      | 483 +++++++++
 .../packages/testrffi/testrffi/src/testrffi.c |   5 +-
 mx.fastr/suite.py                             |   2 +-
 17 files changed, 2210 insertions(+), 49 deletions(-)
 create mode 100644 com.oracle.truffle.r.ffi.codegen/src/com/oracle/truffle/r/ffi/codegen/FFITestsCodeGen.java
 create mode 100644 com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/FastRUpCalls.java
 create mode 100644 com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.c
 create mode 100644 com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.h

diff --git a/com.oracle.truffle.r.ffi.codegen/src/com/oracle/truffle/r/ffi/codegen/FFITestsCodeGen.java b/com.oracle.truffle.r.ffi.codegen/src/com/oracle/truffle/r/ffi/codegen/FFITestsCodeGen.java
new file mode 100644
index 0000000000..848b84ff86
--- /dev/null
+++ b/com.oracle.truffle.r.ffi.codegen/src/com/oracle/truffle/r/ffi/codegen/FFITestsCodeGen.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.ffi.codegen;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.oracle.truffle.r.ffi.impl.upcalls.StdUpCallsRFFI;
+import com.oracle.truffle.r.ffi.impl.upcalls.VariableUpCallsRFFI;
+import com.oracle.truffle.r.ffi.processor.RFFICpointer;
+import com.oracle.truffle.r.ffi.processor.RFFICstring;
+
+/**
+ * Generates 1) C wrapper that calls each RFFI function and converts between SEXP and primitive
+ * types, 2) sequence of calls to CALLDEF to register all those functions as ".Call" targets.
+ * 
+ * This creates R interface to all applicable RFFI functions. RFFI functions working with raw
+ * pointers are excluded.
+ * 
+ * The generated code is to be used in testrffi package located in
+ * "com.oracle.truffle.r.test.native/packages/testrffi/testrffi".
+ */
+public class FFITestsCodeGen {
+    private static final String FUN_PREFIX = "api_";
+    private static final HashSet<String> IGNORE_FUNS = new HashSet<>(Arrays.asList("Rf_duplicate", "SET_TYPEOF_FASTR", "R_ToplevelExec", "R_CleanUp", "R_ParseVector", "octsize", "R_NewHashedEnv"));
+
+    public static void main(String[] args) {
+        if (Arrays.stream(args).anyMatch(x -> "-init".equals(x))) {
+            generateCInit();
+        } else if (Arrays.stream(args).anyMatch(x -> "-h".equals(x))) {
+            generateH();
+        } else if (Arrays.stream(args).anyMatch(x -> "-r".equals(x))) {
+            generateR();
+        } else {
+            generateC();
+        }
+    }
+
+    private static void generateR() {
+        System.out.println("#############");
+        System.out.printf("# Code generated by %s class run with option '-r'\n", FFITestsCodeGen.class.getName());
+        System.out.println("# R wrappers for all the generated RFFI C wrappers\n");
+        getFFIMethods().forEach(method -> {
+            System.out.printf("api.%s <- function(...) .Call(C_api_%s, ...)\n", getName(method), getName(method));
+        });
+    }
+
+    private static void generateCInit() {
+        System.out.printf("// Code generated by %s class run with option '-init'\n", FFITestsCodeGen.class.getName());
+        System.out.println("// The following code registers all C functions that wrap RFFI functions and convert SEXP <-> primitive types.");
+        System.out.println("// The definitions of the C functions could be generated by the same Java class (but run without any option)");
+        System.out.println("// RFFI functions that take/return C pointers are ignored");
+        getFFIMethods().forEach(method -> {
+            System.out.printf("CALLDEF(%s%s, %d),\n", FUN_PREFIX, getName(method), method.getParameterCount());
+        });
+        System.out.println("// ---- end of generated code");
+    }
+
+    private static void generateH() {
+        System.out.println(COPYRIGHT);
+        System.out.printf("// Code generated by %s class run with option '-h'\n", FFITestsCodeGen.class.getName());
+        System.out.println("// See the corresponding C file for more details");
+        printIncludes();
+        getFFIMethods().forEach(method -> {
+            System.out.println(getDeclaration(method) + ";\n");
+        });
+    }
+
+    private static void generateC() {
+        System.out.println(COPYRIGHT);
+        System.out.printf("// Code generated by %s class", FFITestsCodeGen.class.getName());
+        System.out.println("// The following code defines a 'SEXP' variant of every RFFI function implemented in FastR");
+        System.out.println("// Run the same Java class with '-init' option to get sequence of CALLDEF statements that register those functions for use from R");
+        System.out.println("// RFFI functions that take/return C pointers are ignored");
+        printIncludes();
+        System.out.println("#include \"rffiwrappers.h\"\n");
+        System.out.println("#pragma GCC diagnostic push");
+        System.out.println("#pragma GCC diagnostic ignored \"-Wint-conversion\"\n");
+        System.out.println("#pragma GCC diagnostic ignored \"-Wincompatible-pointer-types\"\n");
+        getFFIMethods().forEach(method -> {
+            System.out.println(getDeclaration(method) + " {");
+            String stmt = String.format("%s(%s)", getName(method), Arrays.stream(method.getParameters()).map(FFITestsCodeGen::toCValue).collect(Collectors.joining(", ")));
+            System.out.println("    " + getReturnStmt(method.getReturnType(), stmt) + ';');
+            if (method.getReturnType() == void.class) {
+                System.out.println("    return R_NilValue;");
+            }
+            System.out.println("}\n");
+        });
+        System.out.println("#pragma GCC diagnostic pop");
+        System.out.println("#pragma GCC diagnostic pop");
+    }
+
+    private static String getDeclaration(Method method) {
+        return String.format("SEXP %s%s(", FUN_PREFIX, getName(method)) +
+                        Arrays.stream(method.getParameters()).map(p -> "SEXP " + p.getName()).collect(Collectors.joining(", ")) + ')';
+    }
+
+    private static String getName(Method m) {
+        return m.getName().replace("_FASTR", "").replace("FASTR_", "");
+    }
+
+    private static void printIncludes() {
+        System.out.print("#define NO_FASTR_REDEFINE\n" +
+                        "#include <R.h>\n" +
+                        "#include <Rdefines.h>\n" +
+                        "#include <Rinterface.h>\n" +
+                        "#include <Rinternals.h>\n" +
+                        "#include <Rinterface.h>\n" +
+                        "#include <R_ext/Parse.h>\n" +
+                        "#include <R_ext/Connections.h>\n" +
+                        "#include <Rmath.h>\n\n");
+    }
+
+    private static Stream<Method> getFFIMethods() {
+        return Arrays.stream(StdUpCallsRFFI.class.getMethods()).filter(m -> !ignoreMethod(m));
+    }
+
+    // ignore methods with C pointers, we only support SEXP, strings and primitives
+    private static boolean ignoreMethod(Method method) {
+        return IGNORE_FUNS.contains(method.getName()) || method.getAnnotation(RFFICpointer.class) != null ||
+                        Arrays.stream(method.getParameterAnnotations()).anyMatch(FFITestsCodeGen::anyCPointer);
+    }
+
+    private static String toCValue(Parameter param) {
+        if (param.getAnnotation(RFFICstring.class) != null || param.getType() == String.class) {
+            return "R_CHAR(STRING_ELT(" + param.getName() + ", 0))";
+        } else if (param.getType() == int.class || param.getType() == long.class || param.getType() == boolean.class) {
+            return "INTEGER_VALUE(" + param.getName() + ")";
+        } else if (param.getType() == double.class) {
+            return "NUMERIC_VALUE(" + param.getName() + ")";
+        } else {
+            return param.getName();
+        }
+    }
+
+    private static String getReturnStmt(Class<?> returnType, String value) {
+        return returnType == void.class ? value : ("return " + fromCValueToSEXP(returnType, value));
+    }
+
+    private static String fromCValueToSEXP(Class<?> fromType, String value) {
+        if (fromType == int.class || fromType == long.class) {
+            return "ScalarInteger(" + value + ")";
+        } else if (fromType == double.class) {
+            return "ScalarReal(" + value + ")";
+        } else if (fromType == boolean.class) {
+            return "ScalarLogical(" + value + ")";
+        } else if (fromType == String.class) {
+            return "ScalarString(Rf_mkString(" + value + "))";
+        } else if (fromType == Object.class) {
+            return value;
+        } else {
+            throw new RuntimeException("Unsupported return type of RFFI function: " + fromType.getSimpleName());
+        }
+    }
+
+    private static boolean anyCPointer(Annotation[] items) {
+        return Arrays.stream(items).anyMatch(a -> a.annotationType() == RFFICpointer.class);
+    }
+
+    private static final String COPYRIGHT = "/*\n" +
+                    " * Copyright (c) 2018, YEAR, Oracle and/or its affiliates. All rights reserved.\n" +
+                    " * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.\n" +
+                    " *\n" +
+                    " * This code is free software; you can redistribute it and/or modify it\n" +
+                    " * under the terms of the GNU General Public License version 2 only, as\n" +
+                    " * published by the Free Software Foundation.\n" +
+                    " *\n" +
+                    " * This code is distributed in the hope that it will be useful, but WITHOUT\n" +
+                    " * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n" +
+                    " * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n" +
+                    " * version 2 for more details (a copy is included in the LICENSE file that\n" +
+                    " * accompanied this code).\n" +
+                    " *\n" +
+                    " * You should have received a copy of the GNU General Public License version\n" +
+                    " * 2 along with this work; if not, write to the Free Software Foundation,\n" +
+                    " * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.\n" +
+                    " *\n" +
+                    " * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA\n" +
+                    " * or visit www.oracle.com if you need additional information or have any\n" +
+                    " * questions.\n" +
+                    " */\n".replace("YEAR", "" + Calendar.getInstance().get(Calendar.YEAR));
+}
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 91b9929d96..ad28b7e947 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
@@ -172,7 +172,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     }
 
     @Override
-    public RDoubleVector Rf_ScalarDouble(double value) {
+    public RDoubleVector Rf_ScalarReal(double value) {
         return RDataFactory.createDoubleVectorFromScalar(value);
     }
 
@@ -569,7 +569,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     }
 
     @Override
-    public Object SET_NAMED_FASTR(Object x, int v) {
+    public void SET_NAMED_FASTR(Object x, int v) {
         // Note: In GNUR this is a macro that sets the sxpinfo.named regardless of whether it makes
         // sense to name the actual value, for compatibilty we simply ignore values that are not
         // RShareable, e.g. RSymbol. However we ignore and report attemps to decrease the ref-count,
@@ -579,19 +579,16 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
             int actual = getNamed(r);
             if (v < actual) {
                 RError.warning(RError.NO_CALLER, RError.Message.GENERIC, "Native code attempted to decrease the reference count. This operation is ignored.");
-                return RNull.instance;
             }
             if (v == 2) {
                 // we play it safe: if the caller wants this instance to be shared, they may expect
                 // it to never become non-shared again, which could happen in FastR
                 r.makeSharedPermanent();
-                return RNull.instance;
             }
             if (v == 1 && r.isTemporary()) {
                 r.incRefCount();
             }
         }
-        return RNull.instance;
     }
 
     private static int getNamed(RShareable r) {
@@ -709,7 +706,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     }
 
     @Override
-    public Object SET_TAG(Object x, Object y) {
+    public void SET_TAG(Object x, Object y) {
         if (x instanceof RPairList) {
             ((RPairList) x).setTag(y);
         } else {
@@ -717,7 +714,6 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
             // at the moment, this can only be used to null out the pointer
             ((RExternalPtr) x).setTag(y);
         }
-        return y;
     }
 
     @Override
@@ -1631,17 +1627,17 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     }
 
     @Override
-    public double Rf_dnorm(double a, double b, double c, int d) {
+    public double Rf_dnorm4(double a, double b, double c, int d) {
         throw implementedAsNode();
     }
 
     @Override
-    public double Rf_pnorm(double a, double b, double c, int d, int e) {
+    public double Rf_pnorm5(double a, double b, double c, int d, int e) {
         throw implementedAsNode();
     }
 
     @Override
-    public double Rf_qnorm(double a, double b, double c, int d, int e) {
+    public double Rf_qnorm5(double a, double b, double c, int d, int e) {
         throw implementedAsNode();
     }
 
@@ -2094,7 +2090,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
     }
 
     @Override
-    public Object Rf_NonNullStringMatch(Object s, Object t) {
+    public boolean Rf_NonNullStringMatch(Object s, Object t) {
         throw implementedAsNode();
     }
 
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/FastRUpCalls.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/FastRUpCalls.java
new file mode 100644
index 0000000000..ce7ede653d
--- /dev/null
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/FastRUpCalls.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.ffi.impl.upcalls;
+
+/**
+ * Up-calls specific to FastR used in FastR native code and not exported as part of any API.
+ */
+public interface FastRUpCalls {
+    // Checkstyle: stop method name check
+
+    Object R_MethodsNamespace();
+
+    int FASTR_getConnectionChar(Object obj);
+
+    Object getSummaryDescription(Object x);
+
+    Object getConnectionClassString(Object x);
+
+    Object getOpenModeString(Object x);
+
+    boolean isSeekable(Object x);
+
+    void restoreHandlerStacks(Object savedHandlerStack);
+}
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 1e4f75b9fa..0e2b98f281 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
@@ -152,7 +152,7 @@ public interface StdUpCallsRFFI {
 
     Object Rf_ScalarLogical(int value);
 
-    Object Rf_ScalarDouble(double value);
+    Object Rf_ScalarReal(double value);
 
     Object Rf_ScalarString(Object value);
 
@@ -242,14 +242,19 @@ public interface StdUpCallsRFFI {
 
     void SET_VECTOR_ELT(Object x, long i, Object v);
 
+    @RFFICpointer
     Object RAW(Object x);
 
+    @RFFICpointer
     Object LOGICAL(Object x);
 
+    @RFFICpointer
     Object INTEGER(Object x);
 
+    @RFFICpointer
     Object REAL(Object x);
 
+    @RFFICpointer
     Object COMPLEX(Object x);
 
     Object STRING_ELT(Object x, long i);
@@ -258,7 +263,7 @@ public interface StdUpCallsRFFI {
 
     int NAMED(Object x);
 
-    Object SET_NAMED_FASTR(Object x, int v);
+    void SET_NAMED_FASTR(Object x, int v);
 
     Object SET_TYPEOF_FASTR(Object x, int v);
 
@@ -310,7 +315,7 @@ public interface StdUpCallsRFFI {
     @RFFIUpCallNode(CDDDRNode.class)
     Object CDDDR(Object e);
 
-    Object SET_TAG(Object x, Object y);
+    void SET_TAG(Object x, Object y);
 
     @RFFIUpCallNode(SETCARNode.class)
     Object SETCAR(Object x, Object y);
@@ -385,8 +390,6 @@ public interface StdUpCallsRFFI {
 
     Object R_ToplevelExec();
 
-    void restoreHandlerStacks(Object savedHandlerStack);
-
     int RDEBUG(Object x);
 
     void SET_RDEBUG(Object x, int v);
@@ -448,6 +451,7 @@ public interface StdUpCallsRFFI {
 
     Object PRCODE(Object x);
 
+    @RFFICpointer
     Object R_CHAR(Object x);
 
     @RFFIUpCallNode(NewCustomConnectionNode.class)
@@ -459,27 +463,15 @@ public interface StdUpCallsRFFI {
 
     Object R_GetConnection(int fd);
 
-    Object getSummaryDescription(Object x);
-
-    Object getConnectionClassString(Object x);
-
-    Object getOpenModeString(Object x);
-
-    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();
-
     @RFFIUpCallNode(Str2TypeNode.class)
     int Rf_str2type(@RFFICstring(convert = false) Object name);
 
-    int FASTR_getConnectionChar(Object obj);
-
     @RFFIUpCallNode(value = RandFunctionsNodes.RandFunction3_1Node.class, functionClass = Unif.DUnif.class)
     double Rf_dunif(double a, double b, double c, int d);
 
@@ -517,13 +509,13 @@ public interface StdUpCallsRFFI {
     double Rf_rnchisq(double a, double b);
 
     @RFFIUpCallNode(value = RandFunctionsNodes.RandFunction3_1Node.class, functionClass = DNorm.class)
-    double Rf_dnorm(double a, double b, double c, int d);
+    double Rf_dnorm4(double a, double b, double c, int d);
 
     @RFFIUpCallNode(value = RandFunctionsNodes.RandFunction3_2Node.class, functionClass = Pnorm.class)
-    double Rf_pnorm(double a, double b, double c, int d, int e);
+    double Rf_pnorm5(double a, double b, double c, int d, int e);
 
     @RFFIUpCallNode(value = RandFunctionsNodes.RandFunction3_2Node.class, functionClass = Qnorm.class)
-    double Rf_qnorm(double a, double b, double c, int d, int e);
+    double Rf_qnorm5(double a, double b, double c, int d, int e);
 
     @RFFIUpCallNode(value = RandFunctionsNodes.RandFunction2Node.class, functionClass = Rnorm.class)
     double Rf_rnorm(double a, double b);
@@ -789,7 +781,7 @@ public interface StdUpCallsRFFI {
     Object Rf_match(Object itables, Object ix, int nmatch);
 
     @RFFIUpCallNode(MatchNodes.NonNullStringMatchNode.class)
-    Object Rf_NonNullStringMatch(Object s, Object t);
+    boolean Rf_NonNullStringMatch(Object s, Object t);
 
     @RFFIUpCallNode(MiscNodes.RHasSlotNode.class)
     int R_has_slot(Object container, Object name);
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/UpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/UpCallsRFFI.java
index 5170de9ef0..a1e3d36abf 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/UpCallsRFFI.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/UpCallsRFFI.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,6 @@ import com.oracle.truffle.r.ffi.processor.RFFIUpCallRoot;
  * Aggregation of all the FFI upcall interfaces.
  */
 @RFFIUpCallRoot
-public interface UpCallsRFFI extends StdUpCallsRFFI, IDEUpCallsRFFI, VariableUpCallsRFFI, DLLUpCallsRFFI, MemoryUpCallsRFFI {
+public interface UpCallsRFFI extends StdUpCallsRFFI, IDEUpCallsRFFI, VariableUpCallsRFFI, DLLUpCallsRFFI, MemoryUpCallsRFFI, FastRUpCalls {
 
 }
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/VariableUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/VariableUpCallsRFFI.java
index 66e031b6b0..c3d4335038 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/VariableUpCallsRFFI.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/VariableUpCallsRFFI.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
 package com.oracle.truffle.r.ffi.impl.upcalls;
 
 import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.r.ffi.processor.RFFICpointer;
 
 /**
  * This exists because {@link TruffleObject} instances may not always be storable in memory, in all
@@ -45,10 +46,12 @@ public interface VariableUpCallsRFFI {
 
     // These may need to be upcalled in some implementations.
 
+    @RFFICpointer
     default Object R_Home() {
         return null;
     }
 
+    @RFFICpointer
     default Object R_TempDir() {
         return null;
     }
diff --git a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h
index 17342d6c37..3174c03b89 100644
--- a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h
+++ b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h
@@ -95,9 +95,9 @@
 #define Rf_NonNullStringMatch_x 90
 #define Rf_PairToVectorList_x 91
 #define Rf_PrintValue_x 92
-#define Rf_ScalarDouble_x 93
-#define Rf_ScalarInteger_x 94
-#define Rf_ScalarLogical_x 95
+#define Rf_ScalarInteger_x 93
+#define Rf_ScalarLogical_x 94
+#define Rf_ScalarReal_x 95
 #define Rf_ScalarString_x 96
 #define Rf_VectorToPairList_x 97
 #define Rf_allocArray_x 98
@@ -133,7 +133,7 @@
 #define Rf_dnbinom_mu_x 128
 #define Rf_dnchisq_x 129
 #define Rf_dnf_x 130
-#define Rf_dnorm_x 131
+#define Rf_dnorm4_x 131
 #define Rf_dnt_x 132
 #define Rf_dpois_x 133
 #define Rf_dsignrank_x 134
@@ -179,7 +179,7 @@
 #define Rf_pnbinom_mu_x 174
 #define Rf_pnchisq_x 175
 #define Rf_pnf_x 176
-#define Rf_pnorm_x 177
+#define Rf_pnorm5_x 177
 #define Rf_pnt_x 178
 #define Rf_ppois_x 179
 #define Rf_protect_x 180
@@ -205,7 +205,7 @@
 #define Rf_qnbinom_mu_x 200
 #define Rf_qnchisq_x 201
 #define Rf_qnf_x 202
-#define Rf_qnorm_x 203
+#define Rf_qnorm5_x 203
 #define Rf_qnt_x 204
 #define Rf_qpois_x 205
 #define Rf_qsignrank_x 206
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h
index 5edea4d43b..70f1a481e0 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h
@@ -309,7 +309,7 @@ SEXP Rf_ScalarInteger(int value) {
 
 SEXP Rf_ScalarReal(double value) {
     TRACE0();
-    SEXP result = ((call_Rf_ScalarReal) callbacks[Rf_ScalarDouble_x])(value);
+    SEXP result = ((call_Rf_ScalarReal) callbacks[Rf_ScalarReal_x])(value);
     checkExitCall();
     return result;
 }
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rmath.c b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rmath.c
index b06cd4087e..8abb058e00 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rmath.c
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rmath.c
@@ -24,7 +24,7 @@
 #include "rffi_upcalls.h"
 
 double Rf_dnorm(double a, double b, double c, int d) {
-    return ((call_Rf_dnorm) callbacks[Rf_dnorm_x])(a, b, c, d);
+    return ((call_Rf_dnorm) callbacks[Rf_dnorm4_x])(a, b, c, d);
 }
 
 double Rf_dnorm4(double a, double b, double c, int d) {
@@ -32,7 +32,7 @@ double Rf_dnorm4(double a, double b, double c, int d) {
 }
 
 double Rf_pnorm(double a, double b, double c, int d, int e) {
-    return ((call_Rf_pnorm) callbacks[Rf_pnorm_x])(a, b, c, d, e);
+    return ((call_Rf_pnorm) callbacks[Rf_pnorm5_x])(a, b, c, d, e);
 }
 
 double Rf_pnorm5(double a, double b, double c, int d, int e) {
@@ -40,7 +40,7 @@ double Rf_pnorm5(double a, double b, double c, int d, int e) {
 }
 
 double Rf_qnorm(double a, double b, double c, int d, int e) {
-    return ((call_Rf_qnorm) callbacks[Rf_qnorm_x])(a, b, c, d, e);
+    return ((call_Rf_qnorm) callbacks[Rf_qnorm5_x])(a, b, c, d, e);
 }
 
 double Rf_qnorm5(double a, double b, double c, int d, int e) {
diff --git a/com.oracle.truffle.r.native/version.source b/com.oracle.truffle.r.native/version.source
index e1617e842a..8c61d23e12 100644
--- a/com.oracle.truffle.r.native/version.source
+++ b/com.oracle.truffle.r.native/version.source
@@ -1 +1 @@
-57
+58
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/NAMESPACE b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/NAMESPACE
index d4740fb354..8e044208eb 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/NAMESPACE
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/NAMESPACE
@@ -3,3 +3,4 @@ useDynLib(testrffi, .registration = TRUE, .fixes = "C_")
 
 ## and exported functions
 exportPattern("rffi\\..*")
+exportPattern("api\\..*")
\ No newline at end of file
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
index 54ea96bf5f..4f186c345d 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/R/testrffi.R
@@ -224,3 +224,232 @@ rffi.RfRMultinom <- function() {
 rffi.RfFunctions <- function() {
 	.Call('test_RfFunctions')
 }
+
+#############
+# Code generated by com.oracle.truffle.r.ffi.codegen.FFITestsCodeGen class run with option '-r'
+# R wrappers for all the generated RFFI C wrappers
+
+api.Rf_ScalarInteger <- function(...) .Call(C_api_Rf_ScalarInteger, ...)
+api.Rf_ScalarLogical <- function(...) .Call(C_api_Rf_ScalarLogical, ...)
+api.Rf_ScalarString <- function(...) .Call(C_api_Rf_ScalarString, ...)
+api.Rf_asInteger <- function(...) .Call(C_api_Rf_asInteger, ...)
+api.Rf_asReal <- function(...) .Call(C_api_Rf_asReal, ...)
+api.Rf_asLogical <- function(...) .Call(C_api_Rf_asLogical, ...)
+api.Rf_ScalarReal <- function(...) .Call(C_api_Rf_ScalarReal, ...)
+api.Rf_asChar <- function(...) .Call(C_api_Rf_asChar, ...)
+api.Rf_coerceVector <- function(...) .Call(C_api_Rf_coerceVector, ...)
+api.Rf_mkCharLenCE <- function(...) .Call(C_api_Rf_mkCharLenCE, ...)
+api.Rf_cons <- function(...) .Call(C_api_Rf_cons, ...)
+api.Rf_defineVar <- function(...) .Call(C_api_Rf_defineVar, ...)
+api.R_getClassDef <- function(...) .Call(C_api_R_getClassDef, ...)
+api.R_do_MAKE_CLASS <- function(...) .Call(C_api_R_do_MAKE_CLASS, ...)
+api.R_do_new_object <- function(...) .Call(C_api_R_do_new_object, ...)
+api.Rf_findVar <- function(...) .Call(C_api_Rf_findVar, ...)
+api.Rf_findVarInFrame <- function(...) .Call(C_api_Rf_findVarInFrame, ...)
+api.Rf_findVarInFrame3 <- function(...) .Call(C_api_Rf_findVarInFrame3, ...)
+api.ATTRIB <- function(...) .Call(C_api_ATTRIB, ...)
+api.Rf_getAttrib <- function(...) .Call(C_api_Rf_getAttrib, ...)
+api.Rf_setAttrib <- function(...) .Call(C_api_Rf_setAttrib, ...)
+api.Rf_inherits <- function(...) .Call(C_api_Rf_inherits, ...)
+api.Rf_install <- function(...) .Call(C_api_Rf_install, ...)
+api.Rf_installChar <- function(...) .Call(C_api_Rf_installChar, ...)
+api.Rf_lengthgets <- function(...) .Call(C_api_Rf_lengthgets, ...)
+api.Rf_isString <- function(...) .Call(C_api_Rf_isString, ...)
+api.Rf_isNull <- function(...) .Call(C_api_Rf_isNull, ...)
+api.Rf_PairToVectorList <- function(...) .Call(C_api_Rf_PairToVectorList, ...)
+api.Rf_error <- function(...) .Call(C_api_Rf_error, ...)
+api.Rf_warning <- function(...) .Call(C_api_Rf_warning, ...)
+api.Rf_warningcall <- function(...) .Call(C_api_Rf_warningcall, ...)
+api.Rf_errorcall <- function(...) .Call(C_api_Rf_errorcall, ...)
+api.Rf_allocVector <- function(...) .Call(C_api_Rf_allocVector, ...)
+api.Rf_allocArray <- function(...) .Call(C_api_Rf_allocArray, ...)
+api.Rf_allocMatrix <- function(...) .Call(C_api_Rf_allocMatrix, ...)
+api.Rf_nrows <- function(...) .Call(C_api_Rf_nrows, ...)
+api.Rf_ncols <- function(...) .Call(C_api_Rf_ncols, ...)
+api.LENGTH <- function(...) .Call(C_api_LENGTH, ...)
+api.SET_STRING_ELT <- function(...) .Call(C_api_SET_STRING_ELT, ...)
+api.SET_VECTOR_ELT <- function(...) .Call(C_api_SET_VECTOR_ELT, ...)
+api.STRING_ELT <- function(...) .Call(C_api_STRING_ELT, ...)
+api.VECTOR_ELT <- function(...) .Call(C_api_VECTOR_ELT, ...)
+api.NAMED <- function(...) .Call(C_api_NAMED, ...)
+api.SET_NAMED <- function(...) .Call(C_api_SET_NAMED, ...)
+api.TYPEOF <- function(...) .Call(C_api_TYPEOF, ...)
+api.Rf_any_duplicated <- function(...) .Call(C_api_Rf_any_duplicated, ...)
+api.Rf_any_duplicated3 <- function(...) .Call(C_api_Rf_any_duplicated3, ...)
+api.PRINTNAME <- function(...) .Call(C_api_PRINTNAME, ...)
+api.TAG <- function(...) .Call(C_api_TAG, ...)
+api.CAR <- function(...) .Call(C_api_CAR, ...)
+api.CAAR <- function(...) .Call(C_api_CAAR, ...)
+api.CDR <- function(...) .Call(C_api_CDR, ...)
+api.CDAR <- function(...) .Call(C_api_CDAR, ...)
+api.CADR <- function(...) .Call(C_api_CADR, ...)
+api.CADDR <- function(...) .Call(C_api_CADDR, ...)
+api.CADDDR <- function(...) .Call(C_api_CADDDR, ...)
+api.CAD4R <- function(...) .Call(C_api_CAD4R, ...)
+api.CDDR <- function(...) .Call(C_api_CDDR, ...)
+api.CDDDR <- function(...) .Call(C_api_CDDDR, ...)
+api.SET_TAG <- function(...) .Call(C_api_SET_TAG, ...)
+api.SETCAR <- function(...) .Call(C_api_SETCAR, ...)
+api.SETCDR <- function(...) .Call(C_api_SETCDR, ...)
+api.FORMALS <- function(...) .Call(C_api_FORMALS, ...)
+api.BODY <- function(...) .Call(C_api_BODY, ...)
+api.CLOENV <- function(...) .Call(C_api_CLOENV, ...)
+api.SET_FORMALS <- function(...) .Call(C_api_SET_FORMALS, ...)
+api.SET_BODY <- function(...) .Call(C_api_SET_BODY, ...)
+api.SET_CLOENV <- function(...) .Call(C_api_SET_CLOENV, ...)
+api.SETCADR <- function(...) .Call(C_api_SETCADR, ...)
+api.SETCADDR <- function(...) .Call(C_api_SETCADDR, ...)
+api.SETCADDDR <- function(...) .Call(C_api_SETCADDDR, ...)
+api.SETCAD4R <- function(...) .Call(C_api_SETCAD4R, ...)
+api.SYMVALUE <- function(...) .Call(C_api_SYMVALUE, ...)
+api.SET_SYMVALUE <- function(...) .Call(C_api_SET_SYMVALUE, ...)
+api.R_BindingIsLocked <- function(...) .Call(C_api_R_BindingIsLocked, ...)
+api.R_LockBinding <- function(...) .Call(C_api_R_LockBinding, ...)
+api.R_unLockBinding <- function(...) .Call(C_api_R_unLockBinding, ...)
+api.R_FindNamespace <- function(...) .Call(C_api_R_FindNamespace, ...)
+api.Rf_eval <- function(...) .Call(C_api_Rf_eval, ...)
+api.Rf_findFun <- function(...) .Call(C_api_Rf_findFun, ...)
+api.Rf_GetOption1 <- function(...) .Call(C_api_Rf_GetOption1, ...)
+api.Rf_gsetVar <- function(...) .Call(C_api_Rf_gsetVar, ...)
+api.DUPLICATE_ATTRIB <- function(...) .Call(C_api_DUPLICATE_ATTRIB, ...)
+api.R_compute_identical <- function(...) .Call(C_api_R_compute_identical, ...)
+api.Rf_copyListMatrix <- function(...) .Call(C_api_Rf_copyListMatrix, ...)
+api.Rf_copyMatrix <- function(...) .Call(C_api_Rf_copyMatrix, ...)
+api.RDEBUG <- function(...) .Call(C_api_RDEBUG, ...)
+api.SET_RDEBUG <- function(...) .Call(C_api_SET_RDEBUG, ...)
+api.RSTEP <- function(...) .Call(C_api_RSTEP, ...)
+api.SET_RSTEP <- function(...) .Call(C_api_SET_RSTEP, ...)
+api.ENCLOS <- function(...) .Call(C_api_ENCLOS, ...)
+api.PRVALUE <- function(...) .Call(C_api_PRVALUE, ...)
+api.R_lsInternal3 <- function(...) .Call(C_api_R_lsInternal3, ...)
+api.R_HomeDir <- function(...) .Call(C_api_R_HomeDir, ...)
+api.IS_S4_OBJECT <- function(...) .Call(C_api_IS_S4_OBJECT, ...)
+api.SET_S4_OBJECT <- function(...) .Call(C_api_SET_S4_OBJECT, ...)
+api.UNSET_S4_OBJECT <- function(...) .Call(C_api_UNSET_S4_OBJECT, ...)
+api.Rprintf <- function(...) .Call(C_api_Rprintf, ...)
+api.GetRNGstate <- function(...) .Call(C_api_GetRNGstate, ...)
+api.PutRNGstate <- function(...) .Call(C_api_PutRNGstate, ...)
+api.unif_rand <- function(...) .Call(C_api_unif_rand, ...)
+api.Rf_classgets <- function(...) .Call(C_api_Rf_classgets, ...)
+api.R_ExternalPtrAddr <- function(...) .Call(C_api_R_ExternalPtrAddr, ...)
+api.R_ExternalPtrTag <- function(...) .Call(C_api_R_ExternalPtrTag, ...)
+api.R_ExternalPtrProtected <- function(...) .Call(C_api_R_ExternalPtrProtected, ...)
+api.R_SetExternalPtrAddr <- function(...) .Call(C_api_R_SetExternalPtrAddr, ...)
+api.R_SetExternalPtrTag <- function(...) .Call(C_api_R_SetExternalPtrTag, ...)
+api.R_SetExternalPtrProtected <- function(...) .Call(C_api_R_SetExternalPtrProtected, ...)
+api.PRSEEN <- function(...) .Call(C_api_PRSEEN, ...)
+api.PRENV <- function(...) .Call(C_api_PRENV, ...)
+api.R_PromiseExpr <- function(...) .Call(C_api_R_PromiseExpr, ...)
+api.PRCODE <- function(...) .Call(C_api_PRCODE, ...)
+api.R_new_custom_connection <- function(...) .Call(C_api_R_new_custom_connection, ...)
+api.R_ReadConnection <- function(...) .Call(C_api_R_ReadConnection, ...)
+api.R_WriteConnection <- function(...) .Call(C_api_R_WriteConnection, ...)
+api.R_GetConnection <- function(...) .Call(C_api_R_GetConnection, ...)
+api.R_do_slot <- function(...) .Call(C_api_R_do_slot, ...)
+api.R_do_slot_assign <- function(...) .Call(C_api_R_do_slot_assign, ...)
+api.Rf_str2type <- function(...) .Call(C_api_Rf_str2type, ...)
+api.Rf_dunif <- function(...) .Call(C_api_Rf_dunif, ...)
+api.Rf_qunif <- function(...) .Call(C_api_Rf_qunif, ...)
+api.Rf_punif <- function(...) .Call(C_api_Rf_punif, ...)
+api.Rf_runif <- function(...) .Call(C_api_Rf_runif, ...)
+api.Rf_dchisq <- function(...) .Call(C_api_Rf_dchisq, ...)
+api.Rf_pchisq <- function(...) .Call(C_api_Rf_pchisq, ...)
+api.Rf_qchisq <- function(...) .Call(C_api_Rf_qchisq, ...)
+api.Rf_rchisq <- function(...) .Call(C_api_Rf_rchisq, ...)
+api.Rf_dnchisq <- function(...) .Call(C_api_Rf_dnchisq, ...)
+api.Rf_pnchisq <- function(...) .Call(C_api_Rf_pnchisq, ...)
+api.Rf_qnchisq <- function(...) .Call(C_api_Rf_qnchisq, ...)
+api.Rf_rnchisq <- function(...) .Call(C_api_Rf_rnchisq, ...)
+api.Rf_dnorm4 <- function(...) .Call(C_api_Rf_dnorm4, ...)
+api.Rf_pnorm5 <- function(...) .Call(C_api_Rf_pnorm5, ...)
+api.Rf_qnorm5 <- function(...) .Call(C_api_Rf_qnorm5, ...)
+api.Rf_rnorm <- function(...) .Call(C_api_Rf_rnorm, ...)
+api.Rf_dlnorm <- function(...) .Call(C_api_Rf_dlnorm, ...)
+api.Rf_plnorm <- function(...) .Call(C_api_Rf_plnorm, ...)
+api.Rf_qlnorm <- function(...) .Call(C_api_Rf_qlnorm, ...)
+api.Rf_rlnorm <- function(...) .Call(C_api_Rf_rlnorm, ...)
+api.Rf_dgamma <- function(...) .Call(C_api_Rf_dgamma, ...)
+api.Rf_pgamma <- function(...) .Call(C_api_Rf_pgamma, ...)
+api.Rf_qgamma <- function(...) .Call(C_api_Rf_qgamma, ...)
+api.Rf_rgamma <- function(...) .Call(C_api_Rf_rgamma, ...)
+api.Rf_dbeta <- function(...) .Call(C_api_Rf_dbeta, ...)
+api.Rf_pbeta <- function(...) .Call(C_api_Rf_pbeta, ...)
+api.Rf_qbeta <- function(...) .Call(C_api_Rf_qbeta, ...)
+api.Rf_rbeta <- function(...) .Call(C_api_Rf_rbeta, ...)
+api.Rf_df <- function(...) .Call(C_api_Rf_df, ...)
+api.Rf_pf <- function(...) .Call(C_api_Rf_pf, ...)
+api.Rf_qf <- function(...) .Call(C_api_Rf_qf, ...)
+api.Rf_rf <- function(...) .Call(C_api_Rf_rf, ...)
+api.Rf_dt <- function(...) .Call(C_api_Rf_dt, ...)
+api.Rf_pt <- function(...) .Call(C_api_Rf_pt, ...)
+api.Rf_qt <- function(...) .Call(C_api_Rf_qt, ...)
+api.Rf_rt <- function(...) .Call(C_api_Rf_rt, ...)
+api.Rf_dbinom <- function(...) .Call(C_api_Rf_dbinom, ...)
+api.Rf_pbinom <- function(...) .Call(C_api_Rf_pbinom, ...)
+api.Rf_qbinom <- function(...) .Call(C_api_Rf_qbinom, ...)
+api.Rf_rbinom <- function(...) .Call(C_api_Rf_rbinom, ...)
+api.Rf_dcauchy <- function(...) .Call(C_api_Rf_dcauchy, ...)
+api.Rf_pcauchy <- function(...) .Call(C_api_Rf_pcauchy, ...)
+api.Rf_qcauchy <- function(...) .Call(C_api_Rf_qcauchy, ...)
+api.Rf_rcauchy <- function(...) .Call(C_api_Rf_rcauchy, ...)
+api.Rf_dexp <- function(...) .Call(C_api_Rf_dexp, ...)
+api.Rf_pexp <- function(...) .Call(C_api_Rf_pexp, ...)
+api.Rf_qexp <- function(...) .Call(C_api_Rf_qexp, ...)
+api.Rf_rexp <- function(...) .Call(C_api_Rf_rexp, ...)
+api.Rf_dgeom <- function(...) .Call(C_api_Rf_dgeom, ...)
+api.Rf_pgeom <- function(...) .Call(C_api_Rf_pgeom, ...)
+api.Rf_qgeom <- function(...) .Call(C_api_Rf_qgeom, ...)
+api.Rf_rgeom <- function(...) .Call(C_api_Rf_rgeom, ...)
+api.Rf_dhyper <- function(...) .Call(C_api_Rf_dhyper, ...)
+api.Rf_phyper <- function(...) .Call(C_api_Rf_phyper, ...)
+api.Rf_qhyper <- function(...) .Call(C_api_Rf_qhyper, ...)
+api.Rf_rhyper <- function(...) .Call(C_api_Rf_rhyper, ...)
+api.Rf_dnbinom <- function(...) .Call(C_api_Rf_dnbinom, ...)
+api.Rf_pnbinom <- function(...) .Call(C_api_Rf_pnbinom, ...)
+api.Rf_qnbinom <- function(...) .Call(C_api_Rf_qnbinom, ...)
+api.Rf_rnbinom <- function(...) .Call(C_api_Rf_rnbinom, ...)
+api.Rf_dnbinom_mu <- function(...) .Call(C_api_Rf_dnbinom_mu, ...)
+api.Rf_pnbinom_mu <- function(...) .Call(C_api_Rf_pnbinom_mu, ...)
+api.Rf_qnbinom_mu <- function(...) .Call(C_api_Rf_qnbinom_mu, ...)
+api.Rf_rnbinom_mu <- function(...) .Call(C_api_Rf_rnbinom_mu, ...)
+api.Rf_dpois <- function(...) .Call(C_api_Rf_dpois, ...)
+api.Rf_ppois <- function(...) .Call(C_api_Rf_ppois, ...)
+api.Rf_qpois <- function(...) .Call(C_api_Rf_qpois, ...)
+api.Rf_rpois <- function(...) .Call(C_api_Rf_rpois, ...)
+api.Rf_dweibull <- function(...) .Call(C_api_Rf_dweibull, ...)
+api.Rf_pweibull <- function(...) .Call(C_api_Rf_pweibull, ...)
+api.Rf_qweibull <- function(...) .Call(C_api_Rf_qweibull, ...)
+api.Rf_rweibull <- function(...) .Call(C_api_Rf_rweibull, ...)
+api.Rf_dlogis <- function(...) .Call(C_api_Rf_dlogis, ...)
+api.Rf_plogis <- function(...) .Call(C_api_Rf_plogis, ...)
+api.Rf_qlogis <- function(...) .Call(C_api_Rf_qlogis, ...)
+api.Rf_rlogis <- function(...) .Call(C_api_Rf_rlogis, ...)
+api.Rf_dnbeta <- function(...) .Call(C_api_Rf_dnbeta, ...)
+api.Rf_pnbeta <- function(...) .Call(C_api_Rf_pnbeta, ...)
+api.Rf_qnbeta <- function(...) .Call(C_api_Rf_qnbeta, ...)
+api.Rf_dnf <- function(...) .Call(C_api_Rf_dnf, ...)
+api.Rf_pnf <- function(...) .Call(C_api_Rf_pnf, ...)
+api.Rf_qnf <- function(...) .Call(C_api_Rf_qnf, ...)
+api.Rf_dnt <- function(...) .Call(C_api_Rf_dnt, ...)
+api.Rf_pnt <- function(...) .Call(C_api_Rf_pnt, ...)
+api.Rf_qnt <- function(...) .Call(C_api_Rf_qnt, ...)
+api.Rf_ptukey <- function(...) .Call(C_api_Rf_ptukey, ...)
+api.Rf_qtukey <- function(...) .Call(C_api_Rf_qtukey, ...)
+api.Rf_dwilcox <- function(...) .Call(C_api_Rf_dwilcox, ...)
+api.Rf_pwilcox <- function(...) .Call(C_api_Rf_pwilcox, ...)
+api.Rf_qwilcox <- function(...) .Call(C_api_Rf_qwilcox, ...)
+api.Rf_rwilcox <- function(...) .Call(C_api_Rf_rwilcox, ...)
+api.Rf_dsignrank <- function(...) .Call(C_api_Rf_dsignrank, ...)
+api.Rf_psignrank <- function(...) .Call(C_api_Rf_psignrank, ...)
+api.Rf_qsignrank <- function(...) .Call(C_api_Rf_qsignrank, ...)
+api.Rf_rsignrank <- function(...) .Call(C_api_Rf_rsignrank, ...)
+api.Rf_ftrunc <- function(...) .Call(C_api_Rf_ftrunc, ...)
+api.Rf_namesgets <- function(...) .Call(C_api_Rf_namesgets, ...)
+api.Rf_copyMostAttrib <- function(...) .Call(C_api_Rf_copyMostAttrib, ...)
+api.Rf_VectorToPairList <- function(...) .Call(C_api_Rf_VectorToPairList, ...)
+api.Rf_asCharacterFactor <- function(...) .Call(C_api_Rf_asCharacterFactor, ...)
+api.Rf_match <- function(...) .Call(C_api_Rf_match, ...)
+api.Rf_NonNullStringMatch <- function(...) .Call(C_api_Rf_NonNullStringMatch, ...)
+api.R_has_slot <- function(...) .Call(C_api_R_has_slot, ...)
+api.Rf_PrintValue <- function(...) .Call(C_api_Rf_PrintValue, ...)
+api.OBJECT <- function(...) .Call(C_api_OBJECT, ...)
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c
index 72f204258e..ecea6b4040 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/init.c
@@ -20,10 +20,12 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+#define NO_FASTR_REDEFINE
 #include <R.h>
 #include <Rinternals.h>
 #include <R_ext/Rdynload.h>
 #include "testrffi.h"
+#include "rffiwrappers.h"
 
 static const R_CMethodDef CEntries[]  = {
     {"dotCModifiedArguments", (DL_FUNC) &dotCModifiedArguments, 5},
@@ -88,6 +90,235 @@ static const R_CallMethodDef CallEntries[] = {
         CALLDEF(test_RfRandomFunctions, 0),
         CALLDEF(test_RfRMultinom, 0),
         CALLDEF(test_RfFunctions, 0),
+        // Code generated by com.oracle.truffle.r.ffi.codegen.FFITestsCodeGen class run with option '-init'
+        // The following code registers all C functions that wrap RFFI functions and convert SEXP <-> primitive types.
+        // The definitions of the C functions could be generated by the same Java class (but run without any option)
+        // RFFI functions that take/return C pointers are ignored
+        CALLDEF(api_Rf_ScalarInteger, 1),
+        CALLDEF(api_Rf_ScalarLogical, 1),
+        CALLDEF(api_Rf_ScalarString, 1),
+        CALLDEF(api_Rf_asInteger, 1),
+        CALLDEF(api_Rf_ScalarReal, 1),
+        CALLDEF(api_Rf_asReal, 1),
+        CALLDEF(api_Rf_asLogical, 1),
+        CALLDEF(api_Rf_asChar, 1),
+        CALLDEF(api_Rf_coerceVector, 2),
+        CALLDEF(api_Rf_mkCharLenCE, 3),
+        CALLDEF(api_Rf_cons, 2),
+        CALLDEF(api_Rf_defineVar, 3),
+        CALLDEF(api_R_getClassDef, 1),
+        CALLDEF(api_R_do_MAKE_CLASS, 1),
+        CALLDEF(api_R_do_new_object, 1),
+        CALLDEF(api_Rf_findVar, 2),
+        CALLDEF(api_Rf_findVarInFrame, 2),
+        CALLDEF(api_Rf_findVarInFrame3, 3),
+        CALLDEF(api_ATTRIB, 1),
+        CALLDEF(api_Rf_getAttrib, 2),
+        CALLDEF(api_Rf_setAttrib, 3),
+        CALLDEF(api_Rf_inherits, 2),
+        CALLDEF(api_Rf_install, 1),
+        CALLDEF(api_Rf_installChar, 1),
+        CALLDEF(api_Rf_lengthgets, 2),
+        CALLDEF(api_Rf_isString, 1),
+        CALLDEF(api_Rf_isNull, 1),
+        CALLDEF(api_Rf_PairToVectorList, 1),
+        CALLDEF(api_Rf_error, 1),
+        CALLDEF(api_Rf_warning, 1),
+        CALLDEF(api_Rf_warningcall, 2),
+        CALLDEF(api_Rf_errorcall, 2),
+        CALLDEF(api_Rf_allocVector, 2),
+        CALLDEF(api_Rf_allocArray, 2),
+        CALLDEF(api_Rf_allocMatrix, 3),
+        CALLDEF(api_Rf_nrows, 1),
+        CALLDEF(api_Rf_ncols, 1),
+        CALLDEF(api_LENGTH, 1),
+        CALLDEF(api_SET_STRING_ELT, 3),
+        CALLDEF(api_SET_VECTOR_ELT, 3),
+        CALLDEF(api_STRING_ELT, 2),
+        CALLDEF(api_VECTOR_ELT, 2),
+        CALLDEF(api_NAMED, 1),
+        CALLDEF(api_SET_NAMED, 2),
+        CALLDEF(api_TYPEOF, 1),
+        CALLDEF(api_Rf_any_duplicated, 2),
+        CALLDEF(api_Rf_any_duplicated3, 3),
+        CALLDEF(api_PRINTNAME, 1),
+        CALLDEF(api_TAG, 1),
+        CALLDEF(api_CAR, 1),
+        CALLDEF(api_CAAR, 1),
+        CALLDEF(api_CDR, 1),
+        CALLDEF(api_CDAR, 1),
+        CALLDEF(api_CADR, 1),
+        CALLDEF(api_CADDR, 1),
+        CALLDEF(api_CADDDR, 1),
+        CALLDEF(api_CAD4R, 1),
+        CALLDEF(api_CDDR, 1),
+        CALLDEF(api_CDDDR, 1),
+        CALLDEF(api_SET_TAG, 2),
+        CALLDEF(api_SETCAR, 2),
+        CALLDEF(api_SETCDR, 2),
+        CALLDEF(api_FORMALS, 1),
+        CALLDEF(api_BODY, 1),
+        CALLDEF(api_CLOENV, 1),
+        CALLDEF(api_SET_FORMALS, 2),
+        CALLDEF(api_SET_BODY, 2),
+        CALLDEF(api_SET_CLOENV, 2),
+        CALLDEF(api_SETCADR, 2),
+        CALLDEF(api_SETCADDR, 2),
+        CALLDEF(api_SETCADDDR, 2),
+        CALLDEF(api_SETCAD4R, 2),
+        CALLDEF(api_SYMVALUE, 1),
+        CALLDEF(api_SET_SYMVALUE, 2),
+        CALLDEF(api_R_BindingIsLocked, 2),
+        CALLDEF(api_R_LockBinding, 2),
+        CALLDEF(api_R_unLockBinding, 2),
+        CALLDEF(api_R_FindNamespace, 1),
+        CALLDEF(api_Rf_eval, 2),
+        CALLDEF(api_Rf_findFun, 2),
+        CALLDEF(api_Rf_GetOption1, 1),
+        CALLDEF(api_Rf_gsetVar, 3),
+        CALLDEF(api_DUPLICATE_ATTRIB, 2),
+        CALLDEF(api_R_compute_identical, 3),
+        CALLDEF(api_Rf_copyListMatrix, 3),
+        CALLDEF(api_Rf_copyMatrix, 3),
+        CALLDEF(api_RDEBUG, 1),
+        CALLDEF(api_SET_RDEBUG, 2),
+        CALLDEF(api_RSTEP, 1),
+        CALLDEF(api_SET_RSTEP, 2),
+        CALLDEF(api_ENCLOS, 1),
+        CALLDEF(api_PRVALUE, 1),
+        CALLDEF(api_R_lsInternal3, 3),
+        CALLDEF(api_R_HomeDir, 0),
+        CALLDEF(api_IS_S4_OBJECT, 1),
+        CALLDEF(api_SET_S4_OBJECT, 1),
+        CALLDEF(api_UNSET_S4_OBJECT, 1),
+        CALLDEF(api_Rprintf, 1),
+        CALLDEF(api_GetRNGstate, 0),
+        CALLDEF(api_PutRNGstate, 0),
+        CALLDEF(api_unif_rand, 0),
+        CALLDEF(api_Rf_classgets, 2),
+        CALLDEF(api_R_ExternalPtrAddr, 1),
+        CALLDEF(api_R_ExternalPtrTag, 1),
+        CALLDEF(api_R_ExternalPtrProtected, 1),
+        CALLDEF(api_R_SetExternalPtrAddr, 2),
+        CALLDEF(api_R_SetExternalPtrTag, 2),
+        CALLDEF(api_R_SetExternalPtrProtected, 2),
+        CALLDEF(api_PRSEEN, 1),
+        CALLDEF(api_PRENV, 1),
+        CALLDEF(api_R_PromiseExpr, 1),
+        CALLDEF(api_PRCODE, 1),
+        CALLDEF(api_R_new_custom_connection, 4),
+        CALLDEF(api_R_ReadConnection, 3),
+        CALLDEF(api_R_WriteConnection, 3),
+        CALLDEF(api_R_GetConnection, 1),
+        CALLDEF(api_R_do_slot, 2),
+        CALLDEF(api_R_do_slot_assign, 3),
+        CALLDEF(api_Rf_str2type, 1),
+        CALLDEF(api_Rf_dunif, 4),
+        CALLDEF(api_Rf_qunif, 5),
+        CALLDEF(api_Rf_punif, 5),
+        CALLDEF(api_Rf_runif, 2),
+        CALLDEF(api_Rf_dchisq, 3),
+        CALLDEF(api_Rf_pchisq, 4),
+        CALLDEF(api_Rf_qchisq, 4),
+        CALLDEF(api_Rf_rchisq, 1),
+        CALLDEF(api_Rf_dnchisq, 4),
+        CALLDEF(api_Rf_pnchisq, 5),
+        CALLDEF(api_Rf_qnchisq, 5),
+        CALLDEF(api_Rf_rnchisq, 2),
+        CALLDEF(api_Rf_dnorm4, 4),
+        CALLDEF(api_Rf_pnorm5, 5),
+        CALLDEF(api_Rf_qnorm5, 5),
+        CALLDEF(api_Rf_rnorm, 2),
+        CALLDEF(api_Rf_dlnorm, 4),
+        CALLDEF(api_Rf_plnorm, 5),
+        CALLDEF(api_Rf_qlnorm, 5),
+        CALLDEF(api_Rf_rlnorm, 2),
+        CALLDEF(api_Rf_dgamma, 4),
+        CALLDEF(api_Rf_pgamma, 5),
+        CALLDEF(api_Rf_qgamma, 5),
+        CALLDEF(api_Rf_rgamma, 2),
+        CALLDEF(api_Rf_dbeta, 4),
+        CALLDEF(api_Rf_pbeta, 5),
+        CALLDEF(api_Rf_qbeta, 5),
+        CALLDEF(api_Rf_rbeta, 2),
+        CALLDEF(api_Rf_df, 4),
+        CALLDEF(api_Rf_pf, 5),
+        CALLDEF(api_Rf_qf, 5),
+        CALLDEF(api_Rf_rf, 2),
+        CALLDEF(api_Rf_dt, 3),
+        CALLDEF(api_Rf_pt, 4),
+        CALLDEF(api_Rf_qt, 4),
+        CALLDEF(api_Rf_rt, 1),
+        CALLDEF(api_Rf_dbinom, 4),
+        CALLDEF(api_Rf_pbinom, 5),
+        CALLDEF(api_Rf_qbinom, 5),
+        CALLDEF(api_Rf_rbinom, 2),
+        CALLDEF(api_Rf_dcauchy, 4),
+        CALLDEF(api_Rf_pcauchy, 5),
+        CALLDEF(api_Rf_qcauchy, 5),
+        CALLDEF(api_Rf_rcauchy, 2),
+        CALLDEF(api_Rf_dexp, 3),
+        CALLDEF(api_Rf_pexp, 4),
+        CALLDEF(api_Rf_qexp, 4),
+        CALLDEF(api_Rf_rexp, 1),
+        CALLDEF(api_Rf_dgeom, 3),
+        CALLDEF(api_Rf_pgeom, 4),
+        CALLDEF(api_Rf_qgeom, 4),
+        CALLDEF(api_Rf_rgeom, 1),
+        CALLDEF(api_Rf_dhyper, 5),
+        CALLDEF(api_Rf_phyper, 6),
+        CALLDEF(api_Rf_qhyper, 6),
+        CALLDEF(api_Rf_rhyper, 3),
+        CALLDEF(api_Rf_dnbinom, 4),
+        CALLDEF(api_Rf_pnbinom, 5),
+        CALLDEF(api_Rf_qnbinom, 5),
+        CALLDEF(api_Rf_rnbinom, 2),
+        CALLDEF(api_Rf_dnbinom_mu, 4),
+        CALLDEF(api_Rf_pnbinom_mu, 5),
+        CALLDEF(api_Rf_qnbinom_mu, 5),
+        CALLDEF(api_Rf_rnbinom_mu, 2),
+        CALLDEF(api_Rf_dpois, 3),
+        CALLDEF(api_Rf_ppois, 4),
+        CALLDEF(api_Rf_qpois, 4),
+        CALLDEF(api_Rf_rpois, 1),
+        CALLDEF(api_Rf_dweibull, 4),
+        CALLDEF(api_Rf_pweibull, 5),
+        CALLDEF(api_Rf_qweibull, 5),
+        CALLDEF(api_Rf_rweibull, 2),
+        CALLDEF(api_Rf_dlogis, 4),
+        CALLDEF(api_Rf_plogis, 5),
+        CALLDEF(api_Rf_qlogis, 5),
+        CALLDEF(api_Rf_rlogis, 2),
+        CALLDEF(api_Rf_dnbeta, 5),
+        CALLDEF(api_Rf_pnbeta, 6),
+        CALLDEF(api_Rf_qnbeta, 6),
+        CALLDEF(api_Rf_dnf, 5),
+        CALLDEF(api_Rf_pnf, 6),
+        CALLDEF(api_Rf_qnf, 6),
+        CALLDEF(api_Rf_dnt, 4),
+        CALLDEF(api_Rf_pnt, 5),
+        CALLDEF(api_Rf_qnt, 5),
+        CALLDEF(api_Rf_ptukey, 6),
+        CALLDEF(api_Rf_qtukey, 6),
+        CALLDEF(api_Rf_dwilcox, 4),
+        CALLDEF(api_Rf_pwilcox, 5),
+        CALLDEF(api_Rf_qwilcox, 5),
+        CALLDEF(api_Rf_rwilcox, 2),
+        CALLDEF(api_Rf_dsignrank, 3),
+        CALLDEF(api_Rf_psignrank, 4),
+        CALLDEF(api_Rf_qsignrank, 4),
+        CALLDEF(api_Rf_rsignrank, 1),
+        CALLDEF(api_Rf_ftrunc, 1),
+        CALLDEF(api_Rf_namesgets, 2),
+        CALLDEF(api_Rf_copyMostAttrib, 2),
+        CALLDEF(api_Rf_VectorToPairList, 1),
+        CALLDEF(api_Rf_asCharacterFactor, 1),
+        CALLDEF(api_Rf_match, 3),
+        CALLDEF(api_Rf_NonNullStringMatch, 2),
+        CALLDEF(api_R_has_slot, 2),
+        CALLDEF(api_Rf_PrintValue, 1),
+        CALLDEF(api_OBJECT, 1),
+        // ---- end of generated code
         {NULL, NULL, 0}
 };
 
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.c b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.c
new file mode 100644
index 0000000000..3a9ed90d86
--- /dev/null
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.c
@@ -0,0 +1,973 @@
+/*
+ * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// Code generated by com.oracle.truffle.r.ffi.codegen.FFITestsCodeGen class// The following code defines a 'SEXP' variant of every RFFI function implemented in FastR
+// Run the same Java class with '-init' option to get sequence of CALLDEF statements that register those functions for use from R
+// RFFI functions that take/return C pointers are ignored
+#define NO_FASTR_REDEFINE
+#include <R.h>
+#include <Rdefines.h>
+#include <Rinterface.h>
+#include <Rinternals.h>
+#include <Rinterface.h>
+#include <R_ext/Parse.h>
+#include <R_ext/Connections.h>
+#include <Rmath.h>
+
+#include "rffiwrappers.h"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wint-conversion"
+
+#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
+
+SEXP api_Rf_asInteger(SEXP x) {
+    return ScalarInteger(Rf_asInteger(x));
+}
+
+SEXP api_Rf_asReal(SEXP x) {
+    return ScalarReal(Rf_asReal(x));
+}
+
+SEXP api_Rf_ScalarInteger(SEXP value) {
+    return Rf_ScalarInteger(INTEGER_VALUE(value));
+}
+
+SEXP api_Rf_ScalarLogical(SEXP value) {
+    return Rf_ScalarLogical(INTEGER_VALUE(value));
+}
+
+SEXP api_Rf_ScalarReal(SEXP value) {
+    return Rf_ScalarReal(NUMERIC_VALUE(value));
+}
+
+SEXP api_Rf_ScalarString(SEXP value) {
+    return Rf_ScalarString(value);
+}
+
+SEXP api_Rf_asLogical(SEXP x) {
+    return ScalarInteger(Rf_asLogical(x));
+}
+
+SEXP api_Rf_asChar(SEXP x) {
+    return Rf_asChar(x);
+}
+
+SEXP api_Rf_coerceVector(SEXP x, SEXP mode) {
+    return Rf_coerceVector(x, INTEGER_VALUE(mode));
+}
+
+SEXP api_Rf_mkCharLenCE(SEXP bytes, SEXP len, SEXP encoding) {
+    return Rf_mkCharLenCE(R_CHAR(STRING_ELT(bytes, 0)), INTEGER_VALUE(len), INTEGER_VALUE(encoding));
+}
+
+SEXP api_Rf_cons(SEXP car, SEXP cdr) {
+    return Rf_cons(car, cdr);
+}
+
+SEXP api_Rf_defineVar(SEXP symbolArg, SEXP value, SEXP envArg) {
+    Rf_defineVar(symbolArg, value, envArg);
+    return R_NilValue;
+}
+
+SEXP api_R_getClassDef(SEXP clazz) {
+    return R_getClassDef(R_CHAR(STRING_ELT(clazz, 0)));
+}
+
+SEXP api_R_do_MAKE_CLASS(SEXP clazz) {
+    return R_do_MAKE_CLASS(R_CHAR(STRING_ELT(clazz, 0)));
+}
+
+SEXP api_R_do_new_object(SEXP classDef) {
+    return R_do_new_object(classDef);
+}
+
+SEXP api_Rf_findVar(SEXP symbolArg, SEXP envArg) {
+    return Rf_findVar(symbolArg, envArg);
+}
+
+SEXP api_Rf_findVarInFrame(SEXP envArg, SEXP symbolArg) {
+    return Rf_findVarInFrame(envArg, symbolArg);
+}
+
+SEXP api_Rf_findVarInFrame3(SEXP envArg, SEXP symbolArg, SEXP doGet) {
+    return Rf_findVarInFrame3(envArg, symbolArg, INTEGER_VALUE(doGet));
+}
+
+SEXP api_ATTRIB(SEXP obj) {
+    return ATTRIB(obj);
+}
+
+SEXP api_Rf_getAttrib(SEXP obj, SEXP name) {
+    return Rf_getAttrib(obj, name);
+}
+
+SEXP api_Rf_setAttrib(SEXP obj, SEXP name, SEXP val) {
+    Rf_setAttrib(obj, name, val);
+    return R_NilValue;
+}
+
+SEXP api_Rf_inherits(SEXP x, SEXP clazz) {
+    return ScalarInteger(Rf_inherits(x, R_CHAR(STRING_ELT(clazz, 0))));
+}
+
+SEXP api_Rf_install(SEXP name) {
+    return Rf_install(R_CHAR(STRING_ELT(name, 0)));
+}
+
+SEXP api_Rf_installChar(SEXP name) {
+    return Rf_installChar(name);
+}
+
+SEXP api_Rf_lengthgets(SEXP x, SEXP newSize) {
+    return Rf_lengthgets(x, INTEGER_VALUE(newSize));
+}
+
+SEXP api_Rf_isString(SEXP x) {
+    return ScalarInteger(Rf_isString(x));
+}
+
+SEXP api_Rf_isNull(SEXP x) {
+    return ScalarInteger(Rf_isNull(x));
+}
+
+SEXP api_Rf_PairToVectorList(SEXP x) {
+    return Rf_PairToVectorList(x);
+}
+
+SEXP api_Rf_error(SEXP msg) {
+    Rf_error(R_CHAR(STRING_ELT(msg, 0)));
+    return R_NilValue;
+}
+
+SEXP api_Rf_warning(SEXP msg) {
+    Rf_warning(R_CHAR(STRING_ELT(msg, 0)));
+    return R_NilValue;
+}
+
+SEXP api_Rf_warningcall(SEXP call, SEXP msg) {
+    Rf_warningcall(call, R_CHAR(STRING_ELT(msg, 0)));
+    return R_NilValue;
+}
+
+SEXP api_Rf_errorcall(SEXP call, SEXP msg) {
+    Rf_errorcall(call, R_CHAR(STRING_ELT(msg, 0)));
+    return R_NilValue;
+}
+
+SEXP api_Rf_allocVector(SEXP mode, SEXP n) {
+    return Rf_allocVector(INTEGER_VALUE(mode), INTEGER_VALUE(n));
+}
+
+SEXP api_Rf_allocArray(SEXP mode, SEXP dimsObj) {
+    return Rf_allocArray(INTEGER_VALUE(mode), dimsObj);
+}
+
+SEXP api_Rf_allocMatrix(SEXP mode, SEXP nrow, SEXP ncol) {
+    return Rf_allocMatrix(INTEGER_VALUE(mode), INTEGER_VALUE(nrow), INTEGER_VALUE(ncol));
+}
+
+SEXP api_Rf_nrows(SEXP x) {
+    return ScalarInteger(Rf_nrows(x));
+}
+
+SEXP api_Rf_ncols(SEXP x) {
+    return ScalarInteger(Rf_ncols(x));
+}
+
+SEXP api_LENGTH(SEXP x) {
+    return ScalarInteger(LENGTH(x));
+}
+
+SEXP api_SET_STRING_ELT(SEXP x, SEXP i, SEXP v) {
+    SET_STRING_ELT(x, INTEGER_VALUE(i), v);
+    return R_NilValue;
+}
+
+SEXP api_SET_VECTOR_ELT(SEXP x, SEXP i, SEXP v) {
+    SET_VECTOR_ELT(x, INTEGER_VALUE(i), v);
+    return R_NilValue;
+}
+
+SEXP api_STRING_ELT(SEXP x, SEXP i) {
+    return STRING_ELT(x, INTEGER_VALUE(i));
+}
+
+SEXP api_VECTOR_ELT(SEXP x, SEXP i) {
+    return VECTOR_ELT(x, INTEGER_VALUE(i));
+}
+
+SEXP api_NAMED(SEXP x) {
+    return ScalarInteger(NAMED(x));
+}
+
+SEXP api_SET_NAMED(SEXP x, SEXP v) {
+    SET_NAMED(x, INTEGER_VALUE(v));
+    return R_NilValue;
+}
+
+SEXP api_TYPEOF(SEXP x) {
+    return ScalarInteger(TYPEOF(x));
+}
+
+SEXP api_Rf_any_duplicated(SEXP x, SEXP fromLast) {
+    return ScalarInteger(Rf_any_duplicated(x, INTEGER_VALUE(fromLast)));
+}
+
+SEXP api_Rf_any_duplicated3(SEXP x, SEXP incomparables, SEXP fromLast) {
+    return ScalarInteger(Rf_any_duplicated3(x, incomparables, INTEGER_VALUE(fromLast)));
+}
+
+SEXP api_PRINTNAME(SEXP x) {
+    return PRINTNAME(x);
+}
+
+SEXP api_TAG(SEXP e) {
+    return TAG(e);
+}
+
+SEXP api_CAR(SEXP e) {
+    return CAR(e);
+}
+
+SEXP api_CAAR(SEXP e) {
+    return CAAR(e);
+}
+
+SEXP api_CDR(SEXP e) {
+    return CDR(e);
+}
+
+SEXP api_CDAR(SEXP e) {
+    return CDAR(e);
+}
+
+SEXP api_CADR(SEXP e) {
+    return CADR(e);
+}
+
+SEXP api_CADDR(SEXP e) {
+    return CADDR(e);
+}
+
+SEXP api_CADDDR(SEXP e) {
+    return CADDDR(e);
+}
+
+SEXP api_CAD4R(SEXP e) {
+    return CAD4R(e);
+}
+
+SEXP api_CDDR(SEXP e) {
+    return CDDR(e);
+}
+
+SEXP api_CDDDR(SEXP e) {
+    return CDDDR(e);
+}
+
+SEXP api_SET_TAG(SEXP x, SEXP y) {
+    SET_TAG(x, y);
+    return R_NilValue;
+}
+
+SEXP api_SETCAR(SEXP x, SEXP y) {
+    return SETCAR(x, y);
+}
+
+SEXP api_SETCDR(SEXP x, SEXP y) {
+    return SETCDR(x, y);
+}
+
+SEXP api_FORMALS(SEXP x) {
+    return FORMALS(x);
+}
+
+SEXP api_BODY(SEXP x) {
+    return BODY(x);
+}
+
+SEXP api_CLOENV(SEXP x) {
+    return CLOENV(x);
+}
+
+SEXP api_SET_FORMALS(SEXP x, SEXP y) {
+    SET_FORMALS(x, y);
+    return R_NilValue;
+}
+
+SEXP api_SET_BODY(SEXP x, SEXP y) {
+    SET_BODY(x, y);
+    return R_NilValue;
+}
+
+SEXP api_SET_CLOENV(SEXP x, SEXP y) {
+    SET_CLOENV(x, y);
+    return R_NilValue;
+}
+
+SEXP api_SETCADR(SEXP x, SEXP y) {
+    return SETCADR(x, y);
+}
+
+SEXP api_SETCADDR(SEXP x, SEXP y) {
+    return SETCADDR(x, y);
+}
+
+SEXP api_SETCADDDR(SEXP x, SEXP y) {
+    return SETCADDDR(x, y);
+}
+
+SEXP api_SETCAD4R(SEXP x, SEXP y) {
+    return SETCAD4R(x, y);
+}
+
+SEXP api_SYMVALUE(SEXP x) {
+    return SYMVALUE(x);
+}
+
+SEXP api_SET_SYMVALUE(SEXP x, SEXP v) {
+    SET_SYMVALUE(x, v);
+    return R_NilValue;
+}
+
+SEXP api_R_BindingIsLocked(SEXP sym, SEXP env) {
+    return ScalarInteger(R_BindingIsLocked(sym, env));
+}
+
+SEXP api_R_LockBinding(SEXP sym, SEXP env) {
+    R_LockBinding(sym, env);
+    return R_NilValue;
+}
+
+SEXP api_R_unLockBinding(SEXP sym, SEXP env) {
+    R_unLockBinding(sym, env);
+    return R_NilValue;
+}
+
+SEXP api_R_FindNamespace(SEXP name) {
+    return R_FindNamespace(name);
+}
+
+SEXP api_Rf_eval(SEXP expr, SEXP env) {
+    return Rf_eval(expr, env);
+}
+
+SEXP api_Rf_findFun(SEXP symbolObj, SEXP envObj) {
+    return Rf_findFun(symbolObj, envObj);
+}
+
+SEXP api_Rf_GetOption1(SEXP tag) {
+    return Rf_GetOption1(tag);
+}
+
+SEXP api_Rf_gsetVar(SEXP symbol, SEXP value, SEXP rho) {
+    Rf_gsetVar(symbol, value, rho);
+    return R_NilValue;
+}
+
+SEXP api_DUPLICATE_ATTRIB(SEXP to, SEXP from) {
+    DUPLICATE_ATTRIB(to, from);
+    return R_NilValue;
+}
+
+SEXP api_R_compute_identical(SEXP x, SEXP y, SEXP flags) {
+    return ScalarInteger(R_compute_identical(x, y, INTEGER_VALUE(flags)));
+}
+
+SEXP api_Rf_copyListMatrix(SEXP s, SEXP t, SEXP byrow) {
+    Rf_copyListMatrix(s, t, INTEGER_VALUE(byrow));
+    return R_NilValue;
+}
+
+SEXP api_Rf_copyMatrix(SEXP s, SEXP t, SEXP byrow) {
+    Rf_copyMatrix(s, t, INTEGER_VALUE(byrow));
+    return R_NilValue;
+}
+
+SEXP api_RDEBUG(SEXP x) {
+    return ScalarInteger(RDEBUG(x));
+}
+
+SEXP api_SET_RDEBUG(SEXP x, SEXP v) {
+    SET_RDEBUG(x, INTEGER_VALUE(v));
+    return R_NilValue;
+}
+
+SEXP api_RSTEP(SEXP x) {
+    return ScalarInteger(RSTEP(x));
+}
+
+SEXP api_SET_RSTEP(SEXP x, SEXP v) {
+    SET_RSTEP(x, INTEGER_VALUE(v));
+    return R_NilValue;
+}
+
+SEXP api_ENCLOS(SEXP x) {
+    return ENCLOS(x);
+}
+
+SEXP api_PRVALUE(SEXP x) {
+    return PRVALUE(x);
+}
+
+SEXP api_R_lsInternal3(SEXP envArg, SEXP allArg, SEXP sortedArg) {
+    return R_lsInternal3(envArg, INTEGER_VALUE(allArg), INTEGER_VALUE(sortedArg));
+}
+
+SEXP api_R_HomeDir() {
+    return ScalarString(Rf_mkString(R_HomeDir()));
+}
+
+SEXP api_IS_S4_OBJECT(SEXP x) {
+    return ScalarInteger(IS_S4_OBJECT(x));
+}
+
+SEXP api_SET_S4_OBJECT(SEXP x) {
+    SET_S4_OBJECT(x);
+    return R_NilValue;
+}
+
+SEXP api_UNSET_S4_OBJECT(SEXP x) {
+    UNSET_S4_OBJECT(x);
+    return R_NilValue;
+}
+
+SEXP api_Rprintf(SEXP message) {
+    Rprintf(R_CHAR(STRING_ELT(message, 0)));
+    return R_NilValue;
+}
+
+SEXP api_GetRNGstate() {
+    GetRNGstate();
+    return R_NilValue;
+}
+
+SEXP api_PutRNGstate() {
+    PutRNGstate();
+    return R_NilValue;
+}
+
+SEXP api_unif_rand() {
+    return ScalarReal(unif_rand());
+}
+
+SEXP api_Rf_classgets(SEXP x, SEXP y) {
+    return Rf_classgets(x, y);
+}
+
+SEXP api_R_ExternalPtrAddr(SEXP x) {
+    return ScalarInteger(R_ExternalPtrAddr(x));
+}
+
+SEXP api_R_ExternalPtrTag(SEXP x) {
+    return R_ExternalPtrTag(x);
+}
+
+SEXP api_R_ExternalPtrProtected(SEXP x) {
+    return R_ExternalPtrProtected(x);
+}
+
+SEXP api_R_SetExternalPtrAddr(SEXP x, SEXP addr) {
+    R_SetExternalPtrAddr(x, INTEGER_VALUE(addr));
+    return R_NilValue;
+}
+
+SEXP api_R_SetExternalPtrTag(SEXP x, SEXP tag) {
+    R_SetExternalPtrTag(x, tag);
+    return R_NilValue;
+}
+
+SEXP api_R_SetExternalPtrProtected(SEXP x, SEXP prot) {
+    R_SetExternalPtrProtected(x, prot);
+    return R_NilValue;
+}
+
+SEXP api_PRSEEN(SEXP x) {
+    return ScalarInteger(PRSEEN(x));
+}
+
+SEXP api_PRENV(SEXP x) {
+    return PRENV(x);
+}
+
+SEXP api_R_PromiseExpr(SEXP x) {
+    return R_PromiseExpr(x);
+}
+
+SEXP api_PRCODE(SEXP x) {
+    return PRCODE(x);
+}
+
+SEXP api_R_new_custom_connection(SEXP description, SEXP mode, SEXP className, SEXP readAddr) {
+    return R_new_custom_connection(R_CHAR(STRING_ELT(description, 0)), R_CHAR(STRING_ELT(mode, 0)), R_CHAR(STRING_ELT(className, 0)), readAddr);
+}
+
+SEXP api_R_ReadConnection(SEXP fd, SEXP bufAddress, SEXP size) {
+    return ScalarInteger(R_ReadConnection(INTEGER_VALUE(fd), INTEGER_VALUE(bufAddress), INTEGER_VALUE(size)));
+}
+
+SEXP api_R_WriteConnection(SEXP fd, SEXP bufAddress, SEXP size) {
+    return ScalarInteger(R_WriteConnection(INTEGER_VALUE(fd), INTEGER_VALUE(bufAddress), INTEGER_VALUE(size)));
+}
+
+SEXP api_R_GetConnection(SEXP fd) {
+    return R_GetConnection(INTEGER_VALUE(fd));
+}
+
+SEXP api_R_do_slot(SEXP o, SEXP name) {
+    return R_do_slot(o, name);
+}
+
+SEXP api_R_do_slot_assign(SEXP o, SEXP name, SEXP value) {
+    return R_do_slot_assign(o, name, value);
+}
+
+SEXP api_Rf_str2type(SEXP name) {
+    return ScalarInteger(Rf_str2type(R_CHAR(STRING_ELT(name, 0))));
+}
+
+SEXP api_Rf_dunif(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dunif(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qunif(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qunif(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_punif(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_punif(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_runif(SEXP a, SEXP b) {
+    return ScalarReal(Rf_runif(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dchisq(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_dchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c)));
+}
+
+SEXP api_Rf_pchisq(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_pchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qchisq(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_qchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_rchisq(SEXP a) {
+    return ScalarReal(Rf_rchisq(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_dnchisq(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dnchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pnchisq(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pnchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qnchisq(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qnchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rnchisq(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rnchisq(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dnorm4(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dnorm4(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pnorm5(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pnorm5(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qnorm5(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qnorm5(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rnorm(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rnorm(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dlnorm(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dlnorm(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_plnorm(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_plnorm(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qlnorm(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qlnorm(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rlnorm(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rlnorm(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dgamma(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dgamma(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pgamma(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pgamma(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qgamma(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qgamma(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rgamma(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rgamma(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dbeta(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rbeta(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_df(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_df(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pf(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qf(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rf(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rf(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dt(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_dt(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c)));
+}
+
+SEXP api_Rf_pt(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_pt(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qt(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_qt(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_rt(SEXP a) {
+    return ScalarReal(Rf_rt(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_dbinom(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rbinom(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dcauchy(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dcauchy(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pcauchy(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pcauchy(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qcauchy(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qcauchy(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rcauchy(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rcauchy(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dexp(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_dexp(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c)));
+}
+
+SEXP api_Rf_pexp(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_pexp(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qexp(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_qexp(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_rexp(SEXP a) {
+    return ScalarReal(Rf_rexp(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_dgeom(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_dgeom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c)));
+}
+
+SEXP api_Rf_pgeom(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_pgeom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qgeom(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_qgeom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_rgeom(SEXP a) {
+    return ScalarReal(Rf_rgeom(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_dhyper(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_dhyper(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_phyper(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_phyper(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_qhyper(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_qhyper(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_rhyper(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_rhyper(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c)));
+}
+
+SEXP api_Rf_dnbinom(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dnbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pnbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pnbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qnbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qnbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rnbinom(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rnbinom(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dnbinom_mu(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dnbinom_mu(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pnbinom_mu(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pnbinom_mu(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qnbinom_mu(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qnbinom_mu(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rnbinom_mu(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rnbinom_mu(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dpois(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_dpois(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c)));
+}
+
+SEXP api_Rf_ppois(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_ppois(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qpois(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_qpois(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_rpois(SEXP a) {
+    return ScalarReal(Rf_rpois(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_dweibull(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dweibull(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pweibull(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pweibull(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qweibull(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qweibull(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rweibull(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rweibull(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dlogis(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dlogis(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_plogis(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_plogis(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qlogis(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qlogis(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rlogis(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rlogis(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dnbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_dnbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_pnbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_pnbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_qnbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_qnbeta(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_dnf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_dnf(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_pnf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_pnf(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_qnf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_qnf(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_dnt(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dnt(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pnt(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pnt(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qnt(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qnt(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_ptukey(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_ptukey(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_qtukey(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f) {
+    return ScalarReal(Rf_qtukey(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), NUMERIC_VALUE(d), INTEGER_VALUE(e), INTEGER_VALUE(f)));
+}
+
+SEXP api_Rf_dwilcox(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_dwilcox(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_pwilcox(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_pwilcox(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_qwilcox(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e) {
+    return ScalarReal(Rf_qwilcox(NUMERIC_VALUE(a), NUMERIC_VALUE(b), NUMERIC_VALUE(c), INTEGER_VALUE(d), INTEGER_VALUE(e)));
+}
+
+SEXP api_Rf_rwilcox(SEXP a, SEXP b) {
+    return ScalarReal(Rf_rwilcox(NUMERIC_VALUE(a), NUMERIC_VALUE(b)));
+}
+
+SEXP api_Rf_dsignrank(SEXP a, SEXP b, SEXP c) {
+    return ScalarReal(Rf_dsignrank(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c)));
+}
+
+SEXP api_Rf_psignrank(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_psignrank(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_qsignrank(SEXP a, SEXP b, SEXP c, SEXP d) {
+    return ScalarReal(Rf_qsignrank(NUMERIC_VALUE(a), NUMERIC_VALUE(b), INTEGER_VALUE(c), INTEGER_VALUE(d)));
+}
+
+SEXP api_Rf_rsignrank(SEXP a) {
+    return ScalarReal(Rf_rsignrank(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_ftrunc(SEXP a) {
+    return ScalarReal(Rf_ftrunc(NUMERIC_VALUE(a)));
+}
+
+SEXP api_Rf_namesgets(SEXP vec, SEXP val) {
+    return Rf_namesgets(vec, val);
+}
+
+SEXP api_Rf_copyMostAttrib(SEXP x, SEXP y) {
+    Rf_copyMostAttrib(x, y);
+    return R_NilValue;
+}
+
+SEXP api_Rf_VectorToPairList(SEXP x) {
+    return Rf_VectorToPairList(x);
+}
+
+SEXP api_Rf_asCharacterFactor(SEXP x) {
+    return Rf_asCharacterFactor(x);
+}
+
+SEXP api_Rf_match(SEXP itables, SEXP ix, SEXP nmatch) {
+    return Rf_match(itables, ix, INTEGER_VALUE(nmatch));
+}
+
+SEXP api_Rf_NonNullStringMatch(SEXP s, SEXP t) {
+    return ScalarLogical(Rf_NonNullStringMatch(s, t));
+}
+
+SEXP api_R_has_slot(SEXP container, SEXP name) {
+    return ScalarInteger(R_has_slot(container, name));
+}
+
+SEXP api_Rf_PrintValue(SEXP value) {
+    Rf_PrintValue(value);
+    return R_NilValue;
+}
+
+SEXP api_OBJECT(SEXP x) {
+    return ScalarInteger(OBJECT(x));
+}
+
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.h b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.h
new file mode 100644
index 0000000000..c7a75d9107
--- /dev/null
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/rffiwrappers.h
@@ -0,0 +1,483 @@
+/*
+ * Copyright (c) 2018, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// Code generated by com.oracle.truffle.r.ffi.codegen.FFITestsCodeGen class run with option '-h'
+// See the corresponding C file for more details
+#define NO_FASTR_REDEFINE
+#include <R.h>
+#include <Rdefines.h>
+#include <Rinterface.h>
+#include <Rinternals.h>
+#include <Rinterface.h>
+#include <R_ext/Parse.h>
+#include <R_ext/Connections.h>
+#include <Rmath.h>
+
+SEXP api_Rf_ScalarInteger(SEXP value);
+
+SEXP api_Rf_ScalarReal(SEXP value);
+
+SEXP api_Rf_asReal(SEXP x);
+
+SEXP api_Rf_asLogical(SEXP x);
+
+SEXP api_Rf_ScalarString(SEXP value);
+
+SEXP api_Rf_asInteger(SEXP x);
+
+SEXP api_Rf_ScalarLogical(SEXP value);
+
+SEXP api_Rf_asChar(SEXP x);
+
+SEXP api_Rf_coerceVector(SEXP x, SEXP mode);
+
+SEXP api_Rf_mkCharLenCE(SEXP bytes, SEXP len, SEXP encoding);
+
+SEXP api_Rf_cons(SEXP car, SEXP cdr);
+
+SEXP api_Rf_defineVar(SEXP symbolArg, SEXP value, SEXP envArg);
+
+SEXP api_R_getClassDef(SEXP clazz);
+
+SEXP api_R_do_MAKE_CLASS(SEXP clazz);
+
+SEXP api_R_do_new_object(SEXP classDef);
+
+SEXP api_Rf_findVar(SEXP symbolArg, SEXP envArg);
+
+SEXP api_Rf_findVarInFrame(SEXP envArg, SEXP symbolArg);
+
+SEXP api_Rf_findVarInFrame3(SEXP envArg, SEXP symbolArg, SEXP doGet);
+
+SEXP api_ATTRIB(SEXP obj);
+
+SEXP api_Rf_getAttrib(SEXP obj, SEXP name);
+
+SEXP api_Rf_setAttrib(SEXP obj, SEXP name, SEXP val);
+
+SEXP api_Rf_inherits(SEXP x, SEXP clazz);
+
+SEXP api_Rf_install(SEXP name);
+
+SEXP api_Rf_installChar(SEXP name);
+
+SEXP api_Rf_lengthgets(SEXP x, SEXP newSize);
+
+SEXP api_Rf_isString(SEXP x);
+
+SEXP api_Rf_isNull(SEXP x);
+
+SEXP api_Rf_PairToVectorList(SEXP x);
+
+SEXP api_Rf_error(SEXP msg);
+
+SEXP api_Rf_warning(SEXP msg);
+
+SEXP api_Rf_warningcall(SEXP call, SEXP msg);
+
+SEXP api_Rf_errorcall(SEXP call, SEXP msg);
+
+SEXP api_Rf_allocVector(SEXP mode, SEXP n);
+
+SEXP api_Rf_allocArray(SEXP mode, SEXP dimsObj);
+
+SEXP api_Rf_allocMatrix(SEXP mode, SEXP nrow, SEXP ncol);
+
+SEXP api_Rf_nrows(SEXP x);
+
+SEXP api_Rf_ncols(SEXP x);
+
+SEXP api_LENGTH(SEXP x);
+
+SEXP api_SET_STRING_ELT(SEXP x, SEXP i, SEXP v);
+
+SEXP api_SET_VECTOR_ELT(SEXP x, SEXP i, SEXP v);
+
+SEXP api_STRING_ELT(SEXP x, SEXP i);
+
+SEXP api_VECTOR_ELT(SEXP x, SEXP i);
+
+SEXP api_NAMED(SEXP x);
+
+SEXP api_SET_NAMED(SEXP x, SEXP v);
+
+SEXP api_TYPEOF(SEXP x);
+
+SEXP api_Rf_any_duplicated(SEXP x, SEXP fromLast);
+
+SEXP api_Rf_any_duplicated3(SEXP x, SEXP incomparables, SEXP fromLast);
+
+SEXP api_PRINTNAME(SEXP x);
+
+SEXP api_TAG(SEXP e);
+
+SEXP api_CAR(SEXP e);
+
+SEXP api_CAAR(SEXP e);
+
+SEXP api_CDR(SEXP e);
+
+SEXP api_CDAR(SEXP e);
+
+SEXP api_CADR(SEXP e);
+
+SEXP api_CADDR(SEXP e);
+
+SEXP api_CADDDR(SEXP e);
+
+SEXP api_CAD4R(SEXP e);
+
+SEXP api_CDDR(SEXP e);
+
+SEXP api_CDDDR(SEXP e);
+
+SEXP api_SET_TAG(SEXP x, SEXP y);
+
+SEXP api_SETCAR(SEXP x, SEXP y);
+
+SEXP api_SETCDR(SEXP x, SEXP y);
+
+SEXP api_FORMALS(SEXP x);
+
+SEXP api_BODY(SEXP x);
+
+SEXP api_CLOENV(SEXP x);
+
+SEXP api_SET_FORMALS(SEXP x, SEXP y);
+
+SEXP api_SET_BODY(SEXP x, SEXP y);
+
+SEXP api_SET_CLOENV(SEXP x, SEXP y);
+
+SEXP api_SETCADR(SEXP x, SEXP y);
+
+SEXP api_SETCADDR(SEXP x, SEXP y);
+
+SEXP api_SETCADDDR(SEXP x, SEXP y);
+
+SEXP api_SETCAD4R(SEXP x, SEXP y);
+
+SEXP api_SYMVALUE(SEXP x);
+
+SEXP api_SET_SYMVALUE(SEXP x, SEXP v);
+
+SEXP api_R_BindingIsLocked(SEXP sym, SEXP env);
+
+SEXP api_R_LockBinding(SEXP sym, SEXP env);
+
+SEXP api_R_unLockBinding(SEXP sym, SEXP env);
+
+SEXP api_R_FindNamespace(SEXP name);
+
+SEXP api_Rf_eval(SEXP expr, SEXP env);
+
+SEXP api_Rf_findFun(SEXP symbolObj, SEXP envObj);
+
+SEXP api_Rf_GetOption1(SEXP tag);
+
+SEXP api_Rf_gsetVar(SEXP symbol, SEXP value, SEXP rho);
+
+SEXP api_DUPLICATE_ATTRIB(SEXP to, SEXP from);
+
+SEXP api_R_compute_identical(SEXP x, SEXP y, SEXP flags);
+
+SEXP api_Rf_copyListMatrix(SEXP s, SEXP t, SEXP byrow);
+
+SEXP api_Rf_copyMatrix(SEXP s, SEXP t, SEXP byrow);
+
+SEXP api_RDEBUG(SEXP x);
+
+SEXP api_SET_RDEBUG(SEXP x, SEXP v);
+
+SEXP api_RSTEP(SEXP x);
+
+SEXP api_SET_RSTEP(SEXP x, SEXP v);
+
+SEXP api_ENCLOS(SEXP x);
+
+SEXP api_PRVALUE(SEXP x);
+
+SEXP api_R_lsInternal3(SEXP envArg, SEXP allArg, SEXP sortedArg);
+
+SEXP api_R_HomeDir();
+
+SEXP api_IS_S4_OBJECT(SEXP x);
+
+SEXP api_SET_S4_OBJECT(SEXP x);
+
+SEXP api_UNSET_S4_OBJECT(SEXP x);
+
+SEXP api_Rprintf(SEXP message);
+
+SEXP api_GetRNGstate();
+
+SEXP api_PutRNGstate();
+
+SEXP api_unif_rand();
+
+SEXP api_Rf_classgets(SEXP x, SEXP y);
+
+SEXP api_R_ExternalPtrAddr(SEXP x);
+
+SEXP api_R_ExternalPtrTag(SEXP x);
+
+SEXP api_R_ExternalPtrProtected(SEXP x);
+
+SEXP api_R_SetExternalPtrAddr(SEXP x, SEXP addr);
+
+SEXP api_R_SetExternalPtrTag(SEXP x, SEXP tag);
+
+SEXP api_R_SetExternalPtrProtected(SEXP x, SEXP prot);
+
+SEXP api_PRSEEN(SEXP x);
+
+SEXP api_PRENV(SEXP x);
+
+SEXP api_R_PromiseExpr(SEXP x);
+
+SEXP api_PRCODE(SEXP x);
+
+SEXP api_R_new_custom_connection(SEXP description, SEXP mode, SEXP className, SEXP readAddr);
+
+SEXP api_R_ReadConnection(SEXP fd, SEXP bufAddress, SEXP size);
+
+SEXP api_R_WriteConnection(SEXP fd, SEXP bufAddress, SEXP size);
+
+SEXP api_R_GetConnection(SEXP fd);
+
+SEXP api_R_do_slot(SEXP o, SEXP name);
+
+SEXP api_R_do_slot_assign(SEXP o, SEXP name, SEXP value);
+
+SEXP api_Rf_str2type(SEXP name);
+
+SEXP api_Rf_dunif(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qunif(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_punif(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_runif(SEXP a, SEXP b);
+
+SEXP api_Rf_dchisq(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_pchisq(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qchisq(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_rchisq(SEXP a);
+
+SEXP api_Rf_dnchisq(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pnchisq(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qnchisq(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rnchisq(SEXP a, SEXP b);
+
+SEXP api_Rf_dnorm4(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pnorm5(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qnorm5(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rnorm(SEXP a, SEXP b);
+
+SEXP api_Rf_dlnorm(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_plnorm(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qlnorm(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rlnorm(SEXP a, SEXP b);
+
+SEXP api_Rf_dgamma(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pgamma(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qgamma(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rgamma(SEXP a, SEXP b);
+
+SEXP api_Rf_dbeta(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rbeta(SEXP a, SEXP b);
+
+SEXP api_Rf_df(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rf(SEXP a, SEXP b);
+
+SEXP api_Rf_dt(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_pt(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qt(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_rt(SEXP a);
+
+SEXP api_Rf_dbinom(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rbinom(SEXP a, SEXP b);
+
+SEXP api_Rf_dcauchy(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pcauchy(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qcauchy(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rcauchy(SEXP a, SEXP b);
+
+SEXP api_Rf_dexp(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_pexp(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qexp(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_rexp(SEXP a);
+
+SEXP api_Rf_dgeom(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_pgeom(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qgeom(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_rgeom(SEXP a);
+
+SEXP api_Rf_dhyper(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_phyper(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_qhyper(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_rhyper(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_dnbinom(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pnbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qnbinom(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rnbinom(SEXP a, SEXP b);
+
+SEXP api_Rf_dnbinom_mu(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pnbinom_mu(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qnbinom_mu(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rnbinom_mu(SEXP a, SEXP b);
+
+SEXP api_Rf_dpois(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_ppois(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qpois(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_rpois(SEXP a);
+
+SEXP api_Rf_dweibull(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pweibull(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qweibull(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rweibull(SEXP a, SEXP b);
+
+SEXP api_Rf_dlogis(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_plogis(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qlogis(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rlogis(SEXP a, SEXP b);
+
+SEXP api_Rf_dnbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_pnbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_qnbeta(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_dnf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_pnf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_qnf(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_dnt(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pnt(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qnt(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_ptukey(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_qtukey(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e, SEXP f);
+
+SEXP api_Rf_dwilcox(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_pwilcox(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_qwilcox(SEXP a, SEXP b, SEXP c, SEXP d, SEXP e);
+
+SEXP api_Rf_rwilcox(SEXP a, SEXP b);
+
+SEXP api_Rf_dsignrank(SEXP a, SEXP b, SEXP c);
+
+SEXP api_Rf_psignrank(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_qsignrank(SEXP a, SEXP b, SEXP c, SEXP d);
+
+SEXP api_Rf_rsignrank(SEXP a);
+
+SEXP api_Rf_ftrunc(SEXP a);
+
+SEXP api_Rf_namesgets(SEXP vec, SEXP val);
+
+SEXP api_Rf_copyMostAttrib(SEXP x, SEXP y);
+
+SEXP api_Rf_VectorToPairList(SEXP x);
+
+SEXP api_Rf_asCharacterFactor(SEXP x);
+
+SEXP api_Rf_match(SEXP itables, SEXP ix, SEXP nmatch);
+
+SEXP api_Rf_NonNullStringMatch(SEXP s, SEXP t);
+
+SEXP api_R_has_slot(SEXP container, SEXP name);
+
+SEXP api_Rf_PrintValue(SEXP value);
+
+SEXP api_OBJECT(SEXP x);
+
diff --git a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c
index 057eaa8954..0229801217 100644
--- a/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c
+++ b/com.oracle.truffle.r.test.native/packages/testrffi/testrffi/src/testrffi.c
@@ -32,6 +32,7 @@
 #include <R_ext/Connections.h>
 #include <R_ext/Parse.h>
 #include <string.h>
+#include <stdint.h>
 #include "testrffi.h"
 
 #define K_RMULTINOM 4
@@ -95,7 +96,7 @@ SEXP createExternalPtr(SEXP addr, SEXP tag, SEXP prot) {
 }
 
 SEXP getExternalPtrAddr(SEXP eptr) {
-	return ScalarInteger((int) R_ExternalPtrAddr(eptr));
+	return ScalarInteger((intptr_t) R_ExternalPtrAddr(eptr));
 }
 
 SEXP invoke_TYPEOF(SEXP x) {
@@ -374,7 +375,7 @@ SEXP test_isNAString(SEXP vec) {
 }
 
 SEXP test_getBytes(SEXP vec) {
-    char* bytes = R_CHAR(STRING_ELT(vec, 0));
+    const char* bytes = R_CHAR(STRING_ELT(vec, 0));
     SEXP result;
     PROTECT(result = allocVector(RAWSXP, Rf_length(STRING_ELT(vec, 0))));
     unsigned char* resData = RAW(result);
diff --git a/mx.fastr/suite.py b/mx.fastr/suite.py
index e83bac692d..be8f7caa50 100644
--- a/mx.fastr/suite.py
+++ b/mx.fastr/suite.py
@@ -261,7 +261,7 @@ suite = {
       "sourceDirs" : ["src"],
       "checkstyle" : "com.oracle.truffle.r.runtime",
       "dependencies" : [
-        "com.oracle.truffle.r.runtime"
+        "com.oracle.truffle.r.ffi.impl"
       ],
       "javaCompliance" : "1.8",
       "workingSets" : "FastR",
-- 
GitLab