diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java index 9fa81603085da0e17618c7d8aa953a5e9100bfb3..32febbca73729ef55673ab2bf20f085d5d7cec95 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ package com.oracle.truffle.r.nodes.builtin.base; import static com.oracle.truffle.r.runtime.RBuiltinKind.*; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.r.nodes.*; import com.oracle.truffle.r.nodes.access.*; @@ -44,9 +45,10 @@ public abstract class Exists extends RBuiltinNode { } @Specialization + @TruffleBoundary @SuppressWarnings("unused") protected byte existsStringEnv(RAbstractStringVector nameVec, REnvironment env, String mode, byte inherits) { - final String name = nameVec.getDataAt(0); + String name = nameVec.getDataAt(0); controlVisibility(); if (inherits == RRuntime.LOGICAL_FALSE) { return RRuntime.asLogical(env.get(name) != null); @@ -58,5 +60,4 @@ public abstract class Exists extends RBuiltinNode { } return RRuntime.LOGICAL_FALSE; } - } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java index 9847b35ee448dbf363301e7aaf324ced8f60b8ea..8e41ae987e549bd19f21c4563f1fc3c267dac26d 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RProxyNode.java @@ -23,7 +23,6 @@ package com.oracle.truffle.r.nodes; import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.r.runtime.*; import com.oracle.truffle.r.runtime.conn.*; import com.oracle.truffle.r.runtime.data.*; import com.oracle.truffle.r.runtime.env.*; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java index 9c1811d758a705a6f24ac4b7db6fede669094937..086c14ac289474db436afdafba579112a5397eea 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/ArrayPositionCast.java @@ -480,23 +480,29 @@ public abstract class ArrayPositionCast extends ArrayPositionsCastBase { } else { return assignment ? operand : RRuntime.INT_NA; } - } else if (operand < 0 && -operand > dimSize) { - outOfBoundsNegative.enter(); - if (dimSizeOneProfile.profile(dimSize == 1)) { - // e.g. c(7)[-2] vs c(7)[[-2]] - return isSubset ? /* only one element to be picked */1 : /* ultimately an error */operand; - } else { - // e.g. c(7, 42)[-7] vs c(, 427)[[-7]] - return isSubset ? expandMissing(container) : operand; - } } else if (operand < 0) { - negative.enter(); - if (dimSizeOneProfile.profile(dimSize == 1)) { - // it's negative, but not out of bounds and dimension has length one - result is - // no dimensions left - return 0; + if (-operand > dimSize) { + outOfBoundsNegative.enter(); + if (dimSizeOneProfile.profile(dimSize == 1)) { + /* + * e.g. c(7)[-2] vs c(7)[[-2]] + * + * only one element to be picked or ultimately an error caused by operand + */ + return isSubset ? 1 : operand; + } else { + // e.g. c(7, 42)[-7] vs c(, 427)[[-7]] + return isSubset ? expandMissing(container) : operand; + } } else { - return doIntNegativeMultiDim(frame, container, operand); + negative.enter(); + if (dimSizeOneProfile.profile(dimSize == 1)) { + // it's negative, but not out of bounds and dimension has length one - + // result is no dimensions left + return 0; + } else { + return doIntNegativeMultiDim(frame, container, operand); + } } } else { nonNegative.enter(); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java index 8fcc031a2128446f52ed31fe60b093a0347e438d..5d288e6f12b3b092805039b1aa82299ec5e267dd 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java @@ -676,20 +676,20 @@ public abstract class UpdateArrayHelperNode extends RNode { if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); int orgLength = resultVector.getLength(); - resultVector.resize(highestPos, false); + resultVector = (RList) resultVector.resize(highestPos, false); for (int i = orgLength; i < highestPos; i++) { resultVector.updateDataAt(i, RNull.instance, null); } - } else if (resetDims) { - vectorNoDims.enter(); - resultVector.setDimensions(null); - resultVector.setDimNames(null); - } - if (resultVector.isShared()) { + } else if (resultVector.isShared()) { vectorShared.enter(); resultVector = (RList) vector.copy(); resultVector.markNonTemporary(); } + if (resetDims) { + vectorNoDims.enter(); + resultVector.setDimensions(null); + resultVector.setDimNames(null); + } return resultVector; } @@ -1096,9 +1096,8 @@ public abstract class UpdateArrayHelperNode extends RNode { RIntVector resultVector = vector.materialize(); if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); - resultVector.resize(highestPos, false); - } - if (resultVector.isShared()) { + resultVector = (RIntVector) resultVector.resize(highestPos, false); + } else if (resultVector.isShared()) { vectorShared.enter(); resultVector = (RIntVector) vector.copy(); resultVector.markNonTemporary(); @@ -1268,9 +1267,8 @@ public abstract class UpdateArrayHelperNode extends RNode { RDoubleVector resultVector = vector.materialize(); if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); - resultVector.resize(highestPos, false); - } - if (resultVector.isShared()) { + resultVector = (RDoubleVector) resultVector.resize(highestPos, false); + } else if (resultVector.isShared()) { vectorShared.enter(); resultVector = (RDoubleVector) vector.copy(); resultVector.markNonTemporary(); @@ -1443,9 +1441,8 @@ public abstract class UpdateArrayHelperNode extends RNode { RLogicalVector resultVector = vector; if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); - resultVector.resize(highestPos, false); - } - if (vector.isShared()) { + resultVector = (RLogicalVector) resultVector.resize(highestPos, false); + } else if (vector.isShared()) { vectorShared.enter(); resultVector = (RLogicalVector) vector.copy(); resultVector.markNonTemporary(); @@ -1553,9 +1550,8 @@ public abstract class UpdateArrayHelperNode extends RNode { RStringVector resultVector = vector; if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); - resultVector.resize(highestPos, false); - } - if (vector.isShared()) { + resultVector = (RStringVector) resultVector.resize(highestPos, false); + } else if (vector.isShared()) { vectorShared.enter(); resultVector = (RStringVector) vector.copy(); resultVector.markNonTemporary(); @@ -1694,9 +1690,8 @@ public abstract class UpdateArrayHelperNode extends RNode { RComplexVector resultVector = vector; if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); - resultVector.resize(highestPos, false); - } - if (vector.isShared()) { + resultVector = (RComplexVector) resultVector.resize(highestPos, false); + } else if (vector.isShared()) { vectorShared.enter(); resultVector = (RComplexVector) vector.copy(); resultVector.markNonTemporary(); @@ -1897,9 +1892,8 @@ public abstract class UpdateArrayHelperNode extends RNode { RRawVector resultVector = vector; if (resultVector.getLength() < highestPos) { vectorTooShort.enter(); - resultVector.resize(highestPos, false); - } - if (vector.isShared()) { + resultVector = (RRawVector) resultVector.resize(highestPos, false); + } else if (vector.isShared()) { vectorShared.enter(); resultVector = (RRawVector) vector.copy(); resultVector.markNonTemporary(); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java index 9f063f6348531ba9ce45617142836aa65c497644..d405af097f468df0bc6c7508f4815b85afd67055 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java @@ -234,6 +234,9 @@ public class ReadVariableNode extends RNode implements VisibilityController { @Override public Object execute(VirtualFrame frame, Frame variableFrame) throws InvalidAssumptionException, LayoutChangedException, FrameSlotTypeException { Object value = profiledGetValue(variableFrame, slot); + if (kind == ReadKind.SilentLocal && value == RMissing.instance) { + return null; + } if (checkType(frame, value)) { throw new LayoutChangedException(); } @@ -277,6 +280,9 @@ public class ReadVariableNode extends RNode implements VisibilityController { @Override public Object execute(VirtualFrame frame, Frame variableFrame) throws LayoutChangedException, FrameSlotTypeException { Object value = profiledGetValue(variableFrame, slot); + if (kind == ReadKind.SilentLocal && value == RMissing.instance) { + return null; + } if (!checkType(frame, value)) { throw new LayoutChangedException(); } @@ -432,7 +438,11 @@ public class ReadVariableNode extends RNode implements VisibilityController { if (frameSlot != null) { Object value = getValue(current, frameSlot); valueAssumption = FrameSlotChangeMonitor.getStableValueAssumption(currentDescriptor, frameSlot, value); - match = checkType(frame, value); + if (kind == ReadKind.SilentLocal && value == RMissing.instance) { + match = false; + } else { + match = checkType(frame, value); + } } // figure out how to get to the next frame or descriptor diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java index d59112ef93a92a217b7ce04867d215ed55487113..cc33accc134da828eecd9d09a6de632b0e5ad4b5 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java @@ -318,14 +318,14 @@ public class RPromise extends RLanguageRep { * * @param underEvaluation The new value to set */ - public void setUnderEvaluation(boolean underEvaluation) { + public final void setUnderEvaluation(boolean underEvaluation) { this.underEvaluation = underEvaluation; } /** * @return The state of the {@link #underEvaluation} flag. */ - public boolean isUnderEvaluation() { + public final boolean isUnderEvaluation() { return underEvaluation; } @@ -350,7 +350,7 @@ public class RPromise extends RLanguageRep { * originally read from has not been altered in the mean time. If this cannot be guaranteed for * any reason, a Promise gets {@link #deoptimize()} (which includes {@link #materialize()}ion). */ - public static class EagerPromise extends RPromise { + public static final class EagerPromise extends RPromise { protected final Object eagerValue; private final FrameSlotInfo notChangedNonLocally;