+++ /dev/null
-/*******************************************************************************
- * 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.jdt.internal.compiler.ast;
-
-import org.eclipse.jdt.internal.compiler.codegen.CodeStream;
-import org.eclipse.jdt.internal.compiler.codegen.ExceptionLabel;
-import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
-
-/**
- * Extra behavior for statements which are generating subroutines
- */
-public abstract class SubRoutineStatement extends Statement {
-
- public static final ExceptionLabel[] NO_EXCEPTION_HANDLER = new ExceptionLabel[0];
- ExceptionLabel[] anyExceptionLabels = NO_EXCEPTION_HANDLER;
- int anyExceptionLabelsCount = 0;
-
- public abstract boolean isSubRoutineEscaping();
-
- public abstract void generateSubRoutineInvocation(BlockScope currentScope, CodeStream codeStream);
-
- public ExceptionLabel enterAnyExceptionHandler(CodeStream codeStream) {
-
- int length;
- if ((length = this.anyExceptionLabelsCount) == this.anyExceptionLabels.length) {
- System.arraycopy(this.anyExceptionLabels, 0 , this.anyExceptionLabels=new ExceptionLabel[length*2 + 1], 0, length);
- }
- ExceptionLabel exceptionLabel = new ExceptionLabel(codeStream, null);
- this.anyExceptionLabels[this.anyExceptionLabelsCount++] = exceptionLabel;
- return exceptionLabel;
- }
-
- public void exitAnyExceptionHandler() {
- if (this.anyExceptionLabelsCount == 0) return;
- ExceptionLabel currentLabel = this.anyExceptionLabels[this.anyExceptionLabelsCount-1];
- if (currentLabel.start == currentLabel.codeStream.position) {
- // discard empty exception handler
- this.anyExceptionLabels[--this.anyExceptionLabelsCount] = null;
- }
- currentLabel.placeEnd();
- }
-
- public void placeAllAnyExceptionHandlers() {
-
- for (int i = 0; i < this.anyExceptionLabelsCount; i++) {
- this.anyExceptionLabels[i].place();
- }
- }
-
- public static void reenterExceptionHandlers(SubRoutineStatement[] subroutines, int max, CodeStream codeStream) {
- if (subroutines == null) return;
- if (max < 0) max = subroutines.length;
- for (int i = 0; i < max; i++) {
- subroutines[i].enterAnyExceptionHandler(codeStream);
- }
- }
-}