blob: 1a1786e12979a71c93e90e223c1055ce63fc0962 [file] [log] [blame]
package org.eclipse.jdt.internal.compiler.ast;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor;
import org.eclipse.jdt.internal.compiler.codegen.*;
import org.eclipse.jdt.internal.compiler.flow.*;
import org.eclipse.jdt.internal.compiler.lookup.*;
public class Break extends BranchStatement {
public Break(char[] label, int sourceStart, int e) {
super(label, sourceStart,e);
}
public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) {
// here requires to generate a sequence of finally blocks invocations depending corresponding
// to each of the traversed try statements, so that execution will terminate properly.
// lookup the label, this should answer the returnContext
FlowContext targetContext;
if (label == null) {
targetContext = flowContext.getTargetContextForDefaultBreak();
} else {
targetContext = flowContext.getTargetContextForBreakLabel(label);
}
if (targetContext == null) {
if (label == null) {
currentScope.problemReporter().invalidBreak(this);
} else {
currentScope.problemReporter().undefinedLabel(this); // need to improve
}
} else {
targetLabel = targetContext.breakLabel();
targetContext.recordBreakFrom(flowInfo);
FlowContext traversedContext = flowContext;
int subIndex = 0, maxSub = 5;
subroutines = new AstNode[maxSub];
while (true) {
AstNode sub;
if ((sub = traversedContext.subRoutine()) != null) {
if (subIndex == maxSub) {
System.arraycopy(subroutines, 0, (subroutines = new AstNode[maxSub *= 2]), 0, subIndex); // grow
}
subroutines[subIndex++] = sub;
if (sub.cannotReturn()) {
break;
}
}
if (traversedContext == targetContext) {
break;
} else {
traversedContext = traversedContext.parent;
}
}
// resize subroutines
if (subIndex != maxSub) {
System.arraycopy(subroutines, 0, (subroutines = new AstNode[subIndex]), 0, subIndex);
}
}
return FlowInfo.DeadEnd;
}
public String toString(int tab){
/* slow code */
String s = tabString(tab) ;
s = s + "break "/*nonNLS*/;
if (label != null )
s = s + new String(label) ;
return s;
}
public void traverse(IAbstractSyntaxTreeVisitor visitor, BlockScope blockscope) {
visitor.visit(this, blockscope);
visitor.endVisit(this, blockscope);
}
}