diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java
index 799af373a1eff41a2c04e49bcde16005baf2a2df..54a33fec0bd819934a2e5df6bb0017d0f1a3b45f 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridContext.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.library.fastrGrid;
 
 import java.util.ArrayList;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.r.library.fastrGrid.GridState.GridDeviceState;
 import com.oracle.truffle.r.library.fastrGrid.device.GridDevice;
 import com.oracle.truffle.r.library.fastrGrid.device.GridDevice.DeviceCloseException;
@@ -58,6 +59,7 @@ public final class GridContext {
         return INSTANCE;
     }
 
+    @TruffleBoundary
     public GridState getGridState() {
         gridState.setDeviceState(devices.get(currentDeviceIdx).state);
         return gridState;
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateGetNode.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateGetNode.java
index f54af61482e1741d64f207aa014e827a5096dbb0..d53f60c9c5da8497fe4ccc39d5b67391b476158d 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateGetNode.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateGetNode.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.library.fastrGrid;
 
 import java.util.function.Function;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 
 /**
@@ -41,6 +42,7 @@ final class GridStateGetNode extends RExternalBuiltinNode.Arg0 {
     }
 
     @Override
+    @TruffleBoundary
     public Object execute() {
         Object result = getter.apply(GridContext.getContext().getGridState());
         assert result != null;
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateSetNode.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateSetNode.java
index 4b07fdcc38dcea0935898ab4c99f38c0a793df1a..25a798d1899c0a788e0afa86f4ff9590b6dac661 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateSetNode.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridStateSetNode.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.library.fastrGrid;
 
 import java.util.function.BiConsumer;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 import com.oracle.truffle.r.runtime.data.RNull;
 
@@ -46,6 +47,7 @@ public final class GridStateSetNode extends RExternalBuiltinNode.Arg1 {
     }
 
     @Override
+    @TruffleBoundary
     public Object execute(Object arg) {
         setter.accept(GridContext.getContext().getGridState(), arg);
         return RNull.instance;
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LogFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LogFunctions.java
index a286bc76d9c332926132542a321e2121b11a2ea7..4a3a38d7134f8499c65c3460719efd9cdac0439e 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LogFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LogFunctions.java
@@ -30,6 +30,7 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
 import java.util.Arrays;
 
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.BranchProfile;
@@ -54,6 +55,7 @@ import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
+import com.oracle.truffle.r.runtime.nodes.RBaseNode;
 import com.oracle.truffle.r.runtime.ops.BinaryArithmetic;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 import com.oracle.truffle.r.runtime.ops.na.NAProfile;
@@ -208,13 +210,13 @@ public class LogFunctions {
                 Arrays.fill(resultVector, 0, resultVector.length, Double.NaN);
             } else {
                 xNACheck.enable(vector);
-                Runnable[] warningResult = new Runnable[1];
+                RBaseNode[] warningCtx = new RBaseNode[1];
                 for (int i = 0; i < vector.getLength(); i++) {
                     double value = vector.getDataAt(i);
-                    resultVector[i] = xNACheck.check(value) ? RRuntime.DOUBLE_NA : logb(value, base, warningResult);
+                    resultVector[i] = xNACheck.check(value) ? RRuntime.DOUBLE_NA : logb(value, base, warningCtx);
                 }
-                if (warningResult[0] != null) {
-                    warningResult[0].run();
+                if (warningCtx[0] != null) {
+                    RError.warning(warningCtx[0], RError.Message.NAN_PRODUCED);
                 }
             }
             boolean complete = xNACheck.neverSeenNA() && baseNACheck.neverSeenNA();
@@ -230,26 +232,27 @@ public class LogFunctions {
                 nanProfile.enter();
                 return base;
             }
-            Runnable[] warningResult = new Runnable[1];
-            double ret = logb(x, base, warningResult);
-            if (warningResult[0] != null) {
-                warningResult[0].run();
+            RBaseNode[] warningCtx = new RBaseNode[1];
+            double ret = logb(x, base, warningCtx);
+            if (warningCtx[0] != null) {
+                RError.warning(warningCtx[0], RError.Message.NAN_PRODUCED);
             }
             return ret;
         }
 
-        private double logb(double x, double base, Runnable[] warningResult) {
+        @TruffleBoundary
+        private double logb(double x, double base, RBaseNode[] warningCtx) {
             double logx = Math.log(x);
             if (Double.isNaN(logx)) {
-                warningResult[0] = () -> RError.warning(this, RError.Message.NAN_PRODUCED);
+                warningCtx[0] = this;
             }
             if (base == Math.E) {
                 return logx;
             }
 
             double result = logx / Math.log(base);
-            if (warningResult[0] == null && Double.isNaN(result)) {
-                warningResult[0] = () -> RError.warning(RError.SHOW_CALLER, RError.Message.NAN_PRODUCED);
+            if (warningCtx[0] == null && Double.isNaN(result)) {
+                warningCtx[0] = RError.SHOW_CALLER;
             }
 
             return result;