/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.internal.compiler.ast;

import org.eclipse.wst.jsdt.internal.compiler.codegen.*;
import org.eclipse.wst.jsdt.internal.compiler.lookup.*;

public abstract class BranchStatement extends Statement {
	public char[] label;
	public Label targetLabel;
	public SubRoutineStatement[] subroutines;
/**
 * BranchStatement constructor comment.
 */
public BranchStatement(char[] l, int s,int e) {
	label = l ;
	sourceStart = s;
	sourceEnd = e;
}
/**
 * Branch code generation
 *
 *   generate the finallyInvocationSequence.
 */
public void generateCode(BlockScope currentScope, CodeStream codeStream) {

	if ((bits & IsReachableMASK) == 0) {
		return;
	}
	int pc = codeStream.position;

	// generation of code responsible for invoking the finally 
	// blocks in sequence
	if (subroutines != null){
		for (int i = 0, max = subroutines.length; i < max; i++){
			SubRoutineStatement sub = subroutines[i];
			sub.generateSubRoutineInvocation(currentScope, codeStream);
			if (sub.isSubRoutineEscaping()) {
					codeStream.recordPositionsFrom(pc, this.sourceStart);
					SubRoutineStatement.reenterExceptionHandlers(subroutines, i, codeStream);
					return;
			}
			sub.exitAnyExceptionHandler();
		}
	}
	codeStream.goto_(targetLabel);
	codeStream.recordPositionsFrom(pc, this.sourceStart);
	SubRoutineStatement.reenterExceptionHandlers(subroutines, -1, codeStream);
}
public void resolve(BlockScope scope) {
	// nothing to do during name resolution
}

}
