View | Details | Raw Unified | Return to bug 324178 | Differences between
and this patch

Collapse All | Expand All

(-)compiler/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java (-31 / +3 lines)
Lines 84-118 Link Here
84
		} else if (isConditionOptimizedFalse) {
84
		} else if (isConditionOptimizedFalse) {
85
			mergedInfo = falseFlowInfo.addPotentialInitializationsFrom(trueFlowInfo);
85
			mergedInfo = falseFlowInfo.addPotentialInitializationsFrom(trueFlowInfo);
86
		} else {
86
		} else {
87
			// if ((t && (v = t)) ? t : t && (v = f)) r = v;  -- ok
87
			mergedInfo = FlowInfo.conditional(trueFlowInfo, falseFlowInfo);
88
			cst = this.optimizedIfTrueConstant;
89
			boolean isValueIfTrueOptimizedTrue = cst != null && cst != Constant.NotAConstant && cst.booleanValue() == true;
90
			boolean isValueIfTrueOptimizedFalse = cst != null && cst != Constant.NotAConstant && cst.booleanValue() == false;
91
92
			cst = this.optimizedIfFalseConstant;
93
			boolean isValueIfFalseOptimizedTrue = cst != null && cst != Constant.NotAConstant && cst.booleanValue() == true;
94
			boolean isValueIfFalseOptimizedFalse = cst != null && cst != Constant.NotAConstant && cst.booleanValue() == false;
95
96
			UnconditionalFlowInfo trueInfoWhenTrue = trueFlowInfo.initsWhenTrue().unconditionalCopy();
97
			UnconditionalFlowInfo falseInfoWhenTrue = falseFlowInfo.initsWhenTrue().unconditionalCopy();
98
			UnconditionalFlowInfo trueInfoWhenFalse = trueFlowInfo.initsWhenFalse().unconditionalInits();
99
			UnconditionalFlowInfo falseInfoWhenFalse = falseFlowInfo.initsWhenFalse().unconditionalInits();
100
			if (isValueIfTrueOptimizedFalse) {
101
				trueInfoWhenTrue.setReachMode(FlowInfo.UNREACHABLE);				
102
			}
103
			if (isValueIfFalseOptimizedFalse) {
104
				falseInfoWhenTrue.setReachMode(FlowInfo.UNREACHABLE);	
105
			}
106
			if (isValueIfTrueOptimizedTrue) {
107
				trueInfoWhenFalse.setReachMode(FlowInfo.UNREACHABLE);	
108
			}
109
			if (isValueIfFalseOptimizedTrue) {
110
				falseInfoWhenFalse.setReachMode(FlowInfo.UNREACHABLE);	
111
			}
112
			mergedInfo =
113
				FlowInfo.conditional(
114
					trueInfoWhenTrue.mergedWith(falseInfoWhenTrue),
115
					trueInfoWhenFalse.mergedWith(falseInfoWhenFalse));
116
		}
88
		}
117
		this.mergedInitStateIndex =
89
		this.mergedInitStateIndex =
118
			currentScope.methodScope().recordInitializationStates(mergedInfo);
90
			currentScope.methodScope().recordInitializationStates(mergedInfo);
Lines 314-321 Link Here
314
		}
286
		}
315
		return this.valueIfFalse.nullStatus(flowInfo);
287
		return this.valueIfFalse.nullStatus(flowInfo);
316
	}
288
	}
317
	int ifTrueNullStatus = this.valueIfTrue.nullStatus(flowInfo),
289
	int ifTrueNullStatus = this.valueIfTrue.nullStatus(flowInfo.initsWhenTrue()),
318
	    ifFalseNullStatus = this.valueIfFalse.nullStatus(flowInfo);
290
	    ifFalseNullStatus = this.valueIfFalse.nullStatus(flowInfo.initsWhenFalse());
319
	if (ifTrueNullStatus == ifFalseNullStatus) {
291
	if (ifTrueNullStatus == ifFalseNullStatus) {
320
		return ifTrueNullStatus;
292
		return ifTrueNullStatus;
321
	}
293
	}
(-)compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java (-5 / +3 lines)
Lines 71-87 Link Here
71
	if ((this.initialization.implicitConversion & TypeIds.UNBOXING) != 0) {
71
	if ((this.initialization.implicitConversion & TypeIds.UNBOXING) != 0) {
72
		this.initialization.checkNPE(currentScope, flowContext, flowInfo);
72
		this.initialization.checkNPE(currentScope, flowContext, flowInfo);
73
	}
73
	}
74
	int nullStatus = this.initialization.nullStatus(flowInfo);
74
	FlowInfo unflattenedInfo = this.initialization.analyseCode(currentScope, flowContext, flowInfo);
75
	flowInfo =
75
	flowInfo = unflattenedInfo.unconditionalInits();
76
		this.initialization
77
			.analyseCode(currentScope, flowContext, flowInfo)
78
			.unconditionalInits();
79
	if (!flowInfo.isDefinitelyAssigned(this.binding)){// for local variable debug attributes
76
	if (!flowInfo.isDefinitelyAssigned(this.binding)){// for local variable debug attributes
80
		this.bits |= FirstAssignmentToLocal;
77
		this.bits |= FirstAssignmentToLocal;
81
	} else {
78
	} else {
82
		this.bits &= ~FirstAssignmentToLocal;  // int i = (i = 0);
79
		this.bits &= ~FirstAssignmentToLocal;  // int i = (i = 0);
83
	}
80
	}
84
	flowInfo.markAsDefinitelyAssigned(this.binding);
81
	flowInfo.markAsDefinitelyAssigned(this.binding);
82
	int nullStatus = this.initialization.nullStatus(unflattenedInfo);
85
	nullStatus = checkAgainstNullAnnotation(currentScope, this.binding, nullStatus);		
83
	nullStatus = checkAgainstNullAnnotation(currentScope, this.binding, nullStatus);		
86
	if ((this.binding.type.tagBits & TagBits.IsBaseType) == 0) {
84
	if ((this.binding.type.tagBits & TagBits.IsBaseType) == 0) {
87
		flowInfo.markNullStatus(this.binding, nullStatus);
85
		flowInfo.markNullStatus(this.binding, nullStatus);

Return to bug 324178