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