Beispiel #1
0
  @Override
  public BasicValue newValue(final Type type) {
    if (type == null) {
      return BasicValue.UNINITIALIZED_VALUE;
    }

    boolean isArray = type.getSort() == Type.ARRAY;
    if (isArray) {
      switch (type.getElementType().getSort()) {
        case Type.BOOLEAN:
        case Type.CHAR:
        case Type.BYTE:
        case Type.SHORT:
          return new BasicValue(type);
      }
    }

    BasicValue v = super.newValue(type);
    if (BasicValue.REFERENCE_VALUE.equals(v)) {
      if (isArray) {
        v = newValue(type.getElementType());
        String desc = v.getType().getDescriptor();
        for (int i = 0; i < type.getDimensions(); ++i) {
          desc = '[' + desc;
        }
        v = new BasicValue(Type.getType(desc));
      } else {
        v = new BasicValue(type);
      }
    }
    return v;
  }
 @Override
 public BasicValue merge(final BasicValue v, final BasicValue w) {
   if (!v.equals(w)) {
     return BasicValue.UNINITIALIZED_VALUE;
   }
   return v;
 }
Beispiel #3
0
 @Override
 protected BasicValue getElementValue(final BasicValue objectArrayValue) throws AnalyzerException {
   Type arrayType = objectArrayValue.getType();
   if (arrayType != null) {
     if (arrayType.getSort() == Type.ARRAY) {
       return newValue(Type.getType(arrayType.getDescriptor().substring(1)));
     } else if ("Lnull;".equals(arrayType.getDescriptor())) {
       return objectArrayValue;
     }
   }
   throw new Error("Internal error");
 }
Beispiel #4
0
 @Override
 public BasicValue merge(final BasicValue v, final BasicValue w) {
   if (!v.equals(w)) {
     Type t = v.getType();
     Type u = w.getType();
     if (t != null && (t.getSort() == Type.OBJECT || t.getSort() == Type.ARRAY)) {
       if (u != null && (u.getSort() == Type.OBJECT || u.getSort() == Type.ARRAY)) {
         if ("Lnull;".equals(t.getDescriptor())) {
           return w;
         }
         if ("Lnull;".equals(u.getDescriptor())) {
           return v;
         }
         if (isAssignableFrom(t, u)) {
           return v;
         }
         if (isAssignableFrom(u, t)) {
           return w;
         }
         // TODO case of array classes of the same dimension
         // TODO should we look also for a common super interface?
         // problem: there may be several possible common super
         // interfaces
         do {
           if (t == null || isInterface(t)) {
             return BasicValue.REFERENCE_VALUE;
           }
           t = getSuperClass(t);
           if (isAssignableFrom(t, u)) {
             return newValue(t);
           }
         } while (true);
       }
     }
     return BasicValue.UNINITIALIZED_VALUE;
   }
   return v;
 }
Beispiel #5
0
 @Override
 protected boolean isSubTypeOf(final BasicValue value, final BasicValue expected) {
   Type expectedType = expected.getType();
   Type type = value.getType();
   switch (expectedType.getSort()) {
     case Type.INT:
     case Type.FLOAT:
     case Type.LONG:
     case Type.DOUBLE:
       return type.equals(expectedType);
     case Type.ARRAY:
     case Type.OBJECT:
       if ("Lnull;".equals(type.getDescriptor())) {
         return true;
       } else if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
         return isAssignableFrom(expectedType, type);
       } else {
         return false;
       }
     default:
       throw new Error("Internal error");
   }
 }
Beispiel #6
0
 @Override
 protected boolean isArrayValue(final BasicValue value) {
   Type t = value.getType();
   return t != null && ("Lnull;".equals(t.getDescriptor()) || t.getSort() == Type.ARRAY);
 }
Beispiel #7
0
 public String toString() {
   return (BasicValue.toString(this));
 }