home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / tree / FinallyStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  4.8 KB  |  147 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Enumeration;
  5. import java.util.Hashtable;
  6. import sun.tools.asm.Assembler;
  7. import sun.tools.asm.CatchData;
  8. import sun.tools.asm.Label;
  9. import sun.tools.asm.TryData;
  10. import sun.tools.java.ClassDefinition;
  11. import sun.tools.java.CompilerError;
  12. import sun.tools.java.Constants;
  13. import sun.tools.java.Environment;
  14. import sun.tools.java.Identifier;
  15. import sun.tools.java.Type;
  16.  
  17. public class FinallyStatement extends Statement {
  18.    Statement body;
  19.    Statement finalbody;
  20.    boolean finallyCanFinish;
  21.    boolean needReturnSlot;
  22.  
  23.    public FinallyStatement(int var1, Statement var2, Statement var3) {
  24.       super(103, var1);
  25.       this.body = var2;
  26.       this.finalbody = var3;
  27.    }
  28.  
  29.    Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
  30.       var3 = ((Statement)this).reach(var1, var3);
  31.       Hashtable var5 = new Hashtable();
  32.       CheckContext var6 = new CheckContext(var2, this);
  33.       Vset var7 = this.body.check(var1, var6, var3.copy(), var5).join(var6.vsBreak);
  34.       CheckContext var8 = new CheckContext(var2, this);
  35.       var8.vsContinue = null;
  36.       Vset var9 = this.finalbody.check(var1, var8, var3, var4);
  37.       this.finallyCanFinish = !var9.isDeadEnd();
  38.       var9 = var9.join(var8.vsBreak);
  39.       if (this.finallyCanFinish) {
  40.          Enumeration var10 = var5.keys();
  41.  
  42.          while(var10.hasMoreElements()) {
  43.             Object var11 = var10.nextElement();
  44.             var4.put(var11, var5.get(var11));
  45.          }
  46.       }
  47.  
  48.       return var2.removeAdditionalVars(var7.add(var9));
  49.    }
  50.  
  51.    public Statement inline(Environment var1, Context var2) {
  52.       if (this.body != null) {
  53.          this.body = this.body.inline(var1, var2);
  54.       }
  55.  
  56.       if (this.finalbody != null) {
  57.          this.finalbody = this.finalbody.inline(var1, var2);
  58.       }
  59.  
  60.       if (this.body == null) {
  61.          return ((Statement)this).eliminate(var1, this.finalbody);
  62.       } else {
  63.          return (Statement)(this.finalbody == null ? ((Statement)this).eliminate(var1, this.body) : this);
  64.       }
  65.    }
  66.  
  67.    public Statement copyInline(Context var1, boolean var2) {
  68.       throw new CompilerError("copyInline");
  69.    }
  70.  
  71.    public void code(Environment var1, Context var2, Assembler var3) {
  72.       var2 = new Context(var2);
  73.       Integer var4 = null;
  74.       Integer var5 = null;
  75.       Label var6 = new Label();
  76.       if (this.finallyCanFinish) {
  77.          ClassDefinition var9 = var2.field.getClassDefinition();
  78.          if (this.needReturnSlot) {
  79.             Type var10 = var2.field.getType().getReturnType();
  80.             LocalField var11 = new LocalField(0, var9, 0, var10, Constants.idFinallyReturnValue);
  81.             var2.declare(var1, var11);
  82.             Environment.debugOutput("Assigning return slot to " + var11.number);
  83.          }
  84.  
  85.          LocalField var7 = new LocalField(super.where, var9, 0, Type.tObject, (Identifier)null);
  86.          LocalField var8 = new LocalField(super.where, var9, 0, Type.tInt, (Identifier)null);
  87.          var4 = new Integer(var2.declare(var1, var7));
  88.          var5 = new Integer(var2.declare(var1, var8));
  89.       }
  90.  
  91.       TryData var13 = new TryData();
  92.       var13.add((Object)null);
  93.       CodeContext var14 = new CodeContext(var2, this);
  94.       var3.add(super.where, -3, var13);
  95.       this.body.code(var1, var14, var3);
  96.       var3.add(var14.breakLabel);
  97.       var3.add(var13.getEndLabel());
  98.       if (this.finallyCanFinish) {
  99.          var3.add(super.where, 168, var14.contLabel);
  100.          var3.add(super.where, 167, var6);
  101.       } else {
  102.          var3.add(super.where, 167, var14.contLabel);
  103.       }
  104.  
  105.       CatchData var15 = var13.getCatch(0);
  106.       var3.add(var15.getLabel());
  107.       if (this.finallyCanFinish) {
  108.          var3.add(super.where, 58, var4);
  109.          var3.add(super.where, 168, var14.contLabel);
  110.          var3.add(super.where, 25, var4);
  111.          var3.add(super.where, 191);
  112.       } else {
  113.          var3.add(super.where, 87);
  114.       }
  115.  
  116.       var3.add(var14.contLabel);
  117.       var14.contLabel = null;
  118.       var14.breakLabel = var6;
  119.       if (this.finallyCanFinish) {
  120.          var3.add(super.where, 58, var5);
  121.          this.finalbody.code(var1, var14, var3);
  122.          var3.add(super.where, 169, var5);
  123.       } else {
  124.          this.finalbody.code(var1, var14, var3);
  125.       }
  126.  
  127.       var3.add(var6);
  128.    }
  129.  
  130.    public void print(PrintStream var1, int var2) {
  131.       super.print(var1, var2);
  132.       var1.print("try ");
  133.       if (this.body != null) {
  134.          this.body.print(var1, var2);
  135.       } else {
  136.          var1.print("<empty>");
  137.       }
  138.  
  139.       var1.print(" finally ");
  140.       if (this.finalbody != null) {
  141.          this.finalbody.print(var1, var2);
  142.       } else {
  143.          var1.print("<empty>");
  144.       }
  145.    }
  146. }
  147.