From ae2efefd2d3a1b83fecced5e7af1b643c1df6eb1 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 18 Nov 2016 14:06:33 +0100
Subject: [PATCH] cache in RBuiltinPackage.getRFiles (speeds up context
 creation)

---
 .../oracle/truffle/r/nodes/builtin/RBuiltinPackage.java  | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java
index bc9a8097e0..521ae38163 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/RBuiltinPackage.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Supplier;
 
 import com.oracle.truffle.api.frame.MaterializedFrame;
@@ -100,13 +101,19 @@ public abstract class RBuiltinPackage {
         return name;
     }
 
+    private static final ConcurrentHashMap<String, String[]> rFilesCache = new ConcurrentHashMap<>();
+
     /**
      * Get a list of R override files for package {@code pkgName}, from the {@code pkgName/R}
      * subdirectory.
      */
     public static ArrayList<Source> getRFiles(String pkgName) {
         ArrayList<Source> componentList = new ArrayList<>();
-        String[] rFileContents = ResourceHandlerFactory.getHandler().getRFiles(RBuiltinPackage.class, pkgName);
+        String[] rFileContents = rFilesCache.get(pkgName);
+        if (rFileContents == null) {
+            rFileContents = ResourceHandlerFactory.getHandler().getRFiles(RBuiltinPackage.class, pkgName);
+            rFilesCache.put(pkgName, rFileContents);
+        }
         for (String rFileContent : rFileContents) {
             Source content = RSource.fromTextInternal(rFileContent, RSource.Internal.R_IMPL);
             componentList.add(content);
-- 
GitLab