From 1ce507c4805a29ec401ae4623f245a48ef5b0caf Mon Sep 17 00:00:00 2001
From: Tomas Zezula <tomas.zezula@oracle.com>
Date: Tue, 24 Apr 2018 14:38:44 +0200
Subject: [PATCH] [GR-9535] Broken RComplex interop.

---
 .../interop/RAbstractVectorAccessFactory.java | 22 +++++++++++++++++++
 .../interop/RForeignAccessFactoryImpl.java    |  2 +-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
index 349586e1f3..8e2968305d 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
@@ -56,6 +56,9 @@ import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.data.RLogical;
 import com.oracle.truffle.r.runtime.data.RObject;
 import com.oracle.truffle.r.runtime.data.RRaw;
+import com.oracle.truffle.r.runtime.data.RScalar;
+import com.oracle.truffle.r.runtime.data.RString;
+import com.oracle.truffle.r.runtime.data.model.RAbstractAtomicVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
@@ -452,4 +455,23 @@ public final class RAbstractVectorAccessFactory implements StandardFactory {
             }
         });
     }
+
+    static class Check extends RootNode {
+
+        Check() {
+            super(null);
+        }
+
+        @Override
+        public Object execute(VirtualFrame frame) {
+            final Object receiver = ForeignAccess.getReceiver(frame);
+            // TODO: RLogical has no ForeignAccess, issue: GR-9536, use RAbstractVectorAccessFactory
+            // for compatibility.
+            final boolean logical = receiver.getClass() == RLogical.class;
+            // TODO: RString has no ForeignAccess, issue: GR-9536, use RAbstractVectorAccessFactory
+            // for compatibility.
+            final boolean string = receiver.getClass() == RString.class;
+            return receiver instanceof RAbstractAtomicVector && (!(receiver instanceof RScalar) || logical || string);
+        }
+    }
 }
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 6e356c9b25..4e33037a57 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
@@ -113,7 +113,7 @@ public final class RForeignAccessFactoryImpl implements RForeignAccessFactory {
         } else if (obj instanceof REmpty) {
             return REmptyMRForeign.ACCESS;
         } else if (obj instanceof RAbstractAtomicVector) {
-            return ForeignAccess.create(RAbstractAtomicVector.class, new RAbstractVectorAccessFactory());
+            return ForeignAccess.create(new RAbstractVectorAccessFactory(), new RAbstractVectorAccessFactory.Check());
         } else {
             ForeignAccess access = FFI_RForeignAccessFactoryImpl.getForeignAccess(obj);
             if (access != null) {
-- 
GitLab