예제 #1
0
 PositionCheckNode(
     ElementAccessMode mode,
     RType containerType,
     Object positionValue,
     int dimensionIndex,
     int numDimensions,
     boolean exact,
     boolean replace) {
   this.positionClass = positionValue.getClass();
   this.dimensionIndex = dimensionIndex;
   this.numDimensions = numDimensions;
   this.replace = replace;
   this.containerType = containerType;
   this.castNode = PositionCastNode.create(mode, replace);
   if (positionValue instanceof String || positionValue instanceof RAbstractStringVector) {
     boolean useNAForNotFound = !replace && isListLike(containerType) && mode.isSubscript();
     characterLookup =
         new PositionCharacterLookupNode(
             mode, numDimensions, dimensionIndex, useNAForNotFound, exact);
   }
 }
예제 #2
0
  public final Object execute(
      PositionProfile profile,
      RAbstractContainer vector,
      int[] vectorDimensions,
      int vectorLength,
      Object position) {
    Object castPosition = castNode.execute(positionClass.cast(position));

    int dimensionLength;
    if (numDimensions == 1) {
      dimensionLength = vectorLength;
    } else {
      assert vectorDimensions != null;
      assert vectorDimensions.length == numDimensions;
      dimensionLength = vectorDimensions[dimensionIndex];
    }

    if (characterLookup != null) {
      castPosition =
          characterLookup.execute(vector, (RAbstractStringVector) castPosition, dimensionLength);
    }

    RTypedValue positionVector = (RTypedValue) profilePosition(castPosition);

    int positionLength;
    if (positionVector instanceof RMissing) {
      positionLength = -1;
    } else {
      positionLength =
          positionLengthProfile.profile(((RAbstractVector) positionVector).getLength());
    }

    assert isValidCastedType(positionVector)
        : "result type of a position cast node must be integer or logical";

    return execute(profile, dimensionLength, positionVector, positionLength);
  }