diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java
index a5287eceb233aed86d7ad08ace8a7944c00dd45b..2a29784e9d0ce13e72fedcfe15f6ef086edab9b0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java
@@ -44,7 +44,7 @@ public final class RInternalCode {
     private final String basePackage;
     private final Source source;
 
-    private REnvironment evaluatedEnvironment;
+    private volatile REnvironment evaluatedEnvironment;
 
     private RInternalCode(RContext context, String basePackage, Source source) {
         this.context = context;
@@ -57,7 +57,7 @@ public final class RInternalCode {
         return Utils.getResourceAsSource(clazz, fileName);
     }
 
-    private REnvironment evaluate() {
+    private synchronized REnvironment evaluate() {
         try {
             RExpression parsedCode = context.getThisEngine().parse(source);
             REnvironment statsPackage = REnvironment.getRegisteredNamespace(context, basePackage);
@@ -72,13 +72,15 @@ public final class RInternalCode {
         }
     }
 
-    public RFunction lookupFunction(String name) {
+    public synchronized RFunction lookupFunction(String name) {
         REnvironment env = this.evaluatedEnvironment;
         if (env == null) {
             env = evaluate();
             this.evaluatedEnvironment = env;
         }
-        return (RFunction) env.get(name);
+        RFunction fun = (RFunction) env.get(name);
+        assert fun != null;
+        return fun;
     }
 
     public static RInternalCode lookup(RContext context, String basePackage, Source source) {