home *** CD-ROM | disk | FTP | other *** search
/ Tutto per Internet / Internet.iso / soft95 / Java / espints / espinst.exe / classes / espresso / Switch.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-02-28  |  3.7 KB  |  180 lines

  1. package espresso;
  2.  
  3. import java.util.Hashtable;
  4.  
  5. class Switch extends JumpTarget {
  6.    Case[] cases;
  7.    AST sel;
  8.  
  9.    void print(int var1) {
  10.       System.out.print("switch (");
  11.       this.sel.print();
  12.       System.out.print(") {\n");
  13.  
  14.       for(int var2 = 0; var2 < this.cases.length; ++var2) {
  15.          this.cases[var2].print();
  16.       }
  17.  
  18.       Pretty.align();
  19.       System.out.print("}");
  20.    }
  21.  
  22.    Item gen() {
  23.       Gen.statBegin(super.pos);
  24.       this.sel.genLoad();
  25.       int var1 = Integer.MAX_VALUE;
  26.       int var2 = Integer.MIN_VALUE;
  27.       int var3 = 0;
  28.       Hashtable var4 = new Hashtable();
  29.       boolean var5 = false;
  30.  
  31.       for(int var6 = 0; var6 < this.cases.length; ++var6) {
  32.          if (this.cases[var6].pat != null) {
  33.             Item var7 = this.cases[var6].pat.gen();
  34.             if (var7 instanceof ImmediateItem) {
  35.                Object var8 = ((ImmediateItem)var7).value;
  36.                if (var4.get(var8) == null) {
  37.                   var4.put(var8, var8);
  38.                   int var9 = (Integer)var8;
  39.                   if (var9 < var1) {
  40.                      var1 = var9;
  41.                   }
  42.  
  43.                   if (var2 < var9) {
  44.                      var2 = var9;
  45.                   }
  46.  
  47.                   ++var3;
  48.                   this.cases[var6].val = var9;
  49.                   this.cases[var6].valid = true;
  50.                } else {
  51.                   Report.error(this.cases[var6].pos, "duplicate case label");
  52.                }
  53.             } else {
  54.                Report.error(this.cases[var6].pos, "constant expression required");
  55.             }
  56.          } else if (var5) {
  57.             Report.error(this.cases[var6].pos, "duplicate default label");
  58.          } else {
  59.             this.cases[var6].valid = true;
  60.             var5 = true;
  61.          }
  62.       }
  63.  
  64.       long var10 = 4L + (long)(var2 - var1 + 1);
  65.       long var12 = 3L;
  66.       long var14 = 3L + (long)(2 * var3);
  67.       long var16 = (long)var3;
  68.       int var18 = var10 + (long)3 * var12 <= var14 + (long)3 * var16 ? 170 : 171;
  69.       if (Gen.alive) {
  70.          Bits var19 = Gen.uninitSet();
  71.          int var20 = Gen.curPc();
  72.          Gen.emitop(var18);
  73.          Gen.align(4);
  74.          int var21 = Gen.curPc();
  75.          Gen.emit4(-1);
  76.          if (var18 == 170) {
  77.             Gen.emit4(var1);
  78.             Gen.emit4(var2);
  79.  
  80.             for(int var22 = var1; var22 <= var2; ++var22) {
  81.                Gen.emit4(-1);
  82.             }
  83.          } else {
  84.             Gen.emit4(var3);
  85.  
  86.             for(int var23 = 0; var23 < var3; ++var23) {
  87.                Gen.emit4(-1);
  88.                Gen.emit4(-1);
  89.             }
  90.          }
  91.  
  92.          var3 = 0;
  93.  
  94.          for(int var24 = 0; var24 < this.cases.length; ++var24) {
  95.             if (this.cases[var24].valid) {
  96.                if (this.cases[var24].pat != null) {
  97.                   if (var18 == 170) {
  98.                      Gen.put4(var21 + 4 * (this.cases[var24].val - var1 + 3), Gen.curPc() - var20);
  99.                   } else {
  100.                      int var25 = var21 + 8 * (var3 + 1);
  101.                      Gen.put4(var25, this.cases[var24].val);
  102.                      Gen.put4(var25 + 4, Gen.curPc() - var20);
  103.                      ++var3;
  104.                   }
  105.                } else {
  106.                   Gen.put4(var21, Gen.curPc() - var20);
  107.                }
  108.             }
  109.  
  110.             Gen.entryPoint(0, var19);
  111.             this.cases[var24].genDrop();
  112.          }
  113.  
  114.          Gen.resolve(super.exit);
  115.          if (Gen.get4(var21) == -1) {
  116.             Gen.put4(var21, Gen.curPc() - var20);
  117.             Gen.entryPoint(0, var19);
  118.          }
  119.  
  120.          if (var18 == 170) {
  121.             int var26 = Gen.get4(var21);
  122.  
  123.             for(int var27 = var1; var27 <= var2; ++var27) {
  124.                if (Gen.get4(var21 + 4 * (var27 - var1 + 3)) == -1) {
  125.                   Gen.put4(var21 + 4 * (var27 - var1 + 3), var26);
  126.                }
  127.             }
  128.          }
  129.       }
  130.  
  131.       return Item.voidItem;
  132.    }
  133.  
  134.    AST simplify() {
  135.       this.sel = this.sel.simplify();
  136.  
  137.       for(int var1 = 0; var1 < this.cases.length; ++var1) {
  138.          this.cases[var1] = (Case)this.cases[var1].simplify();
  139.       }
  140.  
  141.       return this;
  142.    }
  143.  
  144.    void markCaptured(Bits var1) {
  145.       this.sel.markCaptured(var1);
  146.       Bits var2 = var1.dup();
  147.  
  148.       for(int var3 = 0; var3 < this.cases.length; ++var3) {
  149.          var1.orSet(var2);
  150.          this.cases[var3].markCaptured(var1);
  151.       }
  152.  
  153.       var1.orSet(super.exitCapt);
  154.    }
  155.  
  156.    Typ attr(Env var1, int var2, Typ var3) {
  157.       this.sel.attr(var1, 12, Typ.intTyp);
  158.       Env var4 = new Env(var1, this);
  159.       super.typ = var3;
  160.  
  161.       for(int var5 = 0; var5 < this.cases.length; ++var5) {
  162.          super.typ = Attr.join(this.cases[var5].pos, super.typ, this.cases[var5].attr(var4, 12, var3));
  163.       }
  164.  
  165.       return super.typ;
  166.    }
  167.  
  168.    Switch(int var1, AST var2, ASTS var3) {
  169.       super(var1, 21);
  170.       this.sel = var2;
  171.       this.cases = new Case[var3.length];
  172.  
  173.       for(int var4 = 0; var4 < var3.length; ++var4) {
  174.          this.cases[var4] = (Case)var3.elems[var4];
  175.       }
  176.  
  177.       super.exitCapt = new Bits();
  178.    }
  179. }
  180.