From 11b325b76db7e4f56606ffe57601ddf51dc50ca7 Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Thu, 4 May 2017 11:52:52 +0200
Subject: [PATCH] Implemented basic message resolution for some classes needed
 for debugging.

---
 .../engine/interop/RArgsValuesAndNamesMR.java | 63 +++++++++++++++++
 .../interop/RForeignAccessFactoryImpl.java    |  6 ++
 .../truffle/r/engine/interop/RPromiseMR.java  | 70 +++++++++++++++++++
 3 files changed, 139 insertions(+)
 create mode 100644 com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
 create mode 100644 com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
new file mode 100644
index 0000000000..5eafbc04ce
--- /dev/null
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.engine.interop;
+
+import com.oracle.truffle.api.interop.CanResolve;
+import com.oracle.truffle.api.interop.MessageResolution;
+import com.oracle.truffle.api.interop.Resolve;
+import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.engine.TruffleRLanguage;
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
+
+@MessageResolution(receiverType = RArgsValuesAndNames.class, language = TruffleRLanguage.class)
+public class RArgsValuesAndNamesMR {
+    @Resolve(message = "IS_BOXED")
+    public abstract static class RArgsValuesAndNamesIsBoxedNode extends Node {
+        protected Object access(@SuppressWarnings("unused") RArgsValuesAndNames receiver) {
+            return false;
+        }
+    }
+
+    @Resolve(message = "HAS_SIZE")
+    public abstract static class RArgsValuesAndNamesHasSizeNode extends Node {
+        protected Object access(@SuppressWarnings("unused") RArgsValuesAndNames receiver) {
+            return true;
+        }
+    }
+
+    @Resolve(message = "IS_NULL")
+    public abstract static class RArgsValuesAndNamesIsNullNode extends Node {
+        protected Object access(@SuppressWarnings("unused") RArgsValuesAndNames receiver) {
+            return false;
+        }
+    }
+
+    @CanResolve
+    public abstract static class RArgsValuesAndNamesCheck extends Node {
+
+        protected static boolean test(TruffleObject receiver) {
+            return receiver instanceof RArgsValuesAndNames;
+        }
+    }
+}
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java
index 887d3a7741..0c7f6bcb20 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java
@@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.conn.RConnection;
 import com.oracle.truffle.r.runtime.context.RContext;
 import com.oracle.truffle.r.runtime.context.RForeignAccessFactory;
+import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RDouble;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
 import com.oracle.truffle.r.runtime.data.RFunction;
@@ -41,6 +42,7 @@ import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPairList;
 import com.oracle.truffle.r.runtime.data.RS4Object;
+import com.oracle.truffle.r.runtime.data.RPromise;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RTruffleObject;
 import com.oracle.truffle.r.runtime.data.RUnboundValue;
@@ -110,6 +112,10 @@ public final class RForeignAccessFactoryImpl implements RForeignAccessFactory {
             return CaptureNamesImplMRForeign.ACCESS;
         } else if (obj instanceof RS4Object) {
             return RS4ObjectMRForeign.ACCESS;
+        } else if (obj instanceof RPromise) {
+            return RPromiseMRForeign.ACCESS;
+        } else if (obj instanceof RArgsValuesAndNames) {
+            return RArgsValuesAndNamesMRForeign.ACCESS;
         } else {
             if (obj instanceof RAbstractVector) {
                 return ForeignAccess.create(RAbstractVector.class, new RAbstractVectorAccessFactory());
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
new file mode 100644
index 0000000000..257848ba02
--- /dev/null
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.engine.interop;
+
+import com.oracle.truffle.api.interop.CanResolve;
+import com.oracle.truffle.api.interop.MessageResolution;
+import com.oracle.truffle.api.interop.Resolve;
+import com.oracle.truffle.api.interop.TruffleObject;
+import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.engine.TruffleRLanguage;
+import com.oracle.truffle.r.runtime.data.RPromise;
+
+@MessageResolution(receiverType = RPromise.class, language = TruffleRLanguage.class)
+public class RPromiseMR {
+    @Resolve(message = "IS_BOXED")
+    public abstract static class RPromiseIsBoxedNode extends Node {
+        protected Object access(@SuppressWarnings("unused") RPromise receiver) {
+            return true;
+        }
+    }
+
+    @Resolve(message = "HAS_SIZE")
+    public abstract static class RPromiseHasSizeNode extends Node {
+        protected Object access(@SuppressWarnings("unused") RPromise receiver) {
+            return false;
+        }
+    }
+
+    @Resolve(message = "IS_NULL")
+    public abstract static class RPromiseIsNullNode extends Node {
+        protected Object access(@SuppressWarnings("unused") RPromise receiver) {
+            return false;
+        }
+    }
+
+    @Resolve(message = "UNBOX")
+    public abstract static class RPromiseUnboxNode extends Node {
+        protected Object access(RPromise receiver) {
+            return receiver.getValue();
+        }
+    }
+
+    @CanResolve
+    public abstract static class RPromiseCheck extends Node {
+
+        protected static boolean test(TruffleObject receiver) {
+            return receiver instanceof RPromise;
+        }
+    }
+}
-- 
GitLab