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