public BasicValue merge()

in asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/SimpleVerifier.java [232:275]


  public BasicValue merge(final BasicValue value1, final BasicValue value2) {
    if (!value1.equals(value2)) {
      Type type1 = value1.getType();
      Type type2 = value2.getType();
      if (type1 != null
          && (type1.getSort() == Type.OBJECT || type1.getSort() == Type.ARRAY)
          && type2 != null
          && (type2.getSort() == Type.OBJECT || type2.getSort() == Type.ARRAY)) {
        if (type1.equals(NULL_TYPE)) {
          return value2;
        }
        if (type2.equals(NULL_TYPE)) {
          return value1;
        }
        if (isAssignableFrom(type1, type2)) {
          return value1;
        }
        if (isAssignableFrom(type2, type1)) {
          return value2;
        }
        int numDimensions = 0;
        if (type1.getSort() == Type.ARRAY
            && type2.getSort() == Type.ARRAY
            && type1.getDimensions() == type2.getDimensions()
            && type1.getElementType().getSort() == Type.OBJECT
            && type2.getElementType().getSort() == Type.OBJECT) {
          numDimensions = type1.getDimensions();
          type1 = type1.getElementType();
          type2 = type2.getElementType();
        }
        while (true) {
          if (type1 == null || isInterface(type1)) {
            return newArrayValue(Type.getObjectType("java/lang/Object"), numDimensions);
          }
          type1 = getSuperClass(type1);
          if (isAssignableFrom(type1, type2)) {
            return newArrayValue(type1, numDimensions);
          }
        }
      }
      return BasicValue.UNINITIALIZED_VALUE;
    }
    return value1;
  }