From b6b5792ec3746782d3acfa74b38199225e18cd49 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Wed, 30 Aug 2017 13:52:53 +0200 Subject: [PATCH] Unbox should not be possible for non scalar vectors --- .../interop/RAbstractVectorAccessFactory.java | 7 ++++++- .../r/test/engine/interop/AbstractMRTest.java | 15 ++++++++++----- .../r/test/engine/interop/VectorMRTest.java | 9 ++++++++- 3 files changed, 24 insertions(+), 7 deletions(-) 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 3b9d9624bc..b878ca95c1 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 0b83817029..7ab8608b35 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 dd2e5d8039..5020e8fb4b 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; -- GitLab