DfaValue (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); }