Skip to content
Snippets Groups Projects
Commit 4658ec44 authored by Mick Jordan's avatar Mick Jordan
Browse files

fix enclosing frame bug in new.env

parent ad48a1a6
Branches
No related tags found
No related merge requests found
......@@ -112,7 +112,7 @@ public abstract class REnvironment implements RAttributable {
*/
private static ArrayList<REnvironment> searchPath;
private REnvironment parent;
protected REnvironment parent;
private final String name;
final REnvFrameAccess frameAccess;
private RAttributes attributes;
......@@ -494,9 +494,22 @@ public abstract class REnvironment implements RAttributable {
public MaterializedFrame getFrame() {
MaterializedFrame envFrame = frameAccess.getFrame();
if (envFrame == null) {
if (this instanceof NewEnv) {
envFrame = new REnvMaterializedFrame((REnvMapFrameAccess) frameAccess);
}
envFrame = getMaterializedFrame(this);
}
return envFrame;
}
/**
* Ensures that {@code env} and all its parents have a {@link MaterializedFrame}. Used for
* {@link NewEnv} environments that only need frames when they are used in {@code eval} etc.
*/
private static MaterializedFrame getMaterializedFrame(REnvironment env) {
MaterializedFrame envFrame = env.frameAccess.getFrame();
if (envFrame == null && env.parent != null) {
MaterializedFrame parentFrame = getMaterializedFrame(env.parent);
envFrame = new REnvMaterializedFrame((REnvMapFrameAccess) env.frameAccess);
RArguments.setEnclosingFrame(envFrame, parentFrame);
RArguments.setEnvironment(envFrame, env);
}
return envFrame;
}
......
......@@ -33,7 +33,7 @@ import com.oracle.truffle.r.runtime.data.*;
/**
* Variant of {@link REnvFrameAccess} environments where the "frame" is a {@link LinkedHashMap},
* e.g, for {link NewEnv}. By default there is no Truffle connection, i.e. {@link #getFrame()}
* returns null. However, if the owning environment is "attach"ed, then an
* returns null. However, if the owning environment is "attach"ed, or used in an "eval", then an
* {@link REnvMaterializedFrame} is created.
*/
public class REnvMapFrameAccess extends REnvFrameAccessBindingsAdapter {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment