void (DfaVariableValue var, DfaValue value) { assert value.getFactory() == myFactory; assert var.getFactory() == myFactory; if (var == value) return; value = handleStackValueOnVariableFlush(value, var, null); flushVariable(var, var.getDfType().isMergeable(var.getInherentType())); flushQualifiedMethods(var); DfType dfType = filterDfTypeOnAssignment(var, getDfType(value)).meet(var.getDfType()); if (dfType == DfType.BOTTOM) return; // likely uncompilable code or bad CFG if (value instanceof DfaVariableValue && !ControlFlow.isTempVariable(var) && !ControlFlow.isTempVariable((DfaVariableValue)value) && (var.getQualifier() == null || !ControlFlow.isTempVariable(var.getQualifier()))) { // assigning a = b when b is known to be null: could be ephemeral checkEphemeral(var, value); } recordVariableType(var, dfType); applyBinOpRelations(value, RelationType.EQ, var); applyRelation(var, value, false); if (value instanceof DfaWrappedValue wrappedValue) { if (wrappedValue.getSpecialField().createValue(getFactory(), var) instanceof DfaVariableValue derivedVar) { setVarValue(derivedVar, wrappedValue.getWrappedValue()); } } else if (!(value instanceof DfaVariableValue)) { for (Map.Entry<DerivedVariableDescriptor, DfType> entry : value.getDfType().getDerivedValues().entrySet()) { DerivedVariableDescriptor desc = entry.getKey(); if (desc.createValue(getFactory(), var) instanceof DfaVariableValue derivedVar) { setVarValue(derivedVar, getFactory().fromDfType(entry.getValue().meet(desc.getDefaultValue()))); } } } else if (isUnstableValue(value)) { applyDerivedVariablesEquivalence(var, value); } }