diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java index 94e27017981917fb8c9f1b4dcf3b84dcbcc1e967..e8104c310ff3334ca899365ce8fd1c27a0a2b6a8 100644 --- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java +++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java @@ -97,6 +97,34 @@ public class REnvironmentMR { } } + @Resolve(message = "KEYS") + public abstract static class REnvironmentKeysNode extends Node { + + protected Object access(REnvironment receiver) { + return receiver.ls(true, null, true); + } + } + + @Resolve(message = "KEY_INFO") + public abstract static class REnvironmentKeyInfoNode extends Node { + + private static final int READABLE = 1 << 1; + private static final int WRITABLE = 1 << 2; + + protected Object access(@SuppressWarnings("unused") VirtualFrame frame, REnvironment receiver, String identifier) { + Object val = receiver.get(identifier); + if (val == null) { + return 0; + } + + int info = READABLE; + if (!receiver.isLocked() && !receiver.bindingIsLocked(identifier)) { + info += WRITABLE; + } + return info; + } + } + @CanResolve public abstract static class REnvironmentCheck extends Node {