public static UnconditionalFlowInfo fakeInitializedFlowInfo(int localsCount, int maxFieldCount) { UnconditionalFlowInfo flowInfo = new UnconditionalFlowInfo(); flowInfo.maxFieldCount = maxFieldCount; for (int i = 0; i < localsCount; i++) flowInfo.markAsDefinitelyAssigned(i + maxFieldCount); return flowInfo; }
public void recordReturnFrom(UnconditionalFlowInfo flowInfo) { if ((flowInfo.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) == 0) { if ((this.initsOnReturn.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) == 0) { this.initsOnReturn = this.initsOnReturn.mergedWith(flowInfo); } else { this.initsOnReturn = (UnconditionalFlowInfo) flowInfo.copy(); } } }
final public boolean isDefinitelyAssigned(FieldBinding field) { // Mirrored in CodeStream.isDefinitelyAssigned(..) // do not want to complain in unreachable code if ((this.tagBits & UNREACHABLE_OR_DEAD) != 0) { return true; } return isDefinitelyAssigned(field.id); }
staticFieldInfo = FlowInfo.initial(this.maxFieldCount).setReachMode(FlowInfo.UNREACHABLE_OR_DEAD); nonStaticFieldInfo = FlowInfo.initial(this.maxFieldCount).setReachMode(FlowInfo.UNREACHABLE_OR_DEAD); FlowInfo constructorInfo = nonStaticFieldInfo.unconditionalInits().discardNonFieldInitializations().addInitializationsFrom(outerInfo); for (int i = 0, count = this.methods.length; i < count; i++) { AbstractMethodDeclaration method = this.methods[i]; this.scope, staticInitializerContext, staticFieldInfo.unconditionalInits().discardNonFieldInitializations().addInitializationsFrom(outerInfo)); } else { // constructor ((ConstructorDeclaration)method).analyseCode(this.scope, initializerContext, constructorInfo.copy(), flowInfo.reachMode());
if ((this.initsOnContinue.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) == 0) { this.initsOnContinue = this.initsOnContinue. mergedWith(flowInfo.unconditionalInitsWithoutSideEffect()); addPotentialNullInfoFrom( flowInfo.unconditionalInitsWithoutSideEffect());
addInitializationsFrom(assertWhenPassInfo.discardInitializationInfo());
return ((flowInfo.nullInfoLessUnconditionalCopy()).mergedWith(assertInfo.nullInfoLessUnconditionalCopy())).addNullInfoFrom(flowInfo); addInitializationsFrom(assertWhenTrueInfo.discardInitializationInfo());
if (reinjectNullInfo) { ((UnconditionalFlowInfo)mergedInfo).addInitializationsFrom(flowInfo.unconditionalFieldLessCopy()). addInitializationsFrom(labelContext.initsOnBreak.unconditionalFieldLessCopy());
FlowInfo leftInfoWhenTrueForMerging = leftInfo.initsWhenTrue().unconditionalCopy().addPotentialInitializationsFrom(rightInfo.unconditionalInitsWithoutSideEffect()); FlowInfo mergedInfo = FlowInfo.conditional( leftInfoWhenTrueForMerging.unconditionalInits().mergedWith( rightInfo.safeInitsWhenTrue().setReachMode(previousMode).unconditionalInits()), rightInfo.initsWhenFalse());
catchInfo = flowInfo.unconditionalCopy(). addPotentialInitializationsFrom( handlingContext.initsOnException(i)). addPotentialInitializationsFrom(tryInfo). catchInfo = flowInfo.nullInfoLessUnconditionalCopy() .addPotentialInitializationsFrom(initsOnException) handlingContext.initsOnReturn.nullInfoLessUnconditionalCopy());
@Override final public boolean isPotentiallyAssigned(FieldBinding field) { return isPotentiallyAssigned(field.id); }
flowInfo.initsWhenTrue().setReachMode(FlowInfo.UNREACHABLE_BY_NULLANALYSIS); } else if (this.upstreamNullFlowInfo.isDefinitelyNonNull(local) && !flowInfo.isPotentiallyNull(local) && !flowInfo.isPotentiallyUnknown(local)) {
public static UnconditionalFlowInfo initial(int maxFieldCount) { UnconditionalFlowInfo info = new UnconditionalFlowInfo(); info.maxFieldCount = maxFieldCount; return info; }
createExtraSpace(otherLength); System.arraycopy(otherInits.extra[1], 0, this.extra[1], 0, otherLength); addPotentialNullInfoFrom(otherInits); return this;
staticFieldInfo = FlowInfo.initial(this.maxFieldCount).setReachMode(FlowInfo.UNREACHABLE); nonStaticFieldInfo = FlowInfo.initial(this.maxFieldCount).setReachMode(FlowInfo.UNREACHABLE); FlowInfo constructorInfo = nonStaticFieldInfo.unconditionalInits().discardNonFieldInitializations().addInitializationsFrom(outerInfo); for (int i = 0, count = this.methods.length; i < count; i++) { AbstractMethodDeclaration method = this.methods[i]; this.scope, staticInitializerContext, staticFieldInfo.unconditionalInits().discardNonFieldInitializations().addInitializationsFrom(outerInfo)); } else { // constructor ((ConstructorDeclaration)method).analyseCode(this.scope, initializerContext, constructorInfo.copy(), flowInfo.reachMode());
if ((this.initsOnContinue.tagBits & FlowInfo.UNREACHABLE_OR_DEAD) == 0) { this.initsOnContinue = this.initsOnContinue. mergedWith(flowInfo.unconditionalInitsWithoutSideEffect()); addPotentialNullInfoFrom( flowInfo.unconditionalInitsWithoutSideEffect());
addInitializationsFrom(assertWhenPassInfo.discardInitializationInfo());
return ((flowInfo.nullInfoLessUnconditionalCopy()).mergedWith(assertInfo.nullInfoLessUnconditionalCopy())).addNullInfoFrom(flowInfo); addInitializationsFrom(assertWhenTrueInfo.discardInitializationInfo());
if (reinjectNullInfo) { ((UnconditionalFlowInfo)mergedInfo).addInitializationsFrom(flowInfo.unconditionalFieldLessCopy()). addInitializationsFrom(labelContext.initsOnBreak.unconditionalFieldLessCopy());
FlowInfo leftInfoWhenTrueForMerging = leftInfo.initsWhenTrue().unconditionalCopy().addPotentialInitializationsFrom(rightInfo.unconditionalInitsWithoutSideEffect()); FlowInfo mergedInfo = FlowInfo.conditional( leftInfoWhenTrueForMerging.unconditionalInits().mergedWith( rightInfo.safeInitsWhenTrue().setReachMode(previousMode).unconditionalInits()), rightInfo.initsWhenFalse());