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 ed438162f9482c8253064a170b17de771c27fd90..63c82fd5e0eaa8dda66b6952f055c0f5c19d4de9 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 e49f250dae488b0679e9becaf528227aef5af405..affd6bef10ef5dc829e42e72a9bca1b7211eb572 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,