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 141b9841a229b852df644883d8de76e92ddcf47b..df5375d70c821b3a9968ba1698399fcba8b6cb43 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 @@ -32,6 +32,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; @@ -1465,13 +1466,17 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { } @Override - public int R_PreserveObject(Object obj) { - throw RInternalError.unimplemented(); + public void R_PreserveObject(Object obj) { + guaranteeInstanceOf(obj, RObject.class); + HashSet<RObject> list = RContext.getInstance().preserveList; + list.add((RObject) obj); } @Override - public int R_ReleaseObject(Object obj) { - throw RInternalError.unimplemented(); + public void R_ReleaseObject(Object obj) { + guaranteeInstanceOf(obj, RObject.class); + HashSet<RObject> list = RContext.getInstance().preserveList; + list.remove(obj); } @Override diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/MemoryUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/MemoryUpCallsRFFI.java index b0ce956cb2ddb2c1df9addbf9dbe5742b504f514..62776b2be60b4fa2882917fef0a16088d1c57364 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/MemoryUpCallsRFFI.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/MemoryUpCallsRFFI.java @@ -25,9 +25,9 @@ package com.oracle.truffle.r.ffi.impl.upcalls; public interface MemoryUpCallsRFFI { // Checkstyle: stop method name check - int R_PreserveObject(Object obj); + void R_PreserveObject(Object obj); - int R_ReleaseObject(Object obj); + void R_ReleaseObject(Object obj); Object Rf_protect(Object x); diff --git a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcalls.h b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcalls.h index c58a2d95b6586001b3d9f7a6b3a339beb35f2724..a2bb0606209e0810ab6b1b1272cbc6da9c5dafe9 100644 --- a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcalls.h +++ b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcalls.h @@ -295,7 +295,7 @@ typedef void (*call_Rf_unprotect)(int x); typedef int (*call_R_ProtectWithIndex)(SEXP x); typedef void (*call_R_Reprotect)(SEXP x, int y); typedef void (*call_Rf_unprotect_ptr)(SEXP x); -typedef SEXP (*call_R_PreserveObject)(SEXP x); +typedef void (*call_R_PreserveObject)(SEXP x); typedef void (*call_R_ReleaseObject)(SEXP x); #endif diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java index 4d1f4bf43f7ca73b1a5f008b0639b0fe279b0202..bfeebda3a4233a4cb9e2674a8e1d39de1fbad66c 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java @@ -42,6 +42,7 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.TimeZone; @@ -356,8 +357,18 @@ public final class RContext implements RTruffleObject { public final WeakHashMap<Path, REnvironment> srcfileEnvironments = new WeakHashMap<>(); public final List<String> libraryPaths = new ArrayList<>(1); public final Map<Integer, Thread> threads = new ConcurrentHashMap<>(); + + /** + * Stack used by RFFI to implement the PROTECT/UNPROTECT functions. + */ public final ArrayList<RObject> protectStack = new ArrayList<>(); + /** + * FastR equivalent of GNUR's special dedicated global list that is GC root and so any vectors + * added to it will be guaranteed to be preserved. + */ + public final HashSet<RObject> preserveList = new HashSet<>(); + private final AllocationReporter allocationReporter; private ContextState[] contextStates() { diff --git a/mx.fastr/copyrights/overrides b/mx.fastr/copyrights/overrides index e69add7b7a0266a7ba974868708d0fbcda33c193..2fdbdd1da887e394c33a808053a6051f577a34f6 100644 --- a/mx.fastr/copyrights/overrides +++ b/mx.fastr/copyrights/overrides @@ -54,6 +54,7 @@ com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/tools/ToolsText.ja com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/CountFields.java,gnu_r.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/Download.java,gnu_r_gentleman_ihaka2.copyright com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/Menu.java,gnu_r.copyright +com.oracle.truffle.r.native/fficall/src/truffle_common/Rembedded.c,gnu_r.copyright com.oracle.truffle.r.native/fficall/src/common/arithmetic_fastr.c,gnu_r_gentleman_ihaka.copyright com.oracle.truffle.r.native/fficall/src/common/coerce_fastr.c,gnu_r_gentleman_ihaka.copyright com.oracle.truffle.r.native/fficall/src/common/errors_fastr.c,gnu_r.core.copyright