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 924fc5a9455497c986c2f83f20df18d32657de23..967be7aeeff45a46ba52aeeec43e85ae574f509f 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 @@ -878,7 +878,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { } @Override - public Object R_tryEval(Object expr, Object env, int silent) { + public Object R_tryEval(Object expr, Object env, Object errorFlag, int silent) { throw implementedAsNode(); } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/TryRfEvalNode.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/TryRfEvalNode.java index c2ce411ac116b49cc166e51448f0960828a4e567..56d24ce8d3f795dc9c9169ee457c5459ef5b5f56 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/TryRfEvalNode.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/TryRfEvalNode.java @@ -22,13 +22,19 @@ */ package com.oracle.truffle.r.ffi.impl.nodes; +import com.oracle.truffle.api.interop.ForeignAccess; +import com.oracle.truffle.api.interop.InteropException; +import com.oracle.truffle.api.interop.Message; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.r.runtime.RErrorHandling; -public class TryRfEvalNode extends FFIUpCallNode.Arg3 { +public final class TryRfEvalNode extends FFIUpCallNode.Arg4 { @Child RfEvalNode rfEvalNode = RfEvalNode.create(); + @Child Node writeErrorFlagNode = Message.WRITE.createNode(); @Override - public Object executeObject(Object expr, Object env, @SuppressWarnings("unused") Object silent) { + public Object executeObject(Object expr, Object env, Object errorFlag, @SuppressWarnings("unused") Object silent) { Object handlerStack = RErrorHandling.getHandlerStack(); Object restartStack = RErrorHandling.getRestartStack(); try { @@ -36,6 +42,12 @@ public class TryRfEvalNode extends FFIUpCallNode.Arg3 { RErrorHandling.resetStacks(); return rfEvalNode.executeObject(expr, env); } catch (Throwable t) { + try { + ForeignAccess.sendWrite(writeErrorFlagNode, (TruffleObject) errorFlag, 0, 1); + } catch (InteropException e) { + // Ignore it, when using NFI, e.g., the errorFlag TO does not support the WRITE + // message + } return null; } finally { RErrorHandling.restoreStacks(handlerStack, restartStack); 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 c0c481d609e3f5efab00a5ce291df7392da88cfb..90b7e0bbf1dd70da46172dac7a494cd0b6c6a26a 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 @@ -53,6 +53,7 @@ import com.oracle.truffle.r.ffi.impl.nodes.MiscNodes.LENGTHNode; import com.oracle.truffle.r.ffi.impl.nodes.RandFunctionsNodes; import com.oracle.truffle.r.ffi.impl.nodes.RfEvalNode; import com.oracle.truffle.r.ffi.impl.nodes.TryRfEvalNode; +import com.oracle.truffle.r.ffi.processor.RFFICpointer; import com.oracle.truffle.r.ffi.processor.RFFICstring; import com.oracle.truffle.r.ffi.processor.RFFIRunGC; import com.oracle.truffle.r.ffi.processor.RFFIUpCallNode; @@ -276,7 +277,7 @@ public interface StdUpCallsRFFI { @RFFIRunGC @RFFIUpCallNode(TryRfEvalNode.class) - Object R_tryEval(Object expr, Object env, int silent); + Object R_tryEval(Object expr, Object env, @RFFICpointer Object errorFlag, int silent); Object R_ToplevelExec(); 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 e5f5f5cfdce29cb59143a704c51cfeddb6ba2d74..1aaaaa7341ebcf071fed9847ac8e3880bc004093 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 @@ -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 @@ -221,8 +221,7 @@ typedef Rboolean (*call_R_BindingIsActive)(SEXP sym, SEXP env); typedef Rboolean (*call_R_HasFancyBindings)(SEXP rho); typedef Rboolean (*call_Rf_isS4)(SEXP x); typedef SEXP (*call_Rf_asS4)(SEXP x, Rboolean b, int i); -typedef SEXP (*call_R_tryEval)(SEXP x, SEXP y, int *ErrorOccurred); -typedef SEXP (*call_R_tryEvalSilent)(SEXP x, SEXP y, int *ErrorOccurred); +typedef SEXP (*call_R_tryEval)(SEXP x, SEXP y, int *ErrorOccurred, int silent); typedef double (*call_R_atof)(const char *str); typedef double (*call_R_strtod)(const char *c, char **end); typedef SEXP (*call_R_PromiseExpr)(SEXP x); @@ -321,4 +320,3 @@ typedef void (*call_R_ReleaseObject)(SEXP x); typedef void* (*call_R_alloc)(int n, int size); #endif - 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 7fdfdfa370e89784e34bb30284e8ebd1dd541094..be5a68d08659eabac9da4df7806d30e9f2c246ea 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 @@ -1366,7 +1366,7 @@ SEXP Rf_asS4(SEXP x, Rboolean b, int i) { static SEXP R_tryEvalInternal(SEXP x, SEXP y, int *ErrorOccurred, int silent) { TRACE0(); - return ((call_R_tryEval) callbacks[R_tryEval_x])(x, y, silent); + return ((call_R_tryEval) callbacks[R_tryEval_x])(x, y, ErrorOccurred, silent); } SEXP R_tryEval(SEXP x, SEXP y, int *ErrorOccurred) {