From b2a94f3952396c07f24742ce529bac930db7e323 Mon Sep 17 00:00:00 2001 From: stepan <stepan.sindelar@oracle.com> Date: Thu, 22 Feb 2018 22:00:46 +0100 Subject: [PATCH] REmbedded: do not longjmp when outside of down-call context --- .../r/ffi/impl/nfi/HandleNFIUpCallExceptionNode.java | 10 ++++++++++ .../com/oracle/truffle/r/runtime/ffi/RFFIContext.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/HandleNFIUpCallExceptionNode.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/HandleNFIUpCallExceptionNode.java index 4c3835c1d6..a5bfb6562e 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/HandleNFIUpCallExceptionNode.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/HandleNFIUpCallExceptionNode.java @@ -24,16 +24,22 @@ package com.oracle.truffle.r.ffi.impl.nfi; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.ConditionProfile; +import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.ffi.CallRFFI.HandleUpCallExceptionNode; import com.oracle.truffle.r.runtime.ffi.DownCallNodeFactory.DownCallNode; import com.oracle.truffle.r.runtime.ffi.NativeFunction; public class HandleNFIUpCallExceptionNode extends Node implements HandleUpCallExceptionNode { @Child private DownCallNode setFlagNode = TruffleNFI_DownCallNodeFactory.INSTANCE.createDownCallNode(NativeFunction.set_exception_flag); + private final ConditionProfile isEmbeddedTopLevel = ConditionProfile.createBinaryProfile(); @Override @TruffleBoundary public void execute(Throwable originalEx) { + if (isEmbeddedTopLevel.profile(RContext.isEmbedded() && isTopLevel())) { + return; + } setFlagNode.call(); RuntimeException ex; if (originalEx instanceof RuntimeException) { @@ -43,4 +49,8 @@ public class HandleNFIUpCallExceptionNode extends Node implements HandleUpCallEx } TruffleNFI_Context.getInstance().setLastUpCallException(ex); } + + private static boolean isTopLevel() { + return ((TruffleNFI_Context) RContext.getInstance().getRFFI()).getCallDepth() == 0; + } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java index bc6bf9f3a9..c5de3d2ae5 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/RFFIContext.java @@ -126,7 +126,7 @@ public abstract class RFFIContext extends RFFI { cooperativeGc(); } - public int getCallDepth() { + public final int getCallDepth() { return callDepth; } -- GitLab