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 3b9d9624bc827d2f6ab7300fb7f586d7337c76c0..b878ca95c112d79d574feea756c1e1e9823fdce6 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 @@ -37,6 +37,7 @@ import com.oracle.truffle.api.interop.KeyInfo; import com.oracle.truffle.api.interop.Message; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnknownIdentifierException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.profiles.ConditionProfile; @@ -280,7 +281,11 @@ public final class RAbstractVectorAccessFactory implements Factory26 { @Override public Object execute(VirtualFrame frame) { RAbstractVector arg = (RAbstractVector) ForeignAccess.getReceiver(frame); - return arg.getDataAtAsObject(0); + if (arg.getLength() == 1) { + return arg.getDataAtAsObject(0); + } else { + throw UnsupportedMessageException.raise(Message.UNBOX); + } } }); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java index 0b838170299ca9e3e30c0d29566e5432d46939e2..7ab8608b3588f6a60444863dc9c3a53cc8568168 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/AbstractMRTest.java @@ -38,6 +38,7 @@ import org.junit.BeforeClass; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import org.junit.Test; public abstract class AbstractMRTest { @@ -150,11 +151,9 @@ public abstract class AbstractMRTest { assertEquals(isBoxed(obj), isBoxed); if (isBoxed) { assertEquals(getUnboxed(obj), ForeignAccess.sendUnbox(Message.UNBOX.createNode(), obj)); + } else { + assertInteropException(() -> ForeignAccess.sendUnbox(Message.UNBOX.createNode(), obj), UnsupportedMessageException.class); } - // else { - // assertInteropException(() -> ForeignAccess.sendUnbox(Message.UNBOX.createNode(), - // obj), UnsupportedMessageException.class); - // } } } @@ -224,7 +223,13 @@ public abstract class AbstractMRTest { Assert.fail("InteropException was expected but got insteat: " + ex); } } - assertTrue(ie); + if (!ie) { + if (expectedClazz != null) { + Assert.fail(expectedClazz + " was expected"); + } else { + Assert.fail("InteropException was expected"); + } + } } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java index dd2e5d803965878979f4e5a17da958b69f6c7feb..5020e8fb4b505e5a7a3f448230aa5856b89fb6a6 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/VectorMRTest.java @@ -36,6 +36,7 @@ import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.interop.java.JavaInterop; import com.oracle.truffle.api.source.Source; +import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; @@ -92,7 +93,7 @@ public class VectorMRTest extends AbstractMRTest { @Override protected TruffleObject[] createTruffleObjects() throws Exception { - return new TruffleObject[]{create("1:10"), create("as.numeric()")}; + return new TruffleObject[]{RDataFactory.createDoubleVector(new double[]{1}, true), create("c(1:10)"), create("as.numeric()")}; } @Override @@ -105,6 +106,12 @@ public class VectorMRTest extends AbstractMRTest { return ((RAbstractVector) obj).getLength() == 1; } + @Override + protected Object getUnboxed(TruffleObject obj) { + assertTrue(((RAbstractVector) obj).getLength() == 1); + return ((RAbstractVector) obj).getDataAtAsObject(0); + } + @Override protected boolean hasSize(TruffleObject obj) { return true;