From 8e3a92832db95100bd567e67b129176b20c1f497 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 24 Aug 2018 14:08:11 +0200
Subject: [PATCH] add Rf_allocList and Rf_allocSExp

---
 .../ffi/impl/common/JavaUpCallsRFFIImpl.java  |  25 +
 .../r/ffi/impl/upcalls/StdUpCallsRFFI.java    |   6 +
 .../fficall/src/common/rffi_upcallsindex.h    | 444 +++++++++---------
 .../Rinternals_truffle_common.h               |  10 +-
 4 files changed, 261 insertions(+), 224 deletions(-)

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 e0a7927923..560011c158 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
@@ -478,7 +478,32 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI {
         RAbstractVector result = (RAbstractVector) Rf_allocVector(mode, n);
         setDims(newDims, result);
         return result;
+    }
+
+    @Override
+    @TruffleBoundary
+    public Object Rf_allocList(int length) {
+        Object result = RNull.instance;
+        for (int i = 0; i < length; i++) {
+            result = RDataFactory.createPairList(RNull.instance, result);
+        }
+        return result;
+    }
 
+    @Override
+    @TruffleBoundary
+    public Object Rf_allocSExp(int mode) {
+        SEXPTYPE type = SEXPTYPE.mapInt(mode);
+        switch (type) {
+            case ENVSXP:
+                return RDataFactory.createNewEnv(null);
+            case LISTSXP:
+                return RDataFactory.createPairList(RNull.instance, RNull.instance);
+            case LANGSXP:
+                return RDataFactory.createPairList(1, type);
+            default:
+                throw unimplemented("unexpected SEXPTYPE " + type);
+        }
     }
 
     @TruffleBoundary
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 3ba0e88f20..b8f664b9b6 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
@@ -246,6 +246,12 @@ public interface StdUpCallsRFFI {
     @RFFIRunGC
     Object Rf_allocMatrix(int mode, int nrow, int ncol);
 
+    @RFFIRunGC
+    Object Rf_allocList(int length);
+
+    @RFFIRunGC
+    Object Rf_allocSExp(int type);
+
     int Rf_nrows(Object x);
 
     int Rf_ncols(Object x);
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 e987c23a84..ea67f4bf47 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
@@ -131,227 +131,229 @@
 #define Rf_ScalarString_x 102
 #define Rf_VectorToPairList_x 103
 #define Rf_allocArray_x 104
-#define Rf_allocMatrix_x 105
-#define Rf_allocVector_x 106
-#define Rf_any_duplicated_x 107
-#define Rf_any_duplicated3_x 108
-#define Rf_asChar_x 109
-#define Rf_asCharacterFactor_x 110
-#define Rf_asInteger_x 111
-#define Rf_asLogical_x 112
-#define Rf_asReal_x 113
-#define Rf_bessel_i_x 114
-#define Rf_bessel_i_ex_x 115
-#define Rf_bessel_j_x 116
-#define Rf_bessel_j_ex_x 117
-#define Rf_bessel_k_x 118
-#define Rf_bessel_k_ex_x 119
-#define Rf_bessel_y_x 120
-#define Rf_bessel_y_ex_x 121
-#define Rf_beta_x 122
-#define Rf_choose_x 123
-#define Rf_classgets_x 124
-#define Rf_coerceVector_x 125
-#define Rf_cons_x 126
-#define Rf_copyListMatrix_x 127
-#define Rf_copyMatrix_x 128
-#define Rf_copyMostAttrib_x 129
-#define Rf_cospi_x 130
-#define Rf_dbeta_x 131
-#define Rf_dbinom_x 132
-#define Rf_dcauchy_x 133
-#define Rf_dchisq_x 134
-#define Rf_defineVar_x 135
-#define Rf_dexp_x 136
-#define Rf_df_x 137
-#define Rf_dgamma_x 138
-#define Rf_dgeom_x 139
-#define Rf_dhyper_x 140
-#define Rf_digamma_x 141
-#define Rf_dlnorm_x 142
-#define Rf_dlogis_x 143
-#define Rf_dnbeta_x 144
-#define Rf_dnbinom_x 145
-#define Rf_dnbinom_mu_x 146
-#define Rf_dnchisq_x 147
-#define Rf_dnf_x 148
-#define Rf_dnorm4_x 149
-#define Rf_dnt_x 150
-#define Rf_dpois_x 151
-#define Rf_dpsifn_x 152
-#define Rf_dsignrank_x 153
-#define Rf_dt_x 154
-#define Rf_dunif_x 155
-#define Rf_duplicate_x 156
-#define Rf_dweibull_x 157
-#define Rf_dwilcox_x 158
-#define Rf_error_x 159
-#define Rf_errorcall_x 160
-#define Rf_eval_x 161
-#define Rf_findFun_x 162
-#define Rf_findVar_x 163
-#define Rf_findVarInFrame_x 164
-#define Rf_findVarInFrame3_x 165
-#define Rf_fprec_x 166
-#define Rf_ftrunc_x 167
-#define Rf_gammafn_x 168
-#define Rf_getAttrib_x 169
-#define Rf_gsetVar_x 170
-#define Rf_inherits_x 171
-#define Rf_install_x 172
-#define Rf_installChar_x 173
-#define Rf_isNull_x 174
-#define Rf_isObject_x 175
-#define Rf_isString_x 176
-#define Rf_lbeta_x 177
-#define Rf_lchoose_x 178
-#define Rf_lengthgets_x 179
-#define Rf_lgamma1p_x 180
-#define Rf_lgammafn_x 181
-#define Rf_lgammafn_sign_x 182
-#define Rf_log1pexp_x 183
-#define Rf_log1pmx_x 184
-#define Rf_logspace_add_x 185
-#define Rf_logspace_sub_x 186
-#define Rf_match_x 187
-#define Rf_mkCharLenCE_x 188
-#define Rf_namesgets_x 189
-#define Rf_ncols_x 190
-#define Rf_nrows_x 191
-#define Rf_pbeta_x 192
-#define Rf_pbinom_x 193
-#define Rf_pcauchy_x 194
-#define Rf_pchisq_x 195
-#define Rf_pentagamma_x 196
-#define Rf_pexp_x 197
-#define Rf_pf_x 198
-#define Rf_pgamma_x 199
-#define Rf_pgeom_x 200
-#define Rf_phyper_x 201
-#define Rf_plnorm_x 202
-#define Rf_plogis_x 203
-#define Rf_pnbeta_x 204
-#define Rf_pnbinom_x 205
-#define Rf_pnbinom_mu_x 206
-#define Rf_pnchisq_x 207
-#define Rf_pnf_x 208
-#define Rf_pnorm5_x 209
-#define Rf_pnorm_both_x 210
-#define Rf_pnt_x 211
-#define Rf_ppois_x 212
-#define Rf_protect_x 213
-#define Rf_psigamma_x 214
-#define Rf_psignrank_x 215
-#define Rf_pt_x 216
-#define Rf_ptukey_x 217
-#define Rf_punif_x 218
-#define Rf_pweibull_x 219
-#define Rf_pwilcox_x 220
-#define Rf_qbeta_x 221
-#define Rf_qbinom_x 222
-#define Rf_qcauchy_x 223
-#define Rf_qchisq_x 224
-#define Rf_qexp_x 225
-#define Rf_qf_x 226
-#define Rf_qgamma_x 227
-#define Rf_qgeom_x 228
-#define Rf_qhyper_x 229
-#define Rf_qlnorm_x 230
-#define Rf_qlogis_x 231
-#define Rf_qnbeta_x 232
-#define Rf_qnbinom_x 233
-#define Rf_qnbinom_mu_x 234
-#define Rf_qnchisq_x 235
-#define Rf_qnf_x 236
-#define Rf_qnorm5_x 237
-#define Rf_qnt_x 238
-#define Rf_qpois_x 239
-#define Rf_qsignrank_x 240
-#define Rf_qt_x 241
-#define Rf_qtukey_x 242
-#define Rf_qunif_x 243
-#define Rf_qweibull_x 244
-#define Rf_qwilcox_x 245
-#define Rf_rbeta_x 246
-#define Rf_rbinom_x 247
-#define Rf_rcauchy_x 248
-#define Rf_rchisq_x 249
-#define Rf_rexp_x 250
-#define Rf_rf_x 251
-#define Rf_rgamma_x 252
-#define Rf_rgeom_x 253
-#define Rf_rhyper_x 254
-#define Rf_rlnorm_x 255
-#define Rf_rlogis_x 256
-#define Rf_rmultinom_x 257
-#define Rf_rnbinom_x 258
-#define Rf_rnbinom_mu_x 259
-#define Rf_rnchisq_x 260
-#define Rf_rnorm_x 261
-#define Rf_rpois_x 262
-#define Rf_rsignrank_x 263
-#define Rf_rt_x 264
-#define Rf_runif_x 265
-#define Rf_rweibull_x 266
-#define Rf_rwilcox_x 267
-#define Rf_setAttrib_x 268
-#define Rf_sign_x 269
-#define Rf_sinpi_x 270
-#define Rf_str2type_x 271
-#define Rf_tanpi_x 272
-#define Rf_tetragamma_x 273
-#define Rf_trigamma_x 274
-#define Rf_unprotect_x 275
-#define Rf_unprotect_ptr_x 276
-#define Rf_warning_x 277
-#define Rf_warningcall_x 278
-#define Rprintf_x 279
-#define SETCAD4R_x 280
-#define SETCADDDR_x 281
-#define SETCADDR_x 282
-#define SETCADR_x 283
-#define SETCAR_x 284
-#define SETCDR_x 285
-#define SETLENGTH_x 286
-#define SETLEVELS_x 287
-#define SET_ATTRIB_x 288
-#define SET_BODY_x 289
-#define SET_CLOENV_x 290
-#define SET_ENCLOS_x 291
-#define SET_FORMALS_x 292
-#define SET_NAMED_FASTR_x 293
-#define SET_OBJECT_x 294
-#define SET_RDEBUG_x 295
-#define SET_RSTEP_x 296
-#define SET_S4_OBJECT_x 297
-#define SET_STRING_ELT_x 298
-#define SET_SYMVALUE_x 299
-#define SET_TAG_x 300
-#define SET_TRUELENGTH_x 301
-#define SET_TYPEOF_x 302
-#define SET_VECTOR_ELT_x 303
-#define STRING_ELT_x 304
-#define SYMVALUE_x 305
-#define TAG_x 306
-#define TRUELENGTH_x 307
-#define TYPEOF_x 308
-#define UNSET_S4_OBJECT_x 309
-#define VECTOR_ELT_x 310
-#define forceSymbols_x 311
-#define getCCallable_x 312
-#define getConnectionClassString_x 313
-#define getEmbeddingDLLInfo_x 314
-#define getOpenModeString_x 315
-#define getSummaryDescription_x 316
-#define isSeekable_x 317
-#define octsize_x 318
-#define registerCCallable_x 319
-#define registerRoutines_x 320
-#define restoreHandlerStacks_x 321
-#define setDotSymbolValues_x 322
-#define unif_rand_x 323
-#define useDynamicSymbols_x 324
+#define Rf_allocList_x 105
+#define Rf_allocMatrix_x 106
+#define Rf_allocSExp_x 107
+#define Rf_allocVector_x 108
+#define Rf_any_duplicated_x 109
+#define Rf_any_duplicated3_x 110
+#define Rf_asChar_x 111
+#define Rf_asCharacterFactor_x 112
+#define Rf_asInteger_x 113
+#define Rf_asLogical_x 114
+#define Rf_asReal_x 115
+#define Rf_bessel_i_x 116
+#define Rf_bessel_i_ex_x 117
+#define Rf_bessel_j_x 118
+#define Rf_bessel_j_ex_x 119
+#define Rf_bessel_k_x 120
+#define Rf_bessel_k_ex_x 121
+#define Rf_bessel_y_x 122
+#define Rf_bessel_y_ex_x 123
+#define Rf_beta_x 124
+#define Rf_choose_x 125
+#define Rf_classgets_x 126
+#define Rf_coerceVector_x 127
+#define Rf_cons_x 128
+#define Rf_copyListMatrix_x 129
+#define Rf_copyMatrix_x 130
+#define Rf_copyMostAttrib_x 131
+#define Rf_cospi_x 132
+#define Rf_dbeta_x 133
+#define Rf_dbinom_x 134
+#define Rf_dcauchy_x 135
+#define Rf_dchisq_x 136
+#define Rf_defineVar_x 137
+#define Rf_dexp_x 138
+#define Rf_df_x 139
+#define Rf_dgamma_x 140
+#define Rf_dgeom_x 141
+#define Rf_dhyper_x 142
+#define Rf_digamma_x 143
+#define Rf_dlnorm_x 144
+#define Rf_dlogis_x 145
+#define Rf_dnbeta_x 146
+#define Rf_dnbinom_x 147
+#define Rf_dnbinom_mu_x 148
+#define Rf_dnchisq_x 149
+#define Rf_dnf_x 150
+#define Rf_dnorm4_x 151
+#define Rf_dnt_x 152
+#define Rf_dpois_x 153
+#define Rf_dpsifn_x 154
+#define Rf_dsignrank_x 155
+#define Rf_dt_x 156
+#define Rf_dunif_x 157
+#define Rf_duplicate_x 158
+#define Rf_dweibull_x 159
+#define Rf_dwilcox_x 160
+#define Rf_error_x 161
+#define Rf_errorcall_x 162
+#define Rf_eval_x 163
+#define Rf_findFun_x 164
+#define Rf_findVar_x 165
+#define Rf_findVarInFrame_x 166
+#define Rf_findVarInFrame3_x 167
+#define Rf_fprec_x 168
+#define Rf_ftrunc_x 169
+#define Rf_gammafn_x 170
+#define Rf_getAttrib_x 171
+#define Rf_gsetVar_x 172
+#define Rf_inherits_x 173
+#define Rf_install_x 174
+#define Rf_installChar_x 175
+#define Rf_isNull_x 176
+#define Rf_isObject_x 177
+#define Rf_isString_x 178
+#define Rf_lbeta_x 179
+#define Rf_lchoose_x 180
+#define Rf_lengthgets_x 181
+#define Rf_lgamma1p_x 182
+#define Rf_lgammafn_x 183
+#define Rf_lgammafn_sign_x 184
+#define Rf_log1pexp_x 185
+#define Rf_log1pmx_x 186
+#define Rf_logspace_add_x 187
+#define Rf_logspace_sub_x 188
+#define Rf_match_x 189
+#define Rf_mkCharLenCE_x 190
+#define Rf_namesgets_x 191
+#define Rf_ncols_x 192
+#define Rf_nrows_x 193
+#define Rf_pbeta_x 194
+#define Rf_pbinom_x 195
+#define Rf_pcauchy_x 196
+#define Rf_pchisq_x 197
+#define Rf_pentagamma_x 198
+#define Rf_pexp_x 199
+#define Rf_pf_x 200
+#define Rf_pgamma_x 201
+#define Rf_pgeom_x 202
+#define Rf_phyper_x 203
+#define Rf_plnorm_x 204
+#define Rf_plogis_x 205
+#define Rf_pnbeta_x 206
+#define Rf_pnbinom_x 207
+#define Rf_pnbinom_mu_x 208
+#define Rf_pnchisq_x 209
+#define Rf_pnf_x 210
+#define Rf_pnorm5_x 211
+#define Rf_pnorm_both_x 212
+#define Rf_pnt_x 213
+#define Rf_ppois_x 214
+#define Rf_protect_x 215
+#define Rf_psigamma_x 216
+#define Rf_psignrank_x 217
+#define Rf_pt_x 218
+#define Rf_ptukey_x 219
+#define Rf_punif_x 220
+#define Rf_pweibull_x 221
+#define Rf_pwilcox_x 222
+#define Rf_qbeta_x 223
+#define Rf_qbinom_x 224
+#define Rf_qcauchy_x 225
+#define Rf_qchisq_x 226
+#define Rf_qexp_x 227
+#define Rf_qf_x 228
+#define Rf_qgamma_x 229
+#define Rf_qgeom_x 230
+#define Rf_qhyper_x 231
+#define Rf_qlnorm_x 232
+#define Rf_qlogis_x 233
+#define Rf_qnbeta_x 234
+#define Rf_qnbinom_x 235
+#define Rf_qnbinom_mu_x 236
+#define Rf_qnchisq_x 237
+#define Rf_qnf_x 238
+#define Rf_qnorm5_x 239
+#define Rf_qnt_x 240
+#define Rf_qpois_x 241
+#define Rf_qsignrank_x 242
+#define Rf_qt_x 243
+#define Rf_qtukey_x 244
+#define Rf_qunif_x 245
+#define Rf_qweibull_x 246
+#define Rf_qwilcox_x 247
+#define Rf_rbeta_x 248
+#define Rf_rbinom_x 249
+#define Rf_rcauchy_x 250
+#define Rf_rchisq_x 251
+#define Rf_rexp_x 252
+#define Rf_rf_x 253
+#define Rf_rgamma_x 254
+#define Rf_rgeom_x 255
+#define Rf_rhyper_x 256
+#define Rf_rlnorm_x 257
+#define Rf_rlogis_x 258
+#define Rf_rmultinom_x 259
+#define Rf_rnbinom_x 260
+#define Rf_rnbinom_mu_x 261
+#define Rf_rnchisq_x 262
+#define Rf_rnorm_x 263
+#define Rf_rpois_x 264
+#define Rf_rsignrank_x 265
+#define Rf_rt_x 266
+#define Rf_runif_x 267
+#define Rf_rweibull_x 268
+#define Rf_rwilcox_x 269
+#define Rf_setAttrib_x 270
+#define Rf_sign_x 271
+#define Rf_sinpi_x 272
+#define Rf_str2type_x 273
+#define Rf_tanpi_x 274
+#define Rf_tetragamma_x 275
+#define Rf_trigamma_x 276
+#define Rf_unprotect_x 277
+#define Rf_unprotect_ptr_x 278
+#define Rf_warning_x 279
+#define Rf_warningcall_x 280
+#define Rprintf_x 281
+#define SETCAD4R_x 282
+#define SETCADDDR_x 283
+#define SETCADDR_x 284
+#define SETCADR_x 285
+#define SETCAR_x 286
+#define SETCDR_x 287
+#define SETLENGTH_x 288
+#define SETLEVELS_x 289
+#define SET_ATTRIB_x 290
+#define SET_BODY_x 291
+#define SET_CLOENV_x 292
+#define SET_ENCLOS_x 293
+#define SET_FORMALS_x 294
+#define SET_NAMED_FASTR_x 295
+#define SET_OBJECT_x 296
+#define SET_RDEBUG_x 297
+#define SET_RSTEP_x 298
+#define SET_S4_OBJECT_x 299
+#define SET_STRING_ELT_x 300
+#define SET_SYMVALUE_x 301
+#define SET_TAG_x 302
+#define SET_TRUELENGTH_x 303
+#define SET_TYPEOF_x 304
+#define SET_VECTOR_ELT_x 305
+#define STRING_ELT_x 306
+#define SYMVALUE_x 307
+#define TAG_x 308
+#define TRUELENGTH_x 309
+#define TYPEOF_x 310
+#define UNSET_S4_OBJECT_x 311
+#define VECTOR_ELT_x 312
+#define forceSymbols_x 313
+#define getCCallable_x 314
+#define getConnectionClassString_x 315
+#define getEmbeddingDLLInfo_x 316
+#define getOpenModeString_x 317
+#define getSummaryDescription_x 318
+#define isSeekable_x 319
+#define octsize_x 320
+#define registerCCallable_x 321
+#define registerRoutines_x 322
+#define restoreHandlerStacks_x 323
+#define setDotSymbolValues_x 324
+#define unif_rand_x 325
+#define useDynamicSymbols_x 326
 
-#define UPCALLS_TABLE_SIZE 325
+#define UPCALLS_TABLE_SIZE 327
 
 #endif // RFFI_UPCALLSINDEX_H
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 5d7b516f78..1b03bf8538 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
@@ -364,14 +364,18 @@ SEXP Rf_allocMatrix(SEXPTYPE mode, int nrow, int ncol) {
     return result;
 }
 
-SEXP Rf_allocList(int x) {
+SEXP Rf_allocList(int length) {
     TRACE0();
-    return UNIMPLEMENTED;
+    SEXP result = ((call_Rf_allocList) callbacks[Rf_allocList_x])(length);
+    checkExitCall();
+    return result;
 }
 
 SEXP Rf_allocSExp(SEXPTYPE t) {
     TRACE0();
-    return UNIMPLEMENTED;
+    SEXP result = ((call_Rf_allocSExp) callbacks[Rf_allocSExp_x])(t);
+    checkExitCall();
+    return result;
 }
 
 void Rf_defineVar(SEXP symbol, SEXP value, SEXP rho) {
-- 
GitLab