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 349586e1f3c1f4bdf195499d046e9b8243905e2c..8e2968305d60949dbf080ded29480f75161d31bb 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 6e356c9b25bc4135b603ca2df2bc0e83fc52f5de..4e33037a5790d8df826524fdc62533ba41703da0 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) {