diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LConvert.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LConvert.java index 134def4c4e4395475982a20b3d7069f3a79e9522..ce0d219dcebae5d76b10c51eb442a6eb1fd2c28a 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LConvert.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LConvert.java @@ -15,6 +15,7 @@ import static com.oracle.truffle.r.library.fastrGrid.Unit.NATIVE; import static com.oracle.truffle.r.library.fastrGrid.Unit.NPC; import static com.oracle.truffle.r.library.fastrGrid.Unit.isArithmeticUnit; import static com.oracle.truffle.r.library.fastrGrid.Unit.isListUnit; +import static com.oracle.truffle.r.library.fastrGrid.Unit.isSimpleUnit; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.abstractVectorValue; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue; @@ -64,7 +65,10 @@ public abstract class LConvert extends RExternalBuiltinNode.Arg4 { int length = unitLength.execute(units); double[] result = new double[length]; - RAbstractIntVector unitIds = GridUtils.asIntVector(units.getAttr(Unit.VALID_UNIT_ATTR)); + RAbstractIntVector unitIds = null; + if (isSimpleUnit(units)) { + unitIds = GridUtils.asIntVector(units.getAttr(Unit.VALID_UNIT_ATTR)); + } boolean fromUnitIsSimple = !isArithmeticUnit(units) && !isListUnit(units); for (int i = 0; i < length; i++) { @@ -75,7 +79,10 @@ public abstract class LConvert extends RExternalBuiltinNode.Arg4 { double vpToSize = axisTo.isHorizontal() ? vpTransform.size.getWidth() : vpTransform.size.getHeight(); double vpFromSize = axisFrom.isHorizontal() ? vpTransform.size.getWidth() : vpTransform.size.getHeight(); int unitTo = unitToVec.getDataAt(i % unitToVec.getLength()); - int fromUnitId = unitIds.getDataAt(i % unitIds.getLength()); + int fromUnitId = -1; // invalid, and definitely not relative unit + if (unitIds != null) { + fromUnitId = unitIds.getDataAt(i % unitIds.getLength()); + } // actual conversion: // if the units are both relative, we are converting compatible axes and the vpSize for diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LValidUnit.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LValidUnit.java index e7d405b43ff27c58fa212e8d6ebcfb783e51280d..a4080e1ae7d1e2d94707fb7da562bade0c778e64 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LValidUnit.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LValidUnit.java @@ -59,7 +59,7 @@ public abstract class LValidUnit extends RExternalBuiltinNode.Arg1 { private int convertSingleSlowPath(String name) { Integer result = NamesHolder.NAMES.get(name); if (result == null) { - error(Message.GENERIC, "invalid unit"); + throw error(Message.GENERIC, "invalid unit"); } return result; }