home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- class Item implements Constants {
- int mode;
- static Item nonvirtualItem;
- static Item indexedItem = new Item(2);
- static Item superItem = new Item(4);
- static Item thisItem = new Item(3);
- static Item stackItem = new Item(1);
- static Item voidItem = new Item(0);
-
- static {
- nonvirtualItem = superItem;
- }
-
- Item coerce(Typ var1, Typ var2) {
- int var3 = Gen.longTypecode(var1);
- int var4 = Gen.longTypecode(var2);
- if (var3 == 4 && var4 == 4) {
- if (var1.subtype(var2)) {
- return this;
- } else {
- this.load(var1);
- Gen.emitop2(192, Gen.mkref(var2));
- return stackItem;
- }
- } else {
- return this.coerce(var1, var3, var4);
- }
- }
-
- Item coerce(Typ var1, int var2, int var3) {
- if (var2 == var3) {
- return this;
- } else {
- this.load(var1);
- int var4 = Gen.truncateCode(var2);
- int var5 = Gen.truncateCode(var3);
- if (var4 != var5) {
- int var6 = var5 > var4 ? var5 - 1 : var5;
- Gen.emitop(133 + var4 * 3 + var6);
- }
-
- if (var3 != var5) {
- Gen.emitop(145 + var3 - 5);
- }
-
- return stackItem;
- }
- }
-
- CondItem mkCond() {
- this.load(Typ.booleanTyp);
- return new CondItem(154);
- }
-
- void stash(Typ var1, int var2) {
- switch (this.mode) {
- case 1:
- Gen.emitop((Gen.width(var1) == 2 ? 91 : 90) + 3 * (var2 - 1));
- break;
- case 2:
- Gen.emitop(91 + 3 * (var2 - 1));
- break;
- default:
- Gen.emitop(89 + 3 * (var2 - 1));
- }
-
- }
-
- void drop(Typ var1) {
- switch (this.mode) {
- case 1:
- Gen.emitop(Gen.width(var1) == 2 ? 88 : 87);
- break;
- case 2:
- Gen.emitop(88);
- }
-
- }
-
- void duplicate(Typ var1) {
- switch (this.mode) {
- case 1:
- Gen.emitop(Gen.width(var1) == 2 ? 92 : 89);
- break;
- case 2:
- Gen.emitop(92);
- }
-
- }
-
- void store(Typ var1) {
- switch (this.mode) {
- case 2:
- Gen.emitop(79 + Gen.longTypecode(var1));
- return;
- default:
- throw new CompilerError("store");
- }
- }
-
- void load(Typ var1) {
- switch (this.mode) {
- case 0:
- case 1:
- break;
- case 2:
- Gen.emitop(46 + Gen.longTypecode(var1));
- break;
- case 3:
- case 4:
- Gen.emitop(42);
- break;
- default:
- throw new CompilerError(String.valueOf("load ").concat(String.valueOf(this.mode)));
- }
-
- }
-
- Item(int var1) {
- this.mode = var1;
- }
- }
-