totally new file layout
[org.ibex.tool.git] / repo / org.ibex.tool / src / org / eclipse / jdt / internal / compiler / ast / SubRoutineStatement.java
diff --git a/repo/org.ibex.tool/src/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.java b/repo/org.ibex.tool/src/org/eclipse/jdt/internal/compiler/ast/SubRoutineStatement.java
new file mode 100644 (file)
index 0000000..59b697b
--- /dev/null
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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); 
+               }       
+       }
+}