From fe6ff4eb836989e673d6c31823245eaea87903e4 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Mon, 26 Jun 2017 16:42:45 +0200 Subject: [PATCH] Implemented KEYS and KEY_INFO messages for REnvironemnt. --- .../r/engine/interop/REnvironmentMR.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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 94e2701798..e8104c310f 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 { -- GitLab