diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java index d22caa9aaf12ba0b5d9bc0d0d5a6ac1ffc5d165a..bc856523e38aec4a9c68afcbb73dbd27f968fffa 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/RRuntimeASTAccessImpl.java @@ -271,7 +271,7 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { return result; } - private static RNode unwrapToRNode(Object objArg) { + private RNode unwrapToRNode(Object objArg) { Object obj = objArg; // obj is RSymbol or a primitive value. // A symbol needs to be converted back to a ReadVariableNode @@ -279,6 +279,9 @@ class RRuntimeASTAccessImpl implements RRuntimeASTAccess { return (RNode) RASTUtils.unwrap(((RLanguage) obj).getRep()); } else if (obj instanceof RSymbol) { return ReadVariableNode.create(((RSymbol) obj).getName()); + } else if (obj instanceof RPromise) { + // Evaluate promise and return the result as constant. + return ConstantNode.create(forcePromise("unwrapToRNode", objArg)); } else { return ConstantNode.create(obj); } 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 12b2efafc97208aff8087ae8a17f1961cf82d614..3b073fef2479aba79cd53d1cd8488ae2c42ac0b6 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 @@ -67,6 +67,7 @@ import com.oracle.truffle.r.runtime.conn.NativeConnections.NativeRConnection; import com.oracle.truffle.r.runtime.conn.RConnection; import com.oracle.truffle.r.runtime.context.Engine.ParseException; import com.oracle.truffle.r.runtime.context.RContext; +import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RAttributable; import com.oracle.truffle.r.runtime.data.RAttributesLayout; import com.oracle.truffle.r.runtime.data.RDataFactory; @@ -581,6 +582,16 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { } } + @Override + public Object SET_NAMED_FASTR(Object x, int v) { + if (x instanceof RShareable) { + ((RShareable) x).incRefCount(); + return RNull.instance; + } else { + throw unimplemented(); + } + } + @Override public Object SET_TYPEOF_FASTR(Object x, int v) { int code = SEXPTYPE.gnuRCodeForObject(x); @@ -644,6 +655,12 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { public Object TAG(Object e) { if (e instanceof RPairList) { return ((RPairList) e).getTag(); + } else if (e instanceof RArgsValuesAndNames) { + ArgumentsSignature signature = ((RArgsValuesAndNames) e).getSignature(); + if (signature.getLength() > 0 && signature.getName(0) != null) { + return signature.getName(0); + } + return RNull.instance; } else { guaranteeInstanceOf(e, RExternalPtr.class); // at the moment, this can only be used to null out the pointer @@ -691,8 +708,14 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { @Override public Object SETCAR(Object x, Object y) { - guaranteeInstanceOf(x, RPairList.class); - ((RPairList) x).setCar(y); + RPairList pl; + if (x instanceof RLanguage) { + pl = ((RLanguage) x).getPairList(); + } else { + guaranteeInstanceOf(x, RPairList.class); + pl = (RPairList) x; + } + pl.setCar(y); return y; } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java index 2fb1c91b4c5da517ca6e13b03fbe8a46c8ace852..b779d8c54ec5ac1ad886c7db22786a6a88403076 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/TracingUpCallsRFFIImpl.java @@ -309,6 +309,12 @@ final class TracingUpCallsRFFIImpl implements UpCallsRFFI { return delegate.NAMED(x); } + @Override + public Object SET_NAMED_FASTR(Object x, int v) { + RFFIUtils.traceUpCall("SET_NAMED_FASTR", x, v); + return delegate.SET_NAMED_FASTR(x, v); + } + @Override public Object SET_TYPEOF_FASTR(Object x, int v) { RFFIUtils.traceUpCall("SET_TYPEOF_FASTR", x, v); diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java index e2010764484de96abf096f52db83204c0cae5940..8db649b9ccc211d5827c67d796849899d2fce318 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java @@ -26,8 +26,11 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RLanguage; +import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RPairList; +import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.RTypes; /** @@ -48,6 +51,21 @@ public final class ListAccessNodes { return lang.getDataAtAsObject(0); } + @Specialization + protected Object car(RArgsValuesAndNames args) { + return args.getArgument(0); + } + + @Specialization + protected Object car(RSymbol sym) { + return sym; + } + + @Specialization + protected Object car(@SuppressWarnings("unused") RNull nil) { + return RNull.instance; + } + @Fallback protected Object car(@SuppressWarnings("unused") Object obj) { throw RInternalError.unimplemented("CAR only works on pair lists and language objects"); @@ -68,6 +86,11 @@ public final class ListAccessNodes { return l.cdr(); } + @Specialization + protected Object cdr(RArgsValuesAndNames args) { + return args.toPairlist().cdr(); + } + @Fallback protected Object cdr(@SuppressWarnings("unused") Object obj) { throw RInternalError.unimplemented("CDR only works on pair lists and language objects"); diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java index dfe993c8a64d2cdc6cb3329df40fa6526f449d23..f428cb625cfa537e6f363aadca4564b74ce6ceec 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/MiscNodes.java @@ -33,6 +33,7 @@ import com.oracle.truffle.r.nodes.access.UpdateSlotNodeGen; import com.oracle.truffle.r.nodes.objects.NewObject; import com.oracle.truffle.r.nodes.objects.NewObjectNodeGen; import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RSymbol; import com.oracle.truffle.r.runtime.data.RTypes; @@ -81,6 +82,11 @@ public final class MiscNodes { return obj.getLength(); } + @Specialization + protected int length(RArgsValuesAndNames obj) { + return obj.getLength(); + } + @Fallback protected int length(Object obj) { CompilerDirectives.transferToInterpreter(); 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 34e5920142774fa21726f9a4860beb1745c1bf96..49014be6befa6e4878f9f0681d4e518ca898857d 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 @@ -146,6 +146,8 @@ public interface StdUpCallsRFFI { int NAMED(Object x); + Object SET_NAMED_FASTR(Object x, int v); + Object SET_TYPEOF_FASTR(Object x, int v); int TYPEOF(Object x); diff --git a/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c b/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c index 184f0869edeb7e2a760cdf6364a5f9242211d572..48cab2736216cb2c7790c7a6c2fa69c5eda0263c 100644 --- a/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c +++ b/com.oracle.truffle.r.native/fficall/src/common/inlined_fastr.c @@ -45,16 +45,10 @@ INLINE_FUN R_len_t length(SEXP s) case VECSXP: case EXPRSXP: case RAWSXP: + case DOTSXP: return LENGTH(s); case LISTSXP: case LANGSXP: - case DOTSXP: - i = 0; - while (s != NULL && s != R_NilValue) { - i++; - s = CDR(s); - } - return i; case ENVSXP: return Rf_envlength(s); default: @@ -77,16 +71,10 @@ INLINE_FUN R_xlen_t xlength(SEXP s) case VECSXP: case EXPRSXP: case RAWSXP: + case DOTSXP: return XLENGTH(s); case LISTSXP: case LANGSXP: - case DOTSXP: - i = 0; - while (s != NULL && s != R_NilValue) { - i++; - s = CDR(s); - } - return i; case ENVSXP: return Rf_envlength(s); default: diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c index 823acf5af00657e80bb01bc573d8c94764f8565f..710affdd150797f463f9098c7b5322de2b0715bd 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/Rinternals.c @@ -107,6 +107,7 @@ static jmethodID Rf_PairToVectorListMethodID; static jmethodID gnuRCodeForObjectMethodID; static jmethodID NAMED_MethodID; static jmethodID SET_TYPEOF_FASTR_MethodID; +static jmethodID SET_NAMED_FASTR_MethodID; static jmethodID TYPEOF_MethodID; static jmethodID OBJECT_MethodID; static jmethodID DUPLICATE_ATTRIB_MethodID; @@ -225,6 +226,7 @@ void init_internals(JNIEnv *env) { Rf_PairToVectorListMethodID = checkGetMethodID(env, UpCallsRFFIClass, "Rf_PairToVectorList", "(Ljava/lang/Object;)Ljava/lang/Object;", 0); NAMED_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "NAMED", "(Ljava/lang/Object;)I", 0); SET_TYPEOF_FASTR_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "SET_TYPEOF_FASTR", "(Ljava/lang/Object;I)Ljava/lang/Object;", 0); + SET_NAMED_FASTR_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "SET_NAMED_FASTR", "(Ljava/lang/Object;I)Ljava/lang/Object;", 0); TYPEOF_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "TYPEOF", "(Ljava/lang/Object;)I", 0); OBJECT_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "OBJECT", "(Ljava/lang/Object;)I", 0); DUPLICATE_ATTRIB_MethodID = checkGetMethodID(env, UpCallsRFFIClass, "DUPLICATE_ATTRIB", "(Ljava/lang/Object;Ljava/lang/Object;)I", 0); @@ -1252,7 +1254,8 @@ SEXP SET_TYPEOF_FASTR(SEXP x, int v){ } void SET_NAMED(SEXP x, int v){ - unimplemented("SET_NAMED"); + JNIEnv *thisenv = getEnv(); + (*thisenv)->CallObjectMethod(thisenv, UpCallsRFFIObject, SET_NAMED_FASTR_MethodID, x, v); } void SET_ATTRIB(SEXP x, SEXP v){ @@ -1559,7 +1562,7 @@ int R_check_class_etc (SEXP x, const char **valid) { return R_check_class_etc_helper(x, valid, jniGetMethodsNamespace); } -SEXP R_PreserveObject(SEXP x) { +SEXP R_PreserveObject_FASTR(SEXP x) { // convert to a JNI global ref until explicitly released return createGlobalRef(getEnv(), x, 0); } diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c index 473de0261a9cacc21e16f43a3ab2ea4403d11a3e..6d04555401fa4b32eb746bb7ac6ebc545d0825ca 100644 --- a/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/truffle_llvm/Rinternals.c @@ -1085,7 +1085,7 @@ int R_check_class_etc (SEXP x, const char **valid) { return (int) unimplemented("R_check_class_etc"); } -SEXP R_PreserveObject(SEXP x) { +SEXP R_PreserveObject_FASTR(SEXP x) { return unimplemented("R_PreserveObject"); } diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c index 6b5569d2973f0d2bf0b3b963739adfe56a445955..05e517b2013d5bdf3b8fa38f283eac167cf8381b 100644 --- a/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c +++ b/com.oracle.truffle.r.native/fficall/src/truffle_nfi/Rinternals.c @@ -1168,7 +1168,7 @@ int R_check_class_etc (SEXP x, const char **valid) { return R_check_class_etc_helper(x, valid, nfiGetMethodsNamespace); } -SEXP R_PreserveObject(SEXP x) { +SEXP R_PreserveObject_FASTR(SEXP x) { TruffleEnv* env = (*truffleContext)->getTruffleEnv(truffleContext); return (*env)->newObjectRef(env, x); } diff --git a/com.oracle.truffle.r.native/version.source b/com.oracle.truffle.r.native/version.source index 9902f17848a8974ab57d57999b74a63198fe6e23..f04c001f3f7fd5d290d0264b4a2c35f7b159ac42 100644 --- a/com.oracle.truffle.r.native/version.source +++ b/com.oracle.truffle.r.native/version.source @@ -1 +1 @@ -28 +29 diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/RArgsValuesAndNamesPrinter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/RArgsValuesAndNamesPrinter.java new file mode 100644 index 0000000000000000000000000000000000000000..b77c4f9c360c0613d58199f083dc7b9b0a795991 --- /dev/null +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/RArgsValuesAndNamesPrinter.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017, 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.nodes.builtin.base.printer; + +import java.io.IOException; + +import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; +import com.oracle.truffle.r.runtime.data.RDataFactory; + +public final class RArgsValuesAndNamesPrinter extends AbstractValuePrinter<RArgsValuesAndNames> { + + public static final RArgsValuesAndNamesPrinter INSTANCE = new RArgsValuesAndNamesPrinter(); + + private RArgsValuesAndNamesPrinter() { + } + + @Override + protected void printValue(RArgsValuesAndNames value, PrintContext printCtx) throws IOException { + StringVectorPrinter.INSTANCE.print(RDataFactory.createStringVector("<...>"), printCtx); + } + +} diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java index 0bd88751d6643cdb10f595f18ad40e3a5b98507f..e3c2e29a373bec5ea0d6026dc2f2b3b6c09eb518 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/ValuePrinters.java @@ -31,6 +31,7 @@ import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.r.nodes.function.ClassHierarchyNode; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RAttributable; import com.oracle.truffle.r.runtime.data.RExpression; import com.oracle.truffle.r.runtime.data.RExternalPtr; @@ -107,6 +108,8 @@ final class ValuePrinters implements ValuePrinter<Object> { printer = RawVectorPrinter.INSTANCE; } else if (x instanceof RAbstractListVector) { printer = ListPrinter.INSTANCE; + } else if (x instanceof RArgsValuesAndNames) { + printer = RArgsValuesAndNamesPrinter.INSTANCE; } else if (x instanceof REnvironment) { printer = EnvironmentPrinter.INSTANCE; } else if (x instanceof TruffleObject) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java index 1f874d0842786b2e9c4e944544a9815dc2941bab..132f153d20779c4fae436c2d095926e573206952 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java @@ -28,6 +28,7 @@ import com.oracle.truffle.r.runtime.Arguments; import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.RType; +import com.oracle.truffle.r.runtime.gnur.SEXPTYPE; /** * A simple wrapper class for passing the ... argument through RArguments @@ -60,4 +61,24 @@ public final class RArgsValuesAndNames extends Arguments<Object> implements RTyp public void setTypedValueInfo(int value) { throw RInternalError.shouldNotReachHere(); } + + public RPairList toPairlist() { + RPairList head = null; + ArgumentsSignature signature = getSignature(); + assert signature.getLength() == getLength(); + for (int i = 0; i < getLength(); i++) { + String name = signature.getName(i); + RPairList cur = RDataFactory.createPairList(getArgument(i), RNull.instance, name != null ? name : RNull.instance, SEXPTYPE.DOTSXP); + + if (head == null) { + head = cur; + } else { + head.appendToEnd(cur); + } + } + if (head != null) { + return head; + } + return RDataFactory.createPairList(RNull.instance); + } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index bb19311e0bb716428d512ff0a3cdb108c94138cc..fd2952d4e0c5bbcbb778e51c5794ac6ee868528e 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -62588,6 +62588,10 @@ Error in seq.int(NaN) : 'from' cannot be NA, NaN or infinite #argv <- list(from = 0, to = 0.793110173512391, length.out = FALSE);do.call('seq.int', argv); integer(0) +##com.oracle.truffle.r.test.builtins.TestBuiltin_serialize.testSerializeWithPromises# +#{ f <- function(...) serialize(environment()[['...']],NULL); x <- unserialize(f(a=3,b=2,c=1)); typeof(x) } +[1] "..." + ##com.oracle.truffle.r.test.builtins.TestBuiltin_serialize.testSerializeWithPromises# #{ f <- function(...) serialize(mget('...'),NULL); length(unserialize(f(a=3,b=2,c=1))[[1]]); } [1] 3 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java index 018b22c6522e7f87fd641f22e554eb5fe53ca58d..e0ef86b8142d201c59940a44be130243039b8688 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_serialize.java @@ -115,5 +115,6 @@ public class TestBuiltin_serialize extends TestBase { @Test public void testSerializeWithPromises() { assertEval("{ f <- function(...) serialize(mget('...'),NULL); length(unserialize(f(a=3,b=2,c=1))[[1]]); }"); + assertEval("{ f <- function(...) serialize(environment()[['...']],NULL); x <- unserialize(f(a=3,b=2,c=1)); typeof(x) }"); } } diff --git a/mx.fastr/mx_fastr_edinclude.py b/mx.fastr/mx_fastr_edinclude.py index bed40f5912044d02c67819cfd80e0c41f4fd87bc..1ca1490bc01cf29bcb8a3133320c43ceb3a174e3 100644 --- a/mx.fastr/mx_fastr_edinclude.py +++ b/mx.fastr/mx_fastr_edinclude.py @@ -84,7 +84,8 @@ use_internals_end = '''#endif ''' preserveObject = '''#ifdef FASTR -SEXP R_PreserveObject(SEXP); +SEXP R_PreserveObject_FASTR(SEXP); +#define R_PreserveObject(var) ((var) = R_PreserveObject_FASTR((var))) #else '''