From c4796c7851bda7c9f3c05a3a2b1d70ed68b56c2c Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Fri, 2 Jun 2017 12:15:55 +0200
Subject: [PATCH] Introduced caching of srcfile objects.

---
 .../com/oracle/truffle/r/runtime/RSrcref.java | 20 +++++++++++--------
 .../truffle/r/runtime/context/RContext.java   |  2 ++
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSrcref.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSrcref.java
index ed438162f9..63c82fd5e0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSrcref.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSrcref.java
@@ -81,14 +81,18 @@ public class RSrcref {
     @TruffleBoundary
     private static REnvironment createSrcfile(Path path) {
         // A srcref is an environment
-        REnvironment env = RDataFactory.createNewEnv("");
-        env.safePut(SrcrefFields.Enc.name(), "unknown");
-        env.safePut(SrcrefFields.encoding.name(), "native.enc");
-        env.safePut(SrcrefFields.timestamp.name(), getTimestamp(path));
-        env.safePut(SrcrefFields.filename.name(), path.toString());
-        env.safePut(SrcrefFields.isFile.name(), RRuntime.LOGICAL_TRUE);
-        env.safePut(SrcrefFields.wd.name(), BaseRFFI.GetwdRootNode.create().getCallTarget().call());
-        env.setClassAttr(SRCFILE_ATTR);
+        REnvironment env = RContext.getInstance().srcfileEnvironments.get(path);
+        if (env == null) {
+            env = RDataFactory.createNewEnv("");
+            env.safePut(SrcrefFields.Enc.name(), "unknown");
+            env.safePut(SrcrefFields.encoding.name(), "native.enc");
+            env.safePut(SrcrefFields.timestamp.name(), getTimestamp(path));
+            env.safePut(SrcrefFields.filename.name(), path.toString());
+            env.safePut(SrcrefFields.isFile.name(), RRuntime.LOGICAL_TRUE);
+            env.safePut(SrcrefFields.wd.name(), BaseRFFI.GetwdRootNode.create().getCallTarget().call());
+            env.setClassAttr(SRCFILE_ATTR);
+            RContext.getInstance().srcfileEnvironments.put(path, env);
+        }
         return env;
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
index e49f250dae..affd6bef10 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
@@ -24,6 +24,7 @@ package com.oracle.truffle.r.runtime.context;
 
 import java.io.Closeable;
 import java.lang.ref.WeakReference;
+import java.nio.file.Path;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Map;
@@ -454,6 +455,7 @@ public final class RContext extends com.oracle.truffle.api.ExecutionContext impl
 
     public final WeakHashMap<String, WeakReference<String>> stringMap = new WeakHashMap<>();
     public final WeakHashMap<Source, REnvironment> sourceRefEnvironments = new WeakHashMap<>();
+    public final WeakHashMap<Path, REnvironment> srcfileEnvironments = new WeakHashMap<>();
 
     private ContextState[] contextStates() {
         return new ContextState[]{stateREnvVars, stateRProfile, stateTempPath, stateROptions, stateREnvironment, stateRErrorHandling, stateRConnection, stateStdConnections, stateRNG, stateRFFI,
-- 
GitLab