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 0628f9d52f7c20aa1637779721dbad8487a74b72..349586e1f3c1f4bdf195499d046e9b8243905e2c 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 @@ -325,11 +325,25 @@ public final class RAbstractVectorAccessFactory implements StandardFactory { @Override public Object execute(VirtualFrame frame) { RAbstractVector arg = (RAbstractVector) ForeignAccess.getReceiver(frame); - return arg.getLength() == 1; + return arg.getLength() == 1 && isUnBoxable(arg); } }); } + private static boolean isUnBoxable(RAbstractVector vector) { + Object o = vector.getDataAtAsObject(0); + return isPrimitive(o); + } + + private static boolean isPrimitive(Object element) { + if (element == null) { + return false; + } + final Class<?> elementType = element.getClass(); + return elementType == String.class || elementType == Character.class || elementType == Boolean.class || elementType == Byte.class || elementType == Short.class || + elementType == Integer.class || elementType == Long.class || elementType == Float.class || elementType == Double.class; + } + @Override public CallTarget accessHasSize() { return Truffle.getRuntime().createCallTarget(new InteropRootNode() {