home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- import java.util.Hashtable;
-
- class Switch extends JumpTarget {
- Case[] cases;
- AST sel;
-
- void print(int var1) {
- System.out.print("switch (");
- this.sel.print();
- System.out.print(") {\n");
-
- for(int var2 = 0; var2 < this.cases.length; ++var2) {
- this.cases[var2].print();
- }
-
- Pretty.align();
- System.out.print("}");
- }
-
- Item gen() {
- Gen.statBegin(super.pos);
- this.sel.genLoad();
- int var1 = Integer.MAX_VALUE;
- int var2 = Integer.MIN_VALUE;
- int var3 = 0;
- Hashtable var4 = new Hashtable();
- boolean var5 = false;
-
- for(int var6 = 0; var6 < this.cases.length; ++var6) {
- if (this.cases[var6].pat != null) {
- Item var7 = this.cases[var6].pat.gen();
- if (var7 instanceof ImmediateItem) {
- Object var8 = ((ImmediateItem)var7).value;
- if (var4.get(var8) == null) {
- var4.put(var8, var8);
- int var9 = (Integer)var8;
- if (var9 < var1) {
- var1 = var9;
- }
-
- if (var2 < var9) {
- var2 = var9;
- }
-
- ++var3;
- this.cases[var6].val = var9;
- this.cases[var6].valid = true;
- } else {
- Report.error(this.cases[var6].pos, "duplicate case label");
- }
- } else {
- Report.error(this.cases[var6].pos, "constant expression required");
- }
- } else if (var5) {
- Report.error(this.cases[var6].pos, "duplicate default label");
- } else {
- this.cases[var6].valid = true;
- var5 = true;
- }
- }
-
- long var10 = 4L + (long)(var2 - var1 + 1);
- long var12 = 3L;
- long var14 = 3L + (long)(2 * var3);
- long var16 = (long)var3;
- int var18 = var10 + (long)3 * var12 <= var14 + (long)3 * var16 ? 170 : 171;
- if (Gen.alive) {
- Bits var19 = Gen.uninitSet();
- int var20 = Gen.curPc();
- Gen.emitop(var18);
- Gen.align(4);
- int var21 = Gen.curPc();
- Gen.emit4(-1);
- if (var18 == 170) {
- Gen.emit4(var1);
- Gen.emit4(var2);
-
- for(int var22 = var1; var22 <= var2; ++var22) {
- Gen.emit4(-1);
- }
- } else {
- Gen.emit4(var3);
-
- for(int var23 = 0; var23 < var3; ++var23) {
- Gen.emit4(-1);
- Gen.emit4(-1);
- }
- }
-
- var3 = 0;
-
- for(int var24 = 0; var24 < this.cases.length; ++var24) {
- if (this.cases[var24].valid) {
- if (this.cases[var24].pat != null) {
- if (var18 == 170) {
- Gen.put4(var21 + 4 * (this.cases[var24].val - var1 + 3), Gen.curPc() - var20);
- } else {
- int var25 = var21 + 8 * (var3 + 1);
- Gen.put4(var25, this.cases[var24].val);
- Gen.put4(var25 + 4, Gen.curPc() - var20);
- ++var3;
- }
- } else {
- Gen.put4(var21, Gen.curPc() - var20);
- }
- }
-
- Gen.entryPoint(0, var19);
- this.cases[var24].genDrop();
- }
-
- Gen.resolve(super.exit);
- if (Gen.get4(var21) == -1) {
- Gen.put4(var21, Gen.curPc() - var20);
- Gen.entryPoint(0, var19);
- }
-
- if (var18 == 170) {
- int var26 = Gen.get4(var21);
-
- for(int var27 = var1; var27 <= var2; ++var27) {
- if (Gen.get4(var21 + 4 * (var27 - var1 + 3)) == -1) {
- Gen.put4(var21 + 4 * (var27 - var1 + 3), var26);
- }
- }
- }
- }
-
- return Item.voidItem;
- }
-
- AST simplify() {
- this.sel = this.sel.simplify();
-
- for(int var1 = 0; var1 < this.cases.length; ++var1) {
- this.cases[var1] = (Case)this.cases[var1].simplify();
- }
-
- return this;
- }
-
- void markCaptured(Bits var1) {
- this.sel.markCaptured(var1);
- Bits var2 = var1.dup();
-
- for(int var3 = 0; var3 < this.cases.length; ++var3) {
- var1.orSet(var2);
- this.cases[var3].markCaptured(var1);
- }
-
- var1.orSet(super.exitCapt);
- }
-
- Typ attr(Env var1, int var2, Typ var3) {
- this.sel.attr(var1, 12, Typ.intTyp);
- Env var4 = new Env(var1, this);
- super.typ = var3;
-
- for(int var5 = 0; var5 < this.cases.length; ++var5) {
- super.typ = Attr.join(this.cases[var5].pos, super.typ, this.cases[var5].attr(var4, 12, var3));
- }
-
- return super.typ;
- }
-
- Switch(int var1, AST var2, ASTS var3) {
- super(var1, 21);
- this.sel = var2;
- this.cases = new Case[var3.length];
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- this.cases[var4] = (Case)var3.elems[var4];
- }
-
- super.exitCapt = new Bits();
- }
- }
-