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