static DfaValue merge(DfaValue defaultValue, DfaValue newValue, DfaMemoryState memState) {
    if (defaultValue == null || DfaTypeValue.isUnknown(defaultValue)) return newValue;
    if (newValue == null || DfaTypeValue.isUnknown(newValue)) return defaultValue;
    newValue = DfaUtil.boxUnbox(newValue, defaultValue.getDfType());
    DfType defaultType = memState.getDfType(defaultValue);
    DfType newType = memState.getDfType(newValue);
    DfType result = defaultType.meet(newType);
    if (result == DfType.BOTTOM) return newValue;
    if (newValue instanceof DfaVariableValue) {
      memState.meetDfType(newValue, result);
      return newValue;
    }
    if (defaultValue instanceof DfaWrappedValue) {
      if (newType.isSuperType(defaultValue.getDfType())) {
        return defaultValue;
      }
      DerivedVariableDescriptor field = ((DfaWrappedValue)defaultValue).getSpecialField();
      return defaultValue.getFactory().getWrapperFactory()
        .createWrapper(result.getBasicType(), field, ((DfaWrappedValue)defaultValue).getWrappedValue());
    }
    if (defaultValue instanceof DfaVariableValue) {
      memState.meetDfType(defaultValue, result);
      return defaultValue;
    }
    return defaultValue.getFactory().fromDfType(result);
  }
static DfaValue merge(DfaValue defaultValue, DfaValue newValue, DfaMemoryState memState)