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 / SwitchStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  5.1 KB  |  191 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.asm.SwitchData;
  8. import sun.tools.java.Environment;
  9. import sun.tools.java.Type;
  10.  
  11. public class SwitchStatement extends Statement {
  12.    Expression expr;
  13.    Statement[] args;
  14.  
  15.    public SwitchStatement(int var1, Expression var2, Statement[] var3) {
  16.       super(95, var1);
  17.       this.expr = var2;
  18.       this.args = var3;
  19.    }
  20.  
  21.    Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
  22.       CheckContext var5 = new CheckContext(var2, this);
  23.       var3 = this.expr.checkValue(var1, var5, ((Statement)this).reach(var1, var3), var4);
  24.       Type var6 = this.expr.type;
  25.       this.expr = ((Node)this).convert(var1, var5, Type.tInt, this.expr);
  26.       Hashtable var7 = new Hashtable();
  27.       boolean var8 = false;
  28.       Vset var9 = Statement.DEAD_END;
  29.  
  30.       for(int var10 = 0; var10 < this.args.length; ++var10) {
  31.          Statement var11 = this.args[var10];
  32.          if (var11.op == 96) {
  33.             var9 = var11.check(var1, var5, var3.copy(), var4);
  34.             Expression var12 = ((CaseStatement)var11).expr;
  35.             if (var12 != null) {
  36.                if (var12 instanceof IntegerExpression) {
  37.                   Integer var13 = (Integer)((IntegerExpression)var12).getValue();
  38.                   int var14 = var13;
  39.                   if (var7.get(var12) != null) {
  40.                      var1.error(var11.where, "duplicate.label", var13);
  41.                   } else {
  42.                      var7.put(var12, var11);
  43.                      boolean var15;
  44.                      switch (var6.getTypeCode()) {
  45.                         case 1:
  46.                            var15 = var14 != (byte)var14;
  47.                            break;
  48.                         case 2:
  49.                            var15 = var14 != (char)var14;
  50.                            break;
  51.                         case 3:
  52.                            var15 = var14 != (short)var14;
  53.                            break;
  54.                         default:
  55.                            var15 = false;
  56.                      }
  57.  
  58.                      if (var15) {
  59.                         var1.error(var11.where, "switch.overflow", var13, var6);
  60.                      }
  61.                   }
  62.                } else {
  63.                   var1.error(var11.where, "const.expr.required");
  64.                }
  65.             } else {
  66.                if (var8) {
  67.                   var1.error(var11.where, "duplicate.default");
  68.                }
  69.  
  70.                var8 = true;
  71.             }
  72.          } else {
  73.             var9 = var11.checkBlockStatement(var1, var5, var9, var4);
  74.          }
  75.       }
  76.  
  77.       if (!var9.isDeadEnd()) {
  78.          var5.vsBreak = var5.vsBreak.join(var9);
  79.       }
  80.  
  81.       if (var8) {
  82.          var3 = var5.vsBreak;
  83.       }
  84.  
  85.       return var2.removeAdditionalVars(var3);
  86.    }
  87.  
  88.    public Statement inline(Environment var1, Context var2) {
  89.       var2 = new Context(var2, this);
  90.       this.expr = this.expr.inlineValue(var1, var2);
  91.  
  92.       for(int var3 = 0; var3 < this.args.length; ++var3) {
  93.          if (this.args[var3] != null) {
  94.             this.args[var3] = this.args[var3].inline(var1, var2);
  95.          }
  96.       }
  97.  
  98.       return this;
  99.    }
  100.  
  101.    public Statement copyInline(Context var1, boolean var2) {
  102.       SwitchStatement var3 = (SwitchStatement)((Node)this).clone();
  103.       this.expr = this.expr.copyInline(var1);
  104.       var3.args = new Statement[this.args.length];
  105.  
  106.       for(int var4 = 0; var4 < this.args.length; ++var4) {
  107.          if (this.args[var4] != null) {
  108.             var3.args[var4] = this.args[var4].copyInline(var1, var2);
  109.          }
  110.       }
  111.  
  112.       return var3;
  113.    }
  114.  
  115.    public int costInline(int var1, Environment var2, Context var3) {
  116.       int var4 = this.expr.costInline(var1, var2, var3);
  117.  
  118.       for(int var5 = 0; var5 < this.args.length && var4 < var1; ++var5) {
  119.          if (this.args[var5] != null) {
  120.             var4 += this.args[var5].costInline(var1, var2, var3);
  121.          }
  122.       }
  123.  
  124.       return var4;
  125.    }
  126.  
  127.    public void code(Environment var1, Context var2, Assembler var3) {
  128.       CodeContext var4 = new CodeContext(var2, this);
  129.       this.expr.codeValue(var1, var4, var3);
  130.       SwitchData var5 = new SwitchData();
  131.       boolean var6 = false;
  132.  
  133.       for(int var7 = 0; var7 < this.args.length; ++var7) {
  134.          Statement var8 = this.args[var7];
  135.          if (var8 != null && var8.op == 96) {
  136.             Expression var9 = ((CaseStatement)var8).expr;
  137.             if (var9 != null) {
  138.                var5.add(((IntegerExpression)var9).value, new Label());
  139.             } else {
  140.                var6 = true;
  141.             }
  142.          }
  143.       }
  144.  
  145.       var5.initTableCase();
  146.       var3.add(super.where, 170, var5);
  147.  
  148.       for(int var11 = 0; var11 < this.args.length; ++var11) {
  149.          Statement var12 = this.args[var11];
  150.          if (var12 != null) {
  151.             if (var12.op == 96) {
  152.                Expression var10 = ((CaseStatement)var12).expr;
  153.                if (var10 != null) {
  154.                   var3.add(var5.get(((IntegerExpression)var10).value));
  155.                   var5.addTableCase(((IntegerExpression)var10).value, var12.where);
  156.                } else {
  157.                   var3.add(var5.getDefaultLabel());
  158.                }
  159.             } else {
  160.                var12.code(var1, var4, var3);
  161.             }
  162.          }
  163.       }
  164.  
  165.       if (!var6) {
  166.          var3.add(var5.getDefaultLabel());
  167.          var5.putDefault(false);
  168.       }
  169.  
  170.       var3.add(var4.breakLabel);
  171.    }
  172.  
  173.    public void print(PrintStream var1, int var2) {
  174.       super.print(var1, var2);
  175.       var1.print("switch (");
  176.       this.expr.print(var1);
  177.       var1.print(") {\n");
  178.  
  179.       for(int var3 = 0; var3 < this.args.length; ++var3) {
  180.          if (this.args[var3] != null) {
  181.             ((Statement)this).printIndent(var1, var2 + 1);
  182.             this.args[var3].print(var1, var2 + 1);
  183.             var1.print("\n");
  184.          }
  185.       }
  186.  
  187.       ((Statement)this).printIndent(var1, var2);
  188.       var1.print("}");
  189.    }
  190. }
  191.