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