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 / Statement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  6.1 KB  |  231 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.Label;
  7. import sun.tools.java.ClassDefinition;
  8. import sun.tools.java.CompilerError;
  9. import sun.tools.java.Constants;
  10. import sun.tools.java.Environment;
  11. import sun.tools.java.Identifier;
  12. import sun.tools.java.Type;
  13.  
  14. public class Statement extends Node {
  15.    public static final Vset DEAD_END;
  16.    Identifier[] labels;
  17.    public static final Statement empty;
  18.    public static final int MAXINLINECOST = 30;
  19.  
  20.    Statement(int var1, int var2) {
  21.       super(var1, var2);
  22.    }
  23.  
  24.    public static Statement insertStatement(Statement var0, Statement var1) {
  25.       if (var1 == null) {
  26.          var1 = var0;
  27.       } else if (var1 instanceof CompoundStatement) {
  28.          ((CompoundStatement)var1).insertStatement(var0);
  29.       } else {
  30.          Statement[] var2 = new Statement[]{var0, (Statement)var1};
  31.          var1 = new CompoundStatement(((Node)var0).getWhere(), var2);
  32.       }
  33.  
  34.       return (Statement)var1;
  35.    }
  36.  
  37.    public void setLabel(Environment var1, Expression var2) {
  38.       if (var2.op == 60) {
  39.          if (this.labels == null) {
  40.             this.labels = new Identifier[1];
  41.          } else {
  42.             Identifier[] var3 = new Identifier[this.labels.length + 1];
  43.             System.arraycopy(this.labels, 0, var3, 1, this.labels.length);
  44.             this.labels = var3;
  45.          }
  46.  
  47.          this.labels[0] = ((IdentifierExpression)var2).id;
  48.       } else {
  49.          var1.error(var2.where, "invalid.label");
  50.       }
  51.    }
  52.  
  53.    public Vset checkMethod(Environment var1, Context var2, Vset var3, Hashtable var4) {
  54.       CheckContext var5 = new CheckContext(var2, new Statement(47, 0));
  55.       var3 = this.check(var1, var5, var3, var4);
  56.       if (!var5.field.getType().getReturnType().isType(11) && !var3.isDeadEnd()) {
  57.          var1.error(var5.field.getWhere(), "return.required.at.end", var5.field);
  58.       }
  59.  
  60.       var3 = var3.join(var5.vsBreak);
  61.       return var3;
  62.    }
  63.  
  64.    Vset checkDeclaration(Environment var1, Context var2, Vset var3, int var4, Type var5, Hashtable var6) {
  65.       throw new CompilerError("checkDeclaration");
  66.    }
  67.  
  68.    Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
  69.       throw new CompilerError("check");
  70.    }
  71.  
  72.    Vset checkBlockStatement(Environment var1, Context var2, Vset var3, Hashtable var4) {
  73.       return this.check(var1, var2, var3, var4);
  74.    }
  75.  
  76.    Vset reach(Environment var1, Vset var2) {
  77.       if (var2.isDeadEnd()) {
  78.          var1.error(super.where, "stat.not.reached");
  79.          var2 = var2.clearDeadEnd();
  80.       }
  81.  
  82.       return var2;
  83.    }
  84.  
  85.    public Statement inline(Environment var1, Context var2) {
  86.       return this;
  87.    }
  88.  
  89.    public Statement eliminate(Environment var1, Statement var2) {
  90.       if (var2 != null && this.labels != null) {
  91.          Statement[] var3 = new Statement[]{(Statement)var2};
  92.          var2 = new CompoundStatement(super.where, var3);
  93.          ((Statement)var2).labels = this.labels;
  94.       }
  95.  
  96.       return (Statement)var2;
  97.    }
  98.  
  99.    public void code(Environment var1, Context var2, Assembler var3) {
  100.       throw new CompilerError("code");
  101.    }
  102.  
  103.    void codeFinally(Environment var1, Context var2, Assembler var3, Context var4, Type var5) {
  104.       Integer var6 = null;
  105.       boolean var7 = false;
  106.       boolean var8 = false;
  107.  
  108.       for(Context var9 = var2; var9 != null && var9 != var4; var9 = var9.prev) {
  109.          if (var9.node != null) {
  110.             if (var9.node.op == 126) {
  111.                var7 = true;
  112.             } else if (var9.node.op == 103 && ((CodeContext)var9).contLabel != null) {
  113.                var7 = true;
  114.                FinallyStatement var10 = (FinallyStatement)var9.node;
  115.                if (!var10.finallyCanFinish) {
  116.                   var8 = true;
  117.                   break;
  118.                }
  119.             }
  120.          }
  121.       }
  122.  
  123.       if (var7) {
  124.          if (var5 != null) {
  125.             ClassDefinition var13 = var2.field.getClassDefinition();
  126.             if (!var8) {
  127.                LocalField var11 = var2.getLocalField(Constants.idFinallyReturnValue);
  128.                var6 = new Integer(var11.number);
  129.                var3.add(super.where, 54 + var5.getTypeCodeOffset(), var6);
  130.             } else {
  131.                switch (var13.getType().getTypeCode()) {
  132.                   case 5:
  133.                   case 7:
  134.                      var3.add(super.where, 88);
  135.                   case 11:
  136.                      break;
  137.                   default:
  138.                      var3.add(super.where, 87);
  139.                }
  140.             }
  141.          }
  142.  
  143.          for(Context var14 = var2; var14 != null && var14 != var4; var14 = var14.prev) {
  144.             if (var14.node != null) {
  145.                if (var14.node.op == 126) {
  146.                   var3.add(super.where, 168, ((CodeContext)var14).contLabel);
  147.                } else if (var14.node.op == 103 && ((CodeContext)var14).contLabel != null) {
  148.                   FinallyStatement var15 = (FinallyStatement)var14.node;
  149.                   Label var12 = ((CodeContext)var14).contLabel;
  150.                   if (!var15.finallyCanFinish) {
  151.                      var3.add(super.where, 167, var12);
  152.                      break;
  153.                   }
  154.  
  155.                   var3.add(super.where, 168, var12);
  156.                }
  157.             }
  158.          }
  159.  
  160.          if (var6 != null) {
  161.             var3.add(super.where, 21 + var5.getTypeCodeOffset(), var6);
  162.          }
  163.  
  164.       }
  165.    }
  166.  
  167.    public boolean hasLabel(Identifier var1) {
  168.       Identifier[] var2 = this.labels;
  169.       if (var2 != null) {
  170.          int var3 = var2.length;
  171.  
  172.          while(true) {
  173.             --var3;
  174.             if (var3 < 0) {
  175.                break;
  176.             }
  177.  
  178.             if (var2[var3].equals(var1)) {
  179.                return true;
  180.             }
  181.          }
  182.       }
  183.  
  184.       return false;
  185.    }
  186.  
  187.    public Expression firstConstructor() {
  188.       return null;
  189.    }
  190.  
  191.    public Statement copyInline(Context var1, boolean var2) {
  192.       return (Statement)((Node)this).clone();
  193.    }
  194.  
  195.    public int costInline(int var1, Environment var2, Context var3) {
  196.       return var1;
  197.    }
  198.  
  199.    void printIndent(PrintStream var1, int var2) {
  200.       for(int var3 = 0; var3 < var2; ++var3) {
  201.          var1.print("    ");
  202.       }
  203.  
  204.    }
  205.  
  206.    public void print(PrintStream var1, int var2) {
  207.       if (this.labels != null) {
  208.          int var3 = this.labels.length;
  209.  
  210.          while(true) {
  211.             --var3;
  212.             if (var3 < 0) {
  213.                break;
  214.             }
  215.  
  216.             var1.print(this.labels[var3] + ": ");
  217.          }
  218.       }
  219.  
  220.    }
  221.  
  222.    public void print(PrintStream var1) {
  223.       this.print(var1, 0);
  224.    }
  225.  
  226.    static {
  227.       DEAD_END = Vset.DEAD_END;
  228.       empty = new Statement(105, 0);
  229.    }
  230. }
  231.