From ee224fb89bc598145422faeb24c5166ecda31174 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Fri, 20 Oct 2017 10:59:11 +0200
Subject: [PATCH] RAPI: replace FastR specific symbols with GNUR compatible
 symbol names where possible

---
 .../fficall/src/common/rffi_variablesindex.h  |  98 ++--
 .../fficall/src/include/Defn.h                |  12 +-
 .../fficall/src/truffle_nfi/variables.c       | 436 ++++++------------
 .../truffle/r/runtime/ffi/RFFIVariables.java  |  76 ++-
 mx.fastr/mx_fastr_edinclude.py                |  39 +-
 mx.fastr/mx_fastr_mkgramrd.py                 |   9 +-
 6 files changed, 269 insertions(+), 401 deletions(-)

diff --git a/com.oracle.truffle.r.native/fficall/src/common/rffi_variablesindex.h b/com.oracle.truffle.r.native/fficall/src/common/rffi_variablesindex.h
index 9e7702e4e7..ddd5559aaf 100644
--- a/com.oracle.truffle.r.native/fficall/src/common/rffi_variablesindex.h
+++ b/com.oracle.truffle.r.native/fficall/src/common/rffi_variablesindex.h
@@ -23,58 +23,62 @@
 #ifndef RFFI_VARIABLESINDEX_H
 #define RFFI_VARIABLESINDEX_H
 
+// Generated by RFFIVariables.java:
+
 #define R_Home_x 0
 #define R_TempDir_x 1
 #define R_NilValue_x 2
 #define R_UnboundValue_x 3
 #define R_MissingArg_x 4
-#define R_GlobalEnv_x 5
-#define R_EmptyEnv_x 6
-#define R_BaseEnv_x 7
-#define R_BaseNamespace_x 8
-#define R_NamespaceRegistry_x 9
-#define R_Srcref_x 10
-#define R_Bracket2Symbol_x 11
-#define R_BracketSymbol_x 12
-#define R_BraceSymbol_x 13
-#define R_DoubleColonSymbol_x 14
-#define R_ClassSymbol_x 15
-#define R_DeviceSymbol_x 16
-#define R_DevicesSymbol_x 17
-#define R_DimNamesSymbol_x 18
-#define R_DimSymbol_x 19
-#define R_DollarSymbol_x 20
-#define R_DotsSymbol_x 21
-#define R_DropSymbol_x 22
-#define R_LastvalueSymbol_x 23
-#define R_LevelsSymbol_x 24
-#define R_ModeSymbol_x 25
-#define R_NameSymbol_x 26
-#define R_NamesSymbol_x 27
-#define R_NaRmSymbol_x 28
-#define R_PackageSymbol_x 29
-#define R_QuoteSymbol_x 30
-#define R_RowNamesSymbol_x 31
-#define R_SeedsSymbol_x 32
-#define R_SourceSymbol_x 33
-#define R_TspSymbol_x 34
-#define R_dot_defined_x 35
-#define R_dot_Method_x 36
-#define R_dot_target_x 37
-#define R_SrcrefSymbol_x 38
-#define R_SrcfileSymbol_x 39
-#define R_NaString_x 40
-#define R_NaN_x 41
-#define R_PosInf_x 42
-#define R_NegInf_x 43
-#define R_NaReal_x 44
-#define R_NaInt_x 45
-#define R_BlankString_x 46
-#define R_BlankScalarString_x 47
-#define R_BaseSymbol_x 48
-#define R_NamespaceEnvSymbol_x 49
-#define R_RestartToken_x 50
+#define R_EmptyEnv_x 5
+#define R_Srcref_x 6
+#define R_Bracket2Symbol_x 7
+#define R_BracketSymbol_x 8
+#define R_BraceSymbol_x 9
+#define R_DoubleColonSymbol_x 10
+#define R_ClassSymbol_x 11
+#define R_DeviceSymbol_x 12
+#define R_DevicesSymbol_x 13
+#define R_DimNamesSymbol_x 14
+#define R_DimSymbol_x 15
+#define R_DollarSymbol_x 16
+#define R_DotsSymbol_x 17
+#define R_DropSymbol_x 18
+#define R_LastvalueSymbol_x 19
+#define R_LevelsSymbol_x 20
+#define R_ModeSymbol_x 21
+#define R_NameSymbol_x 22
+#define R_NamesSymbol_x 23
+#define R_NaRmSymbol_x 24
+#define R_PackageSymbol_x 25
+#define R_QuoteSymbol_x 26
+#define R_RowNamesSymbol_x 27
+#define R_SeedsSymbol_x 28
+#define R_SourceSymbol_x 29
+#define R_TspSymbol_x 30
+#define R_dot_defined_x 31
+#define R_dot_Method_x 32
+#define R_dot_target_x 33
+#define R_dot_packageName_x 34
+#define R_dot_Generic_x 35
+#define R_SrcrefSymbol_x 36
+#define R_SrcfileSymbol_x 37
+#define R_NaString_x 38
+#define R_NaN_x 39
+#define R_PosInf_x 40
+#define R_NegInf_x 41
+#define R_NaReal_x 42
+#define R_NaInt_x 43
+#define R_BlankString_x 44
+#define R_BlankScalarString_x 45
+#define R_BaseSymbol_x 46
+#define R_NamespaceEnvSymbol_x 47
+#define R_RestartToken_x 48
+#define R_SortListSymbol_x 49
+#define R_SpecSymbol_x 50
+#define R_TripleColonSymbol_x 51
+#define R_PreviousSymbol_x 52
 
-#define VARIABLES_TABLE_SIZE 50
+#define VARIABLES_TABLE_SIZE 53
 
 #endif // RFFI_VARIABLESINDEX_H
diff --git a/com.oracle.truffle.r.native/fficall/src/include/Defn.h b/com.oracle.truffle.r.native/fficall/src/include/Defn.h
index b401a7c0b7..3ad79cc188 100644
--- a/com.oracle.truffle.r.native/fficall/src/include/Defn.h
+++ b/com.oracle.truffle.r.native/fficall/src/include/Defn.h
@@ -46,18 +46,14 @@ void Rf_checkArityCall(SEXP, SEXP, SEXP);
 /* ../main/devices.c, used in memory.c, gnuwin32/extra.c */
 #define R_MaxDevices 64
 
-extern SEXP FASTR_R_DevicesSymbol();
-#define R_DevicesSymbol FASTR_R_DevicesSymbol()
-extern SEXP FASTR_R_DeviceSymbol();
-#define R_DeviceSymbol FASTR_R_DeviceSymbol()
+extern SEXP R_DevicesSymbol;
+extern SEXP R_DeviceSymbol;
 extern Rboolean FASTR_R_Interactive();
 #define R_Interactive FASTR_R_Interactive()
 extern Rboolean R_Visible;
 int	R_ReadConsole(const char *, unsigned char *, int, int);
-extern const char *FASTR_R_Home();
-#define R_Home FASTR_R_Home()
-extern const char *FASTR_R_TempDir();
-#define R_TempDir FASTR_R_TempDir()
+extern const char *R_Home;
+extern const char *R_TempDir;
 
 //#define HAVE_MBSTATE_T 1 // actually from config.h
 
diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/variables.c b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/variables.c
index 858688a9b2..6a68f5cb20 100644
--- a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/variables.c
+++ b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/variables.c
@@ -26,61 +26,6 @@
 #include <rffiutils.h>
 #include "../common/rffi_variablesindex.h"
 
-
-static const char *R_Home_static;
-static const char *R_TempDir_static;
-static SEXP R_EmptyEnv_static;
-static SEXP R_Srcref_static;
-static SEXP R_NilValue_static;
-static SEXP R_NilValue_static2;
-static SEXP R_UnboundValue_static;
-static SEXP R_MissingArg_static;
-static SEXP R_BaseSymbol_static;
-static SEXP R_Bracket2Symbol_static;   /* "[[" */
-static SEXP R_BracketSymbol_static;    /* "[" */
-static SEXP R_BraceSymbol_static;      /* "{" */
-static SEXP R_DoubleColonSymbol_static;/* "::" */
-static SEXP R_ClassSymbol_static;     /* "class" */
-static SEXP R_DeviceSymbol_static;     /* ".Device" */
-static SEXP R_DevicesSymbol_static;     /* ".Devices" */
-static SEXP R_DimNamesSymbol_static;   /* "dimnames" */
-static SEXP R_DimSymbol_static;     /* "dim" */
-static SEXP R_DollarSymbol_static;     /* "$" */
-static SEXP R_DotsSymbol_static;     /* "..." */
-static SEXP R_DropSymbol_static;     /* "drop" */
-static SEXP R_LastvalueSymbol_static;  /* ".Last.value" */
-static SEXP R_LevelsSymbol_static;     /* "levels" */
-static SEXP R_ModeSymbol_static;     /* "mode" */
-static SEXP R_NameSymbol_static;     /* "name" */
-static SEXP R_NamesSymbol_static;     /* "names" */
-static SEXP R_NaRmSymbol_static;     /* "na.rm" */
-static SEXP R_PackageSymbol_static;    /* "package" */
-static SEXP R_QuoteSymbol_static;     /* "quote" */
-static SEXP R_RowNamesSymbol_static;   /* "row.names" */
-static SEXP R_SeedsSymbol_static;     /* ".Random.seed" */
-static SEXP R_SourceSymbol_static;     /* "source" */
-static SEXP R_TspSymbol_static;     /* "tsp" */
-static SEXP R_dot_defined_static;      /* ".defined" */
-static SEXP R_dot_Method_static;       /* ".Method" */
-static SEXP R_dot_target_static;       /* ".target" */
-static SEXP R_NaString_static;	    /* NA_STRING as a CHARSXP */
-static SEXP R_BlankString_static;	    /* "" as a CHARSXP */
-static SEXP R_BlankScalarString_static;	    /* "" as a STRSXP */
-static SEXP R_BaseSymbol_static;	    /* "base" as a SYMSXP */
-static SEXP	R_NamespaceEnvSymbol_static;   // ".__NAMESPACE__."
-
-// Symbols not part of public API but used in FastR tools implementation
-static SEXP R_SrcrefSymbol_static;
-static SEXP R_SrcfileSymbol_static;
-static SEXP R_RestartToken_static;
-
-// Arith.h
-double R_NaN;		/* IEEE NaN */
-double R_PosInf;	/* IEEE Inf */
-double R_NegInf;	/* IEEE -Inf */
-double R_NaReal;	/* NA_REAL: IEEE */
-int R_NaInt;	/* NA_INTEGER:= INT_MIN currently */
-
 // various ignored flags and variables nevertheless needed to resolve symbols
 Rboolean R_Visible;
 Rboolean R_interrupts_suspended;
@@ -97,263 +42,154 @@ int max_contour_segments = 25000;
 // from sys-std.c
 #include <R_ext/eventloop.h>
 
-static InputHandler BasicInputHandler = {2, -1, NULL};
+InputHandler BasicInputHandler = {2, -1, NULL};
 InputHandler *R_InputHandlers = &BasicInputHandler;
 
-char *FASTR_R_Home() {
-	return (char *) R_Home_static;
-}
-
-char *FASTR_R_TempDir() {
-	return (char *) R_TempDir_static;
-}
-
-SEXP FASTR_R_EmptyEnv() {
-    return R_EmptyEnv_static;
-}
-
-SEXP FASTR_R_Srcref() {
-    return R_Srcref_static;
-}
-
-SEXP FASTR_R_NilValue() {
-    return R_NilValue_static;
-}
-
-SEXP FASTR_R_UnboundValue() {
-    return R_UnboundValue_static;
-}
-
-SEXP FASTR_R_MissingArg() {
-    return R_MissingArg_static;
-}
-
-SEXP FASTR_R_BaseSymbol() {
-    return R_BaseSymbol_static;
-}
-
-
-SEXP FASTR_R_BraceSymbol() {
-    return R_BraceSymbol_static;
-}
-
-SEXP FASTR_R_DoubleColonSymbol() {
-    return R_DoubleColonSymbol_static;
-}
-
-SEXP FASTR_R_Bracket2Symbol() {
-    return R_Bracket2Symbol_static;
-}
-
-SEXP FASTR_R_BracketSymbol() {
-    return R_BracketSymbol_static;
-}
-
-SEXP FASTR_R_ClassSymbol() {
-    return R_ClassSymbol_static;
-}
-
-SEXP FASTR_R_DimNamesSymbol() {
-    return R_DimNamesSymbol_static;
-}
-
-SEXP FASTR_R_DimSymbol() {
-    return R_DimSymbol_static;
-}
-
-
-SEXP FASTR_R_DollarSymbol() {
-    return R_DollarSymbol_static;
-}
-
-SEXP FASTR_R_DotsSymbol() {
-    return R_DotsSymbol_static;
-}
-
-
-SEXP FASTR_R_DropSymbol() {
-    return R_DropSymbol_static;
-}
-
-SEXP FASTR_R_LastvalueSymbol() {
-    return R_LastvalueSymbol_static;
-}
-
-
-SEXP FASTR_R_LevelsSymbol() {
-    return R_LevelsSymbol_static;
-}
-
-SEXP FASTR_R_ModeSymbol() {
-    return R_ModeSymbol_static;
-}
-
-SEXP FASTR_R_NaRmSymbol() {
-    return R_NaRmSymbol_static;
-}
-
-
-SEXP FASTR_R_NameSymbol() {
-    return R_NameSymbol_static;
-}
-
-SEXP FASTR_R_NamesSymbol() {
-    return R_NamesSymbol_static;
-}
-
-
-SEXP FASTR_R_NamespaceEnvSymbol() {
-    return R_NamespaceEnvSymbol_static;
-}
-
-SEXP FASTR_R_PackageSymbol() {
-    return R_PackageSymbol_static;
-}
-
-SEXP FASTR_R_QuoteSymbol() {
-    return R_QuoteSymbol_static;
-}
-
-SEXP FASTR_R_RowNamesSymbol() {
-    return R_RowNamesSymbol_static;
-}
-
-SEXP FASTR_R_SeedsSymbol() {
-    return R_SeedsSymbol_static;
-}
-
-SEXP FASTR_R_SourceSymbol() {
-    return R_SourceSymbol_static;
-}
-
-SEXP FASTR_R_TspSymbol() {
-    return R_TspSymbol_static;
-}
-
-SEXP FASTR_R_dot_defined() {
-    return R_dot_defined_static;
-}
-
-SEXP FASTR_R_dot_Method() {
-    return R_dot_Method_static;
-}
-
-SEXP FASTR_R_dot_target() {
-    return R_dot_target_static;
-}
-
-SEXP FASTR_R_NaString() {
-    return R_NaString_static;
-}
-
-
-SEXP FASTR_R_BlankString() {
-    return R_BlankString_static;
-}
-
-SEXP FASTR_R_BlankScalarString() {
-    return R_BlankScalarString_static;
-}
-
-SEXP FASTR_R_DevicesSymbol() {
-    return R_DevicesSymbol_static;
-}
-
-SEXP FASTR_R_DeviceSymbol() {
-    return R_DeviceSymbol_static;
-}
-
-SEXP FASTR_R_SrcrefSymbol() {
-    return R_SrcrefSymbol_static;
+char *copystring(char *value) {
+	char *result = malloc(strlen(value) + 1);
+	strcpy(result, value);
+	return result;
 }
 
-SEXP FASTR_R_SrcfileSymbol() {
-    return R_SrcfileSymbol_static;
-}
+// ---------------------------------------------------
+// Generated by RFFIVariables.java:
+
+char* R_Home;
+char* R_TempDir;
+SEXP R_NilValue;
+SEXP R_UnboundValue;
+SEXP R_MissingArg;
+SEXP R_EmptyEnv;
+SEXP R_Srcref;
+SEXP R_Bracket2Symbol; /* "[[" */
+SEXP R_BracketSymbol; /* "[" */
+SEXP R_BraceSymbol; /* "{" */
+SEXP R_DoubleColonSymbol; /* "::" */
+SEXP R_ClassSymbol; /* "class" */
+SEXP R_DeviceSymbol; /* ".Device" */
+SEXP R_DevicesSymbol; /* ".Devices" */
+SEXP R_DimNamesSymbol; /* "dimnames" */
+SEXP R_DimSymbol; /* "dim" */
+SEXP R_DollarSymbol; /* "$" */
+SEXP R_DotsSymbol; /* "..." */
+SEXP R_DropSymbol; /* "drop" */
+SEXP R_LastvalueSymbol; /* ".Last.value" */
+SEXP R_LevelsSymbol; /* "levels" */
+SEXP R_ModeSymbol; /* "mode" */
+SEXP R_NameSymbol; /* "name" */
+SEXP R_NamesSymbol; /* "names" */
+SEXP R_NaRmSymbol; /* "na.rm" */
+SEXP R_PackageSymbol; /* "package" */
+SEXP R_QuoteSymbol; /* "quote" */
+SEXP R_RowNamesSymbol; /* "row.names" */
+SEXP R_SeedsSymbol; /* ".Random.seed" */
+SEXP R_SourceSymbol; /* "source" */
+SEXP R_TspSymbol; /* "tsp" */
+SEXP R_dot_defined; /* ".defined" */
+SEXP R_dot_Method; /* ".Method" */
+SEXP R_dot_target; /* ".target" */
+SEXP R_dot_packageName; /* ".packageName" */
+SEXP R_dot_Generic; /* ".Generic" */
+SEXP R_SrcrefSymbol; /* "srcref" */
+SEXP R_SrcfileSymbol; /* "srcfile" */
+SEXP R_NaString;
+double R_NaN;
+double R_PosInf;
+double R_NegInf;
+double R_NaReal;
+int R_NaInt;
+SEXP R_BlankString;
+SEXP R_BlankScalarString;
+SEXP R_BaseSymbol; /* "base" */
+SEXP R_NamespaceEnvSymbol; /* ".__NAMESPACE__." */
+SEXP R_RestartToken;
+SEXP R_SortListSymbol; /* "sort.list" */
+SEXP R_SpecSymbol; /* "spec" */
+SEXP R_TripleColonSymbol; /* ":::" */
+SEXP R_PreviousSymbol; /* "previous" */
 
 void Call_initvar_double(int index, double value) {
-	switch (index) {
-    case R_NaN_x: R_NaN = value; break;
-    case R_PosInf_x: R_PosInf = value; break;
-    case R_NegInf_x: R_NegInf = value; break;
-    case R_NaReal_x: R_NaReal = value; break;
-    default:
-        printf("Call_initvar_double: unimplemented index %d\n", index);
-        exit(1);
-	}
+    switch (index) {
+        case R_NaN_x: R_NaN = value; break;
+        case R_PosInf_x: R_PosInf = value; break;
+        case R_NegInf_x: R_NegInf = value; break;
+        case R_NaReal_x: R_NaReal = value; break;
+        default:
+            printf("Call_initvar_double: unimplemented index %d\n", index);
+            exit(1);
+    }
 }
 
 void Call_initvar_int(int index, int value) {
-	switch (index) {
-    case R_NaInt_x: R_NaInt = value; break;
-    default:
-        printf("Call_initvar_int: unimplemented index %d\n", index);
-        exit(1);
-	}
-}
-
-char *copystring(char *value) {
-	char *result = malloc(strlen(value) + 1);
-	strcpy(result, value);
-	return result;
+    switch (index) {
+        case R_NaInt_x: R_NaInt = value; break;
+        default:
+            printf("Call_initvar_int: unimplemented index %d\n", index);
+            exit(1);
+    }
 }
 
-// value must be copied
-void Call_initvar_string(int index, char *value) {
-	switch (index) {
-    case R_Home_x: R_Home_static = copystring(value); break;
-    case R_TempDir_x: R_TempDir_static = copystring(value); break;
-    default:
-        printf("Call_initvar_string: unimplemented index %d\n", index);
-        exit(1);
-	}
+void Call_initvar_string(int index, char* value) {
+    switch (index) {
+        case R_Home_x: R_Home = copystring(value); break;
+        case R_TempDir_x: R_TempDir = copystring(value); break;
+        default:
+            printf("Call_initvar_string: unimplemented index %d\n", index);
+            exit(1);
+    }
 }
 
 void Call_initvar_obj(TruffleEnv* env, int index, void* value) {
-	init_utils(env);
-	switch (index) {
-    case R_NilValue_x: R_NilValue_static = value; break;
-    case R_UnboundValue_x: R_UnboundValue_static = value; break;
-    case R_MissingArg_x: R_MissingArg_static = value; break;
-    case R_Srcref_x: R_Srcref_static = value; break;
-    case R_EmptyEnv_x: R_EmptyEnv_static = value; break;
-    case R_Bracket2Symbol_x: R_Bracket2Symbol_static = value; break;
-    case R_BracketSymbol_x: R_BracketSymbol_static = value; break;
-    case R_BraceSymbol_x: R_BraceSymbol_static = value; break;
-    case R_DoubleColonSymbol_x: R_DoubleColonSymbol_static = value; break;
-    case R_ClassSymbol_x: R_ClassSymbol_static = value; break;
-    case R_DeviceSymbol_x: R_DeviceSymbol_static = value; break;
-    case R_DevicesSymbol_x: R_DevicesSymbol_static = value; break;
-    case R_DimNamesSymbol_x: R_DimNamesSymbol_static = value; break;
-    case R_DimSymbol_x: R_DimSymbol_static = value; break;
-    case R_DollarSymbol_x: R_DollarSymbol_static = value; break;
-    case R_DotsSymbol_x: R_DotsSymbol_static = value; break;
-    case R_DropSymbol_x: R_DropSymbol_static = value; break;
-    case R_LastvalueSymbol_x: R_LastvalueSymbol_static = value; break;
-    case R_LevelsSymbol_x: R_LevelsSymbol_static = value; break;
-    case R_ModeSymbol_x: R_ModeSymbol_static = value; break;
-    case R_NameSymbol_x: R_NameSymbol_static = value; break;
-    case R_NamesSymbol_x: R_NamesSymbol_static = value; break;
-    case R_NaRmSymbol_x: R_NaRmSymbol_static = value; break;
-    case R_PackageSymbol_x: R_PackageSymbol_static = value; break;
-    case R_QuoteSymbol_x: R_QuoteSymbol_static = value; break;
-    case R_RowNamesSymbol_x: R_RowNamesSymbol_static = value; break;
-    case R_SeedsSymbol_x: R_SeedsSymbol_static = value; break;
-    case R_SourceSymbol_x: R_SourceSymbol_static = value; break;
-    case R_TspSymbol_x: R_TspSymbol_static = value; break;
-    case R_dot_defined_x: R_dot_defined_static = value; break;
-    case R_dot_Method_x: R_dot_Method_static = value; break;
-    case R_dot_target_x: R_dot_target_static = value; break;
-    case R_SrcrefSymbol_x: R_SrcrefSymbol_static = value; break;
-    case R_SrcfileSymbol_x: R_SrcfileSymbol_static = value; break;
-    case R_NaString_x: R_NaString_static = value; break;
-    case R_BlankString_x: R_BlankString_static = value; break;
-    case R_BlankScalarString_x: R_BlankString_static = value; break;
-    case R_BaseSymbol_x: R_BaseSymbol_static = value; break;
-    case R_NamespaceEnvSymbol_x: R_NamespaceEnvSymbol_static = value; break;
-    // case R_RestartToken_x: R_RestartToken_static = value; break;
-    default:
-    	printf("Call_initvar_obj: unimplemented index %d\n", index);
-    	exit(1);
-	}
+    init_utils(env);
+    switch (index) {
+        case R_NilValue_x: R_NilValue = value; break;
+        case R_UnboundValue_x: R_UnboundValue = value; break;
+        case R_MissingArg_x: R_MissingArg = value; break;
+        case R_EmptyEnv_x: R_EmptyEnv = value; break;
+        case R_Srcref_x: R_Srcref = value; break;
+        case R_Bracket2Symbol_x: R_Bracket2Symbol = value; break;
+        case R_BracketSymbol_x: R_BracketSymbol = value; break;
+        case R_BraceSymbol_x: R_BraceSymbol = value; break;
+        case R_DoubleColonSymbol_x: R_DoubleColonSymbol = value; break;
+        case R_ClassSymbol_x: R_ClassSymbol = value; break;
+        case R_DeviceSymbol_x: R_DeviceSymbol = value; break;
+        case R_DevicesSymbol_x: R_DevicesSymbol = value; break;
+        case R_DimNamesSymbol_x: R_DimNamesSymbol = value; break;
+        case R_DimSymbol_x: R_DimSymbol = value; break;
+        case R_DollarSymbol_x: R_DollarSymbol = value; break;
+        case R_DotsSymbol_x: R_DotsSymbol = value; break;
+        case R_DropSymbol_x: R_DropSymbol = value; break;
+        case R_LastvalueSymbol_x: R_LastvalueSymbol = value; break;
+        case R_LevelsSymbol_x: R_LevelsSymbol = value; break;
+        case R_ModeSymbol_x: R_ModeSymbol = value; break;
+        case R_NameSymbol_x: R_NameSymbol = value; break;
+        case R_NamesSymbol_x: R_NamesSymbol = value; break;
+        case R_NaRmSymbol_x: R_NaRmSymbol = value; break;
+        case R_PackageSymbol_x: R_PackageSymbol = value; break;
+        case R_QuoteSymbol_x: R_QuoteSymbol = value; break;
+        case R_RowNamesSymbol_x: R_RowNamesSymbol = value; break;
+        case R_SeedsSymbol_x: R_SeedsSymbol = value; break;
+        case R_SourceSymbol_x: R_SourceSymbol = value; break;
+        case R_TspSymbol_x: R_TspSymbol = value; break;
+        case R_dot_defined_x: R_dot_defined = value; break;
+        case R_dot_Method_x: R_dot_Method = value; break;
+        case R_dot_target_x: R_dot_target = value; break;
+        case R_dot_packageName_x: R_dot_packageName = value; break;
+        case R_dot_Generic_x: R_dot_Generic = value; break;
+        case R_SrcrefSymbol_x: R_SrcrefSymbol = value; break;
+        case R_SrcfileSymbol_x: R_SrcfileSymbol = value; break;
+        case R_NaString_x: R_NaString = value; break;
+        case R_BlankString_x: R_BlankString = value; break;
+        case R_BlankScalarString_x: R_BlankScalarString = value; break;
+        case R_BaseSymbol_x: R_BaseSymbol = value; break;
+        case R_NamespaceEnvSymbol_x: R_NamespaceEnvSymbol = value; break;
+        case R_RestartToken_x: R_RestartToken = value; break;
+        case R_SortListSymbol_x: R_SortListSymbol = value; break;
+        case R_SpecSymbol_x: R_SpecSymbol = value; break;
+        case R_TripleColonSymbol_x: R_TripleColonSymbol = value; break;
+        case R_PreviousSymbol_x: R_PreviousSymbol = value; break;
+        default:
+            printf("Call_initvar_obj: unimplemented index %d\n", index);
+            exit(1);
+    }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIVariables.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIVariables.java
index 6eba171b14..897acb3dbc 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIVariables.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIVariables.java
@@ -22,6 +22,9 @@
  */
 package com.oracle.truffle.r.runtime.ffi;
 
+import java.util.Arrays;
+import java.util.stream.Stream;
+
 import com.oracle.truffle.r.runtime.REnvVars;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.TempPathName;
@@ -29,20 +32,20 @@ import com.oracle.truffle.r.runtime.data.CharSXPWrapper;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RUnboundValue;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
+/**
+ * Note: regenerate the C glue code upon any change in this enum, use {@link #main(String[])}.
+ */
 public enum RFFIVariables {
     R_Home(REnvVars.rHome()),
     R_TempDir(null), // Set later
     R_NilValue(RNull.instance),
     R_UnboundValue(RUnboundValue.instance),
     R_MissingArg(RMissing.instance),
-    R_GlobalEnv(null, true),
     R_EmptyEnv(REnvironment.emptyEnv()),
-    R_BaseEnv(null, true),
-    R_BaseNamespace(null, true),
-    R_NamespaceRegistry(null, true),
     R_Srcref(null),
     R_Bracket2Symbol(RDataFactory.createSymbol("[[")),
     R_BracketSymbol(RDataFactory.createSymbol("[")),
@@ -71,6 +74,8 @@ public enum RFFIVariables {
     R_dot_defined(RDataFactory.createSymbol(".defined")),
     R_dot_Method(RDataFactory.createSymbol(".Method")),
     R_dot_target(RDataFactory.createSymbol(".target")),
+    R_dot_packageName(RDataFactory.createSymbol(".packageName")),
+    R_dot_Generic(RDataFactory.createSymbol(".Generic")),
     R_SrcrefSymbol(RDataFactory.createSymbol("srcref")),
     R_SrcfileSymbol(RDataFactory.createSymbol("srcfile")),
     R_NaString(CharSXPWrapper.create(RRuntime.STRING_NA)),
@@ -83,7 +88,11 @@ public enum RFFIVariables {
     R_BlankScalarString(RDataFactory.createStringVectorFromScalar("")),
     R_BaseSymbol(RDataFactory.createSymbol("base")),
     R_NamespaceEnvSymbol(RDataFactory.createSymbol(".__NAMESPACE__.")),
-    R_RestartToken(null);
+    R_RestartToken(null),
+    R_SortListSymbol(RDataFactory.createSymbol("sort.list")),
+    R_SpecSymbol(RDataFactory.createSymbol("spec")),
+    R_TripleColonSymbol(RDataFactory.createSymbol(":::")),
+    R_PreviousSymbol(RDataFactory.createSymbol("previous"));
 
     private Object value;
     public final boolean alwaysUpCall;
@@ -109,9 +118,66 @@ public enum RFFIVariables {
         return values();
     }
 
+    /**
+     * Generates C code necessary to glue the Java and C part together. To run this, run
+     * {@code mx -v r} to get full command line that runs R and replace the main class with this
+     * class.
+     */
     public static void main(String[] args) {
+        R_TempDir.value = "dummy string";
+        System.out.println("// Update com.oracle.truffle.r.native/fficall/src/common/rffi_variablesindex.h with the following: \n");
+        System.out.println("// Generated by RFFIVariables.java:\n");
         for (RFFIVariables var : RFFIVariables.values()) {
             System.out.printf("#define %s_x %d\n", var.name(), var.ordinal());
         }
+        System.out.printf("\n#define VARIABLES_TABLE_SIZE %d", values().length);
+
+        System.out.println("\n\n// Update com.oracle.truffle.r.native/fficall/src/truffle_nfi/variables.c with the following: \n");
+
+        System.out.println("// Generated by RFFIVariables.java:\n");
+
+        for (RFFIVariables val : values()) {
+            if (val.value instanceof Double) {
+                System.out.printf("double %s;\n", val.name());
+            } else if (val.value instanceof Integer) {
+                System.out.printf("int %s;\n", val.name());
+            } else if (val.value instanceof String) {
+                System.out.printf("char* %s;\n", val.name());
+            } else if (val.value instanceof RSymbol) {
+                System.out.printf("SEXP %s; /* \"%s\" */\n", val.name(), ((RSymbol) val.value).getName());
+            } else {
+                System.out.printf("SEXP %s;\n", val.name());
+            }
+        }
+
+        System.out.println("\nvoid Call_initvar_double(int index, double value) {");
+        printInitVarFor(Arrays.stream(RFFIVariables.values()).filter(x -> x.value instanceof Double), "Call_initvar_double");
+        System.out.println("}\n");
+
+        System.out.println("void Call_initvar_int(int index, int value) {");
+        printInitVarFor(Arrays.stream(RFFIVariables.values()).filter(x -> x.value instanceof Integer), "Call_initvar_int");
+        System.out.println("}\n");
+
+        System.out.println("void Call_initvar_string(int index, char* value) {");
+        printInitVarFor(Arrays.stream(RFFIVariables.values()).filter(x -> x.value instanceof String), "copystring(value)", "Call_initvar_string");
+        System.out.println("}\n");
+
+        System.out.println("void Call_initvar_obj(TruffleEnv* env, int index, void* value) {");
+        System.out.println("    init_utils(env);");
+        printInitVarFor(Arrays.stream(RFFIVariables.values()).filter(x -> !(x.value instanceof Number || x.value instanceof String)), "Call_initvar_obj");
+        System.out.println("}\n");
+    }
+
+    private static void printInitVarFor(Stream<RFFIVariables> vars, String callName) {
+        printInitVarFor(vars, "value", callName);
+    }
+
+    private static void printInitVarFor(Stream<RFFIVariables> vars, String value, String callName) {
+        System.out.println("    switch (index) {");
+        vars.forEachOrdered(x -> System.out.printf("        case %s_x: %s = %s; break;\n", x.name(), x.name(), value));
+        System.out.println("        default:");
+        System.out.printf("            printf(\"%s: unimplemented index %%d\\n\", index);\n", callName);
+        System.out.println("            exit(1);");
+        System.out.println("    }");
     }
 }
diff --git a/mx.fastr/mx_fastr_edinclude.py b/mx.fastr/mx_fastr_edinclude.py
index 656ecaa88c..8cfc59d183 100644
--- a/mx.fastr/mx_fastr_edinclude.py
+++ b/mx.fastr/mx_fastr_edinclude.py
@@ -27,17 +27,7 @@ Handles all the editing of R FFI header files from the GNUR include directory to
 FastR include directory.
 '''
 # variables in Rinternals.h that are Java Objects and so remapped to functions
-r_internals_vars = ['R_NilValue', 'R_UnboundValue', 'R_MissingArg', 'R_GlobalEnv',
-    'R_EmptyEnv', 'R_BaseEnv', 'R_BaseNamespace', 'R_NamespaceRegistry', 'R_Srcref', 'R_Bracket2Symbol',
-    'R_BracketSymbol', 'R_BraceSymbol', 'R_ClassSymbol', 'R_DeviceSymbol', 'R_DevicesSymbol',
-    'R_DimNamesSymbol', 'R_DimSymbol', 'R_DollarSymbol', 'R_DotsSymbol', 'R_DropSymbol', 'R_LastvalueSymbol',
-    'R_LevelsSymbol', 'R_ModeSymbol', 'R_NameSymbol', 'R_NamesSymbol', 'R_NaRmSymbol', 'R_PackageSymbol',
-    'R_QuoteSymbol', 'R_RowNamesSymbol', 'R_SeedsSymbol', 'R_SourceSymbol', 'R_TspSymbol', 'R_dot_defined',
-    'R_dot_Method', 'R_dot_target', 'R_SrcrefSymbol', 'R_SrcfileSymbol', 'R_NaString', 'R_BlankString',
-    'R_DoubleColonSymbol', 'R_BlankScalarString', 'R_BaseSymbol', 'R_baseSymbol', 'R_NamespaceEnvSymbol']
-
-interface_vars = ['R_Home', 'R_TempDir',]
-
+r_internals_vars = ['R_GlobalEnv', 'R_BaseEnv', 'R_BaseNamespace', 'R_NamespaceRegistry']
 
 def edinclude(args):
     '''
@@ -127,21 +117,10 @@ def ed_r_internals(gnu_dir):
 def rewrite_var(f, var, line):
     f.write('#ifdef FASTR\n')
     f.write('LibExtern SEXP FASTR_{0}();\n'.format(var))
-    if var == 'R_baseSymbol': # alias
-        f.write('#define {0} FASTR_R_BaseSymbol()\n'.format(var))
-    else:
-        f.write('#define {0} FASTR_{0}()\n'.format(var))
+    f.write('#define {0} FASTR_{0}()\n'.format(var))
     f.write('#else\n')
-    # Ugly special case, comment split on two lines, just
-    if var == 'R_EmptyEnv':
-        split = line.split(';')
-        f.write(split[0])
-        f.write(';\n')
-        f.write('#endif\n')
-        f.write(split[1])
-    else:
-        f.write(line)
-        f.write('#endif\n')
+    f.write(line)
+    f.write('#endif\n')
 
 def is_internal_var(line):
     for var in r_internals_vars:
@@ -173,12 +152,6 @@ extern Rboolean FASTR_R_Interactive();
 #else
 '''
 
-rhome_rewrite = '''#ifdef FASTR
-extern char* FASTR_R_Home();
-#define R_Home FASTR_R_Home()
-#else
-'''
-
 def ed_r_interface(gnu_dir):
     r_interface_h = join(gnu_dir, 'Rinterface.h')
     with open(r_interface_h) as f:
@@ -194,10 +167,6 @@ def ed_r_interface(gnu_dir):
                 f.write(interactive_rewrite)
                 f.write(line)
                 f.write('#endif\n')
-            elif 'R_Home;' in line:
-                f.write(rhome_rewrite)
-                f.write(line)
-                f.write('#endif\n')
             else:
                 f.write(line)
 
diff --git a/mx.fastr/mx_fastr_mkgramrd.py b/mx.fastr/mx_fastr_mkgramrd.py
index 5481589664..244c3b4a62 100644
--- a/mx.fastr/mx_fastr_mkgramrd.py
+++ b/mx.fastr/mx_fastr_mkgramrd.py
@@ -26,10 +26,8 @@ def mkgramrd(args):
     converts GNU R gramRd.c into one suitable for invoking via FastR
     '''
     parse_defs = '''
-extern SEXP FASTR_R_SrcrefSymbol();
-#define R_SrcrefSymbol FASTR_R_SrcrefSymbol()
-extern SEXP FASTR_R_SrcfileSymbol();
-#define R_SrcfileSymbol FASTR_R_SrcfileSymbol()
+extern SEXP R_SrcrefSymbol;
+extern SEXP R_SrcfileSymbol;
 extern int R_ParseContextLast;
 #define R_EOF -1
 #define PARSE_ERROR_SIZE 256
@@ -39,8 +37,7 @@ static char    R_ParseContext[PARSE_CONTEXT_SIZE];
 int    R_ParseContextLast;
 int    R_ParseContextLine;
 int R_ParseError;
-extern SEXP FASTR_R_EmptyEnv();
-#define R_EmptyEnv FASTR_R_EmptyEnv()
+extern SEXP R_EmptyEnv;
 extern SEXP R_NewHashedEnv(SEXP a, SEXP b);
 
 char *dgettext(const char *p, const char *msgid) {
-- 
GitLab