diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index 8bfbe34c6cad6cb7fdc336d9096ea8256a675d21..5d755314854fdd9ab12094c41ad34c8ae1000656 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.RootCallTarget;
 import com.oracle.truffle.api.Truffle;
+import com.oracle.truffle.api.TruffleLanguage;
 import com.oracle.truffle.api.dsl.UnsupportedSpecializationException;
 import com.oracle.truffle.api.frame.Frame;
 import com.oracle.truffle.api.frame.MaterializedFrame;
@@ -45,6 +46,7 @@ import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.interop.java.JavaInterop;
 import com.oracle.truffle.api.nodes.ExecutableNode;
+import com.oracle.truffle.api.nodes.ExplodeLoop;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.RootNode;
 import com.oracle.truffle.api.profiles.ValueProfile;
@@ -285,7 +287,7 @@ final class REngine implements Engine, Engine.Timings {
         }
     }
 
-    List<RSyntaxNode> parseSource(Source source) throws ParseException {
+    private List<RSyntaxNode> parseSource(Source source) throws ParseException {
         RParserFactory.Parser<RSyntaxNode> parser = RParserFactory.getParser();
         return parser.script(source, new RASTBuilder(), context.getLanguage());
     }
@@ -327,24 +329,33 @@ final class REngine implements Engine, Engine.Timings {
     @Override
     public ExecutableNode parseToExecutableNode(Source source) throws ParseException {
         List<RSyntaxNode> list = parseSource(source);
-        RNode[] statements = new RNode[list.size()];
-        for (int i = 0; i < statements.length; i++) {
-            statements[i] = list.get(i).asRNode();
+        return new ExecutableNodeImpl(context.getLanguage(), list);
+    }
+
+    private class ExecutableNodeImpl extends ExecutableNode {
+
+        @Child R2Foreign toForeignNode = R2Foreign.create();
+        @Children final RNode[] statements;
+
+        private ExecutableNodeImpl(TruffleLanguage<?> language, List<RSyntaxNode> list) {
+            super(language);
+            statements = new RNode[list.size()];
+            for (int i = 0; i < statements.length; i++) {
+                statements[i] = list.get(i).asRNode();
+            }
         }
-        return new ExecutableNode(context.getLanguage()) {
-            @Child private R2Foreign toForeignNode = R2Foreign.create();
 
-            @Override
-            public Object execute(VirtualFrame frame) {
-                if (statements.length == 0) {
-                    return RNull.instance;
-                }
-                for (int i = 0; i < statements.length - 1; i++) {
-                    statements[i].execute(frame);
-                }
-                return toForeignNode.execute(statements[statements.length - 1].execute(frame));
+        @Override
+        @ExplodeLoop
+        public Object execute(VirtualFrame frame) {
+            if (statements.length == 0) {
+                return RNull.instance;
             }
-        };
+            for (int i = 0; i < statements.length - 1; i++) {
+                statements[i].execute(frame);
+            }
+            return toForeignNode.execute(statements[statements.length - 1].execute(frame));
+        }
     }
 
     private static SourceSection createSourceSection(Source source, List<RSyntaxNode> statements) {