home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- class Gen implements Constants {
- private static int[] stackdiff = new int[210];
- private static Pool pool = new Pool();
- private static int statPos;
- private static int stacksize;
- private static boolean fixedPc;
- static boolean alive;
- static Code code;
- static int dontgoto = 168;
-
- static {
- stackdiff[0] = 0;
- stackdiff[1] = 1;
- stackdiff[2] = 1;
- stackdiff[3] = 1;
- stackdiff[4] = 1;
- stackdiff[5] = 1;
- stackdiff[6] = 1;
- stackdiff[7] = 1;
- stackdiff[8] = 1;
- stackdiff[9] = 2;
- stackdiff[10] = 2;
- stackdiff[11] = 1;
- stackdiff[12] = 1;
- stackdiff[13] = 1;
- stackdiff[14] = 2;
- stackdiff[15] = 2;
- stackdiff[16] = 1;
- stackdiff[17] = 1;
- stackdiff[18] = 1;
- stackdiff[19] = 1;
- stackdiff[20] = 2;
- stackdiff[21] = 1;
- stackdiff[22] = 2;
- stackdiff[23] = 1;
- stackdiff[24] = 2;
- stackdiff[25] = 1;
- stackdiff[26] = 1;
- stackdiff[30] = 2;
- stackdiff[34] = 1;
- stackdiff[38] = 2;
- stackdiff[42] = 1;
- stackdiff[27] = 1;
- stackdiff[31] = 2;
- stackdiff[35] = 1;
- stackdiff[39] = 2;
- stackdiff[43] = 1;
- stackdiff[28] = 1;
- stackdiff[32] = 2;
- stackdiff[36] = 1;
- stackdiff[40] = 2;
- stackdiff[44] = 1;
- stackdiff[29] = 1;
- stackdiff[33] = 2;
- stackdiff[37] = 1;
- stackdiff[41] = 2;
- stackdiff[45] = 1;
- stackdiff[46] = -1;
- stackdiff[47] = 0;
- stackdiff[48] = -1;
- stackdiff[49] = 0;
- stackdiff[50] = -1;
- stackdiff[51] = -1;
- stackdiff[52] = -1;
- stackdiff[53] = -1;
- stackdiff[54] = -1;
- stackdiff[55] = -2;
- stackdiff[56] = -1;
- stackdiff[57] = -2;
- stackdiff[58] = -1;
- stackdiff[59] = -1;
- stackdiff[63] = -2;
- stackdiff[67] = -1;
- stackdiff[71] = -2;
- stackdiff[75] = -1;
- stackdiff[60] = -1;
- stackdiff[64] = -2;
- stackdiff[68] = -1;
- stackdiff[72] = -2;
- stackdiff[76] = -1;
- stackdiff[61] = -1;
- stackdiff[65] = -2;
- stackdiff[69] = -1;
- stackdiff[73] = -2;
- stackdiff[77] = -1;
- stackdiff[62] = -1;
- stackdiff[66] = -2;
- stackdiff[70] = -1;
- stackdiff[74] = -2;
- stackdiff[78] = -1;
- stackdiff[79] = -3;
- stackdiff[80] = -4;
- stackdiff[81] = -3;
- stackdiff[82] = -4;
- stackdiff[83] = -3;
- stackdiff[84] = -3;
- stackdiff[85] = -3;
- stackdiff[86] = -3;
- stackdiff[87] = -1;
- stackdiff[88] = -2;
- stackdiff[89] = 1;
- stackdiff[90] = 1;
- stackdiff[91] = 1;
- stackdiff[92] = 2;
- stackdiff[93] = 2;
- stackdiff[94] = 2;
- stackdiff[95] = 0;
- stackdiff[96] = -1;
- stackdiff[97] = -2;
- stackdiff[98] = -1;
- stackdiff[99] = -2;
- stackdiff[100] = -1;
- stackdiff[101] = -2;
- stackdiff[102] = -1;
- stackdiff[103] = -2;
- stackdiff[104] = -1;
- stackdiff[105] = -2;
- stackdiff[106] = -1;
- stackdiff[107] = -2;
- stackdiff[108] = -1;
- stackdiff[109] = -2;
- stackdiff[110] = -1;
- stackdiff[111] = -2;
- stackdiff[112] = -1;
- stackdiff[113] = -2;
- stackdiff[114] = -1;
- stackdiff[115] = -2;
- stackdiff[116] = 0;
- stackdiff[117] = 0;
- stackdiff[118] = 0;
- stackdiff[119] = 0;
- stackdiff[120] = -1;
- stackdiff[121] = -1;
- stackdiff[122] = -1;
- stackdiff[123] = -1;
- stackdiff[124] = -1;
- stackdiff[125] = -1;
- stackdiff[126] = -1;
- stackdiff[127] = -2;
- stackdiff[128] = -1;
- stackdiff[129] = -2;
- stackdiff[130] = -1;
- stackdiff[131] = -2;
- stackdiff[132] = 0;
- stackdiff[133] = 1;
- stackdiff[134] = 0;
- stackdiff[135] = 1;
- stackdiff[136] = -1;
- stackdiff[137] = -1;
- stackdiff[138] = 0;
- stackdiff[139] = 0;
- stackdiff[140] = 1;
- stackdiff[141] = 1;
- stackdiff[142] = -1;
- stackdiff[143] = 0;
- stackdiff[144] = -1;
- stackdiff[145] = 0;
- stackdiff[146] = 0;
- stackdiff[147] = 0;
- stackdiff[148] = -3;
- stackdiff[149] = -1;
- stackdiff[150] = -1;
- stackdiff[151] = -3;
- stackdiff[152] = -3;
- stackdiff[153] = -1;
- stackdiff[154] = -1;
- stackdiff[155] = -1;
- stackdiff[156] = -1;
- stackdiff[157] = -1;
- stackdiff[158] = -1;
- stackdiff[159] = -2;
- stackdiff[160] = -2;
- stackdiff[161] = -2;
- stackdiff[162] = -2;
- stackdiff[163] = -2;
- stackdiff[164] = -2;
- stackdiff[165] = -2;
- stackdiff[166] = -2;
- stackdiff[167] = 0;
- stackdiff[168] = 0;
- stackdiff[169] = 0;
- stackdiff[170] = -1;
- stackdiff[171] = -1;
- stackdiff[172] = -1001;
- stackdiff[173] = -1002;
- stackdiff[174] = -1001;
- stackdiff[175] = -1002;
- stackdiff[176] = -1001;
- stackdiff[177] = -1000;
- stackdiff[178] = -999;
- stackdiff[179] = -999;
- stackdiff[180] = -999;
- stackdiff[181] = -999;
- stackdiff[182] = -999;
- stackdiff[183] = -999;
- stackdiff[184] = -999;
- stackdiff[185] = -999;
- stackdiff[186] = 0;
- stackdiff[187] = 1;
- stackdiff[188] = 0;
- stackdiff[189] = 0;
- stackdiff[190] = 0;
- stackdiff[191] = -1001;
- stackdiff[192] = 0;
- stackdiff[193] = 0;
- stackdiff[194] = -1;
- stackdiff[195] = -1;
- stackdiff[196] = 0;
- stackdiff[197] = -999;
- stackdiff[198] = -1;
- stackdiff[199] = -1;
- stackdiff[200] = 0;
- stackdiff[201] = 0;
- stackdiff[202] = 0;
- stackdiff[209] = 0;
- }
-
- static void useCode(Code var0) {
- code = var0;
- }
-
- static Code newCode(Obj var0, boolean var1, boolean var2) {
- code = new Code(var0, var1, var2);
- return code;
- }
-
- static Pool newPool() {
- pool.reset();
- return pool;
- }
-
- static Label mergeLabels(Label var0, Label var1) {
- if (var1 == null) {
- return var0;
- } else {
- return var0 == null ? var1 : new Label(var1.pc, mergeLabels(var0, var1.next), var1.stacksize, var1.uninits);
- }
- }
-
- static void resolve(Label var0) {
- resolve(var0, code.cp);
- }
-
- static void resolve(Label var0, int var1) {
- if (var0 != null) {
- if (var1 > code.cp) {
- var1 = code.cp;
- }
-
- if (get1(var0.pc) == 167 && var0.pc + 3 == var1 && var1 == code.cp && !fixedPc) {
- code.cp -= 3;
- var1 -= 3;
- } else if (code.fatCode) {
- put4(var0.pc + 1, var1 - var0.pc);
- } else if (var1 - var0.pc >= -32768 && var1 - var0.pc <= 32767) {
- put2(var0.pc + 1, var1 - var0.pc);
- } else {
- code.fatCode = true;
- }
-
- fixedPc = true;
- resolve(var0.next, var1);
- if (code.cp == var1) {
- alive = true;
- stacksize = var0.stacksize;
- code.uninits.orSet(var0.uninits);
- }
- }
-
- }
-
- static Label branch(int var0) {
- if (var0 != dontgoto && alive) {
- Label var1 = new Label(code.cp, (Label)null, stacksize + stackdiff[var0], uninitSet());
- emitJump(var1, var0);
- fixedPc = code.fatCode;
- if (var0 == 167) {
- alive = false;
- code.uninits.clear();
- }
-
- return var1;
- } else {
- return null;
- }
- }
-
- static void emitJump(Label var0, int var1) {
- if (code.fatCode) {
- if (var1 != 167 && var1 != 168) {
- emitop2(negate(var1), 8);
- emitop4(167, 0);
- var0.pc += 3;
- } else {
- emitop4(var1, 0);
- }
- } else {
- emitop2(var1, 0);
- }
-
- }
-
- static int negate(int var0) {
- return (var0 + 1 ^ 1) - 1;
- }
-
- static void emitMinusOne(int var0) {
- if (var0 == 0) {
- emitop(2);
- } else {
- emitop(9);
- emitop(10);
- emitop(101);
- }
-
- }
-
- static int one(int var0) {
- return zero(var0) + 1;
- }
-
- static int zero(int var0) {
- switch (var0) {
- case 0:
- return 3;
- case 1:
- return 9;
- case 2:
- return 11;
- case 3:
- return 14;
- default:
- throw new CompilerError("zero");
- }
- }
-
- static int width(Typ[] var0) {
- int var1 = 0;
-
- for(int var2 = 0; var2 < var0.length; ++var2) {
- var1 += width(var0[var2]);
- }
-
- return var1;
- }
-
- static int width(Typ var0) {
- switch (var0.tag) {
- case 12:
- return 0;
- case 7:
- case 9:
- return 2;
- default:
- return 1;
- }
- }
-
- static int typecode(Typ var0) {
- return truncateCode(longTypecode(var0));
- }
-
- static int truncateCode(int var0) {
- switch (var0) {
- case 5:
- case 6:
- case 7:
- return 0;
- default:
- return var0;
- }
- }
-
- static int longTypecode(Typ var0) {
- switch (var0.tag) {
- case 2:
- return 5;
- case 3:
- case 12:
- case 14:
- default:
- throw new CompilerError("typecode");
- case 4:
- return 6;
- case 5:
- return 7;
- case 6:
- return 0;
- case 7:
- return 1;
- case 8:
- return 2;
- case 9:
- return 3;
- case 10:
- return 5;
- case 11:
- return 4;
- case 13:
- return 4;
- case 15:
- return 4;
- }
- }
-
- static int mkref(Obj var0) {
- if (var0 instanceof ClassObj) {
- return pool.put(className((ClassObj)var0));
- } else {
- byte var1;
- if (var0 instanceof VarObj) {
- var1 = 9;
- } else if ((var0.owner.modifiers & 512) != 0) {
- var1 = 11;
- } else {
- var1 = 10;
- }
-
- return pool.put(new Reference(var1, className((ClassObj)var0.owner), nameType(var0)));
- }
- }
-
- static int mkref(Typ var0) {
- return pool.put(new NameRef(7, xClassName(var0)));
- }
-
- private static Name xClassName(Typ var0) {
- switch (var0.tag) {
- case 11:
- return var0.obj.fullname;
- case 12:
- default:
- return ClassFile.typeSig(var0, false);
- case 13:
- return ClassFile.typeSig(var0, false);
- case 14:
- throw new CompilerError("xClassName");
- }
- }
-
- private static NameAndType nameType(Obj var0) {
- Name var1 = var0.name;
- if ((var0.modifiers & 2) != 0 && Switches.obfuscate) {
- var1 = Name.fromString(String.valueOf("_$").concat(String.valueOf(var1.index)));
- }
-
- return new NameAndType(var1, ClassFile.typeSig(var0.typ, false));
- }
-
- static NameRef stringName(Name var0) {
- return new NameRef(8, var0);
- }
-
- static NameRef className(ClassObj var0) {
- return new NameRef(7, var0.fullname);
- }
-
- static int putConstant(Object var0) {
- return pool.put(var0);
- }
-
- static void checkInit(int var0, int var1) {
- if (alive) {
- if (var1 < 0) {
- Report.error(var0, "illegal forward reference");
- } else if (code.uninits.member(var1)) {
- Report.error(var0, "variable might not have been initialized");
- code.uninits.excl(var1);
- }
- }
-
- }
-
- static void letInit(int var0) {
- if (alive) {
- code.uninits.excl(var0);
- }
-
- }
-
- static void letUninit(int var0) {
- if (alive) {
- code.uninits.incl(var0);
- }
-
- }
-
- static void statBegin(int var0) {
- if (alive) {
- statPos = var0;
- code.addLineNumber(code.cp, var0 >>> 10);
- } else {
- Report.warning(var0, "statement is unreachable");
- }
-
- }
-
- static void adrGlobal(VarObj var0) {
- var0.adr = code.max_fields++;
- }
-
- static void endScopes(int var0) {
- code.setEndPc(var0, code.cp);
- }
-
- static int nextLocal() {
- return code.nvars;
- }
-
- static void adrLocal(VarObj var0, int var1) {
- var0.adr = var1;
- code.addLocalVar(code.cp, var0);
- }
-
- static int newLocal(Typ var0) {
- int var1 = code.max_locals;
- code.max_locals += width(var0);
- return var1;
- }
-
- static void registerCatch(int var0, int var1, int var2, int var3) {
- code.addCatch(var0, var1, var2, var3);
- }
-
- static void entryPoint(int var0, Bits var1) {
- entryPoint(var0);
- code.uninits = var1.dup();
- }
-
- static void entryPoint(int var0) {
- stacksize = var0;
- alive = true;
- if (stacksize > code.max_stack) {
- code.max_stack = stacksize;
- }
-
- }
-
- static void align(int var0) {
- if (alive) {
- while(code.cp % var0 != 0) {
- emit1(0);
- }
- }
-
- }
-
- static int get4(int var0) {
- return get1(var0) << 24 | get1(var0 + 1) << 16 | get1(var0 + 2) << 8 | get1(var0 + 3);
- }
-
- static int get1(int var0) {
- return code.code[var0] & 255;
- }
-
- static void put4(int var0, int var1) {
- put1(var0, var1 >> 24 & 255);
- put1(var0 + 1, var1 >> 16 & 255);
- put1(var0 + 2, var1 >> 8 & 255);
- put1(var0 + 3, var1 & 255);
- }
-
- static void put2(int var0, int var1) {
- put1(var0, var1 >> 8 & 255);
- put1(var0 + 1, var1 & 255);
- }
-
- static void put1(int var0, int var1) {
- code.code[var0] = (byte)var1;
- }
-
- static void emitop4(int var0, int var1) {
- emitop(var0);
- emit2(var1);
- }
-
- static void emitop2(int var0, int var1) {
- emitop(var0);
- emit2(var1);
- }
-
- static void emitop1w(int var0, int var1) {
- if (var1 > 255) {
- emitop1(196, var1 >>> 8);
- }
-
- emitop(var0);
- emit1(var1 & 255);
- }
-
- static void emitop1(int var0, int var1) {
- emitop(var0);
- emit1(var1);
- }
-
- static void emitop(int var0) {
- emitop(var0, stackdiff[var0]);
- }
-
- static void emitop(int var0, int var1) {
- if (alive) {
- emit1(var0);
- if (var1 <= -1000) {
- alive = false;
- code.uninits.clear();
- } else {
- stacksize += var1;
- if (stacksize > code.max_stack) {
- code.max_stack = stacksize;
- }
- }
- }
-
- }
-
- static void emit4(int var0) {
- emit1(var0 >> 24 & 255);
- emit1(var0 >> 16 & 255);
- emit1(var0 >> 8 & 255);
- emit1(var0 & 255);
- }
-
- static void emit2(int var0) {
- int var1 = var0 >> 8 & 255;
- int var2 = var0 & 255;
- if (alive) {
- if (code.cp + 2 > code.code.length) {
- code.addCode((byte)var1);
- code.addCode((byte)var2);
- } else {
- code.code[code.cp++] = (byte)var1;
- code.code[code.cp++] = (byte)var2;
- }
- }
-
- }
-
- static void emit1(int var0) {
- if (alive) {
- if (code.cp == code.code.length) {
- code.addCode((byte)var0);
- } else {
- code.code[code.cp++] = (byte)var0;
- }
- }
-
- }
-
- static Bits uninitSet() {
- return code.uninits.dup();
- }
-
- static int stackSize() {
- return stacksize;
- }
-
- static int curPc() {
- fixedPc = true;
- return code.cp;
- }
-
- public Gen() {
- }
- }
-