home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.asm;
-
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.util.Enumeration;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.RuntimeConstants;
-
- public class Instruction implements Constants {
- int where;
- // $FF: renamed from: pc int
- int field_0;
- int opc;
- Object value;
- Instruction next;
- boolean flagCondInverted;
- boolean flagNoCovered = false;
-
- public Instruction(int var1, int var2, Object var3, boolean var4) {
- this.where = var1;
- this.opc = var2;
- this.value = var3;
- this.flagCondInverted = var4;
- }
-
- public Instruction(boolean var1, int var2, int var3, Object var4) {
- this.where = var2;
- this.opc = var3;
- this.value = var4;
- this.flagNoCovered = var1;
- }
-
- public Instruction(int var1, int var2, boolean var3) {
- this.where = var1;
- this.opc = var2;
- this.flagNoCovered = var3;
- }
-
- public Instruction(int var1, int var2, Object var3) {
- this.where = var1;
- this.opc = var2;
- this.value = var3;
- }
-
- public int getOpcode() {
- return this.field_0;
- }
-
- public Object getValue() {
- return this.value;
- }
-
- public void setValue(Object var1) {
- this.value = var1;
- }
-
- void optimize(Environment var1) {
- switch (this.opc) {
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- if (this.value instanceof LocalVariable && !var1.debug()) {
- this.value = new Integer(((LocalVariable)this.value).slot);
- return;
- }
- break;
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 198:
- case 199:
- this.value = ((Label)this.value).getDestination();
- if (this.value == this.next) {
- this.opc = 87;
- return;
- }
-
- if (this.next.opc == 167 && this.value == this.next.next) {
- switch (this.opc) {
- case 153:
- this.opc = 154;
- break;
- case 154:
- this.opc = 153;
- break;
- case 155:
- this.opc = 156;
- break;
- case 156:
- this.opc = 155;
- break;
- case 157:
- this.opc = 158;
- break;
- case 158:
- this.opc = 157;
- break;
- case 198:
- this.opc = 199;
- break;
- case 199:
- this.opc = 198;
- }
-
- this.flagCondInverted = !this.flagCondInverted;
- this.value = this.next.value;
- this.next.opc = -2;
- return;
- }
- break;
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- this.value = ((Label)this.value).getDestination();
- if (this.value == this.next) {
- this.opc = 88;
- return;
- }
-
- if (this.next.opc == 167 && this.value == this.next.next) {
- switch (this.opc) {
- case 159:
- this.opc = 160;
- break;
- case 160:
- this.opc = 159;
- break;
- case 161:
- this.opc = 162;
- break;
- case 162:
- this.opc = 161;
- break;
- case 163:
- this.opc = 164;
- break;
- case 164:
- this.opc = 163;
- break;
- case 165:
- this.opc = 166;
- break;
- case 166:
- this.opc = 165;
- }
-
- this.flagCondInverted = !this.flagCondInverted;
- this.value = this.next.value;
- this.next.opc = -2;
- return;
- }
- break;
- case 167:
- Label var10 = (Label)this.value;
- Label var11;
- this.value = var11 = var10.getDestination();
- if (var11 == this.next) {
- this.opc = -2;
- return;
- }
-
- if (var11.next != null && !var1.debug()) {
- switch (var11.next.opc) {
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- this.opc = var11.next.opc;
- this.value = var11.next.value;
- return;
- }
- }
- break;
- case 170:
- case 171:
- SwitchData var2 = (SwitchData)this.value;
- var2.defaultLabel = var2.defaultLabel.getDestination();
- Enumeration var3 = var2.tab.keys();
-
- while(var3.hasMoreElements()) {
- Integer var4 = (Integer)var3.nextElement();
- Label var5 = (Label)var2.tab.get(var4);
- var2.tab.put(var4, var5.getDestination());
- }
-
- long var12 = (long)(var1.optimize() ? 2 : 4);
- long var6 = (long)var2.maxValue - (long)var2.minValue;
- long var8 = (long)var2.tab.size();
- this.opc = var6 - var8 <= var8 / var12 ? 170 : 171;
- return;
- }
-
- }
-
- void collect(ConstantPool var1) {
- switch (this.opc) {
- case -3:
- Enumeration var8 = ((TryData)this.value).catches.elements();
-
- while(var8.hasMoreElements()) {
- CatchData var3 = (CatchData)var8.nextElement();
- if (var3.getType() != null) {
- var1.put(var3.getType());
- }
- }
-
- return;
- case 0:
- if (this.value != null && this.value instanceof ClassDeclaration) {
- var1.put(this.value);
- }
-
- return;
- case 18:
- case 19:
- if (this.value instanceof Integer) {
- int var6 = (Integer)this.value;
- if (var6 >= -1 && var6 <= 5) {
- this.opc = 3 + var6;
- return;
- }
-
- if (var6 > -128 && var6 < 128) {
- this.opc = 16;
- return;
- }
-
- if (var6 > -32768 && var6 < 32768) {
- this.opc = 17;
- return;
- }
- } else if (this.value instanceof Float) {
- float var7 = (Float)this.value;
- if (var7 == 0.0F) {
- if (Float.floatToIntBits(var7) == 0) {
- this.opc = 11;
- return;
- }
- } else {
- if (var7 == 1.0F) {
- this.opc = 12;
- return;
- }
-
- if (var7 == 2.0F) {
- this.opc = 13;
- return;
- }
- }
- }
-
- var1.put(this.value);
- return;
- case 20:
- if (this.value instanceof Long) {
- long var4 = (Long)this.value;
- if (var4 == 0L) {
- this.opc = 9;
- return;
- }
-
- if (var4 == 1L) {
- this.opc = 10;
- return;
- }
- } else if (this.value instanceof Double) {
- double var5 = (Double)this.value;
- if (var5 == (double)0.0F) {
- if (Double.doubleToLongBits(var5) == 0L) {
- this.opc = 14;
- return;
- }
- } else if (var5 == (double)1.0F) {
- this.opc = 15;
- return;
- }
- }
-
- var1.put(this.value);
- return;
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- if (this.value instanceof LocalVariable) {
- FieldDefinition var2 = ((LocalVariable)this.value).field;
- var1.put(var2.getName().toString());
- var1.put(var2.getType().getTypeSignature());
- }
-
- return;
- case 178:
- case 179:
- case 180:
- case 181:
- case 182:
- case 183:
- case 184:
- case 185:
- case 187:
- case 192:
- case 193:
- var1.put(this.value);
- return;
- case 189:
- var1.put(this.value);
- return;
- case 197:
- var1.put(((ArrayData)this.value).type);
- return;
- default:
- }
- }
-
- int balance() {
- switch (this.opc) {
- case -3:
- case -2:
- case -1:
- case 0:
- case 47:
- case 49:
- case 95:
- case 116:
- case 117:
- case 118:
- case 119:
- case 132:
- case 134:
- case 138:
- case 139:
- case 143:
- case 145:
- case 146:
- case 147:
- case 167:
- case 168:
- case 169:
- case 177:
- case 188:
- case 189:
- case 190:
- case 192:
- case 193:
- case 200:
- case 201:
- return 0;
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 11:
- case 12:
- case 13:
- case 16:
- case 17:
- case 18:
- case 19:
- case 21:
- case 23:
- case 25:
- case 89:
- case 90:
- case 91:
- case 133:
- case 135:
- case 140:
- case 141:
- case 187:
- return 1;
- case 9:
- case 10:
- case 14:
- case 15:
- case 20:
- case 22:
- case 24:
- case 92:
- case 93:
- case 94:
- return 2;
- case 46:
- case 48:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 56:
- case 58:
- case 87:
- case 96:
- case 98:
- case 100:
- case 102:
- case 104:
- case 106:
- case 108:
- case 110:
- case 112:
- case 114:
- case 120:
- case 121:
- case 122:
- case 123:
- case 124:
- case 125:
- case 126:
- case 128:
- case 130:
- case 136:
- case 137:
- case 142:
- case 144:
- case 149:
- case 150:
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 170:
- case 171:
- case 172:
- case 174:
- case 176:
- case 191:
- case 194:
- case 195:
- case 198:
- case 199:
- return -1;
- case 55:
- case 57:
- case 88:
- case 97:
- case 99:
- case 101:
- case 103:
- case 105:
- case 107:
- case 109:
- case 111:
- case 113:
- case 115:
- case 127:
- case 129:
- case 131:
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- case 173:
- case 175:
- return -2;
- case 79:
- case 81:
- case 83:
- case 84:
- case 85:
- case 86:
- case 148:
- case 151:
- case 152:
- return -3;
- case 80:
- case 82:
- return -4;
- case 178:
- return ((FieldDefinition)this.value).getType().stackSize();
- case 179:
- return -((FieldDefinition)this.value).getType().stackSize();
- case 180:
- return ((FieldDefinition)this.value).getType().stackSize() - 1;
- case 181:
- return -1 - ((FieldDefinition)this.value).getType().stackSize();
- case 182:
- case 183:
- case 185:
- return ((FieldDefinition)this.value).getType().getReturnType().stackSize() - (((FieldDefinition)this.value).getType().stackSize() + 1);
- case 184:
- return ((FieldDefinition)this.value).getType().getReturnType().stackSize() - ((FieldDefinition)this.value).getType().stackSize();
- case 197:
- return 1 - ((ArrayData)this.value).nargs;
- default:
- throw new CompilerError("invalid opcode: " + this.toString());
- }
- }
-
- int size(ConstantPool var1) {
- switch (this.opc) {
- case -3:
- case -2:
- case -1:
- return 0;
- case 0:
- if (this.value != null && !(this.value instanceof Integer)) {
- return 2;
- }
-
- return 1;
- case 16:
- case 188:
- return 2;
- case 17:
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- case 167:
- case 168:
- case 198:
- case 199:
- return 3;
- case 18:
- case 19:
- if (var1.index(this.value) < 256) {
- this.opc = 18;
- return 2;
- }
-
- this.opc = 19;
- return 3;
- case 20:
- case 178:
- case 179:
- case 180:
- case 181:
- case 182:
- case 183:
- case 184:
- case 187:
- case 189:
- case 192:
- case 193:
- return 3;
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- int var8 = ((Number)this.value).intValue();
- if (var8 < 4) {
- if (var8 < 0) {
- throw new CompilerError("invalid slot: " + this.toString());
- }
-
- this.opc = 26 + (this.opc - 21) * 4 + var8;
- return 1;
- } else {
- if (var8 <= 255) {
- return 2;
- }
-
- this.opc += 256;
- return 4;
- }
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- int var7 = this.value instanceof Number ? ((Number)this.value).intValue() : ((LocalVariable)this.value).slot;
- if (var7 < 4) {
- if (var7 < 0) {
- throw new CompilerError("invalid slot: " + this.toString());
- }
-
- this.opc = 59 + (this.opc - 54) * 4 + var7;
- return 1;
- } else {
- if (var7 <= 255) {
- return 2;
- }
-
- this.opc += 256;
- return 4;
- }
- case 132:
- int var6 = ((int[])this.value)[0];
- int var10 = ((int[])this.value)[1];
- if (var6 < 0) {
- throw new CompilerError("invalid slot: " + this.toString());
- } else {
- if (var6 <= 255 && (byte)var10 == var10) {
- return 3;
- }
-
- this.opc += 256;
- return 6;
- }
- case 169:
- int var5 = ((Number)this.value).intValue();
- if (var5 <= 255) {
- if (var5 < 0) {
- throw new CompilerError("invalid slot: " + this.toString());
- }
-
- return 2;
- }
-
- this.opc += 256;
- return 4;
- case 170:
- SwitchData var4 = (SwitchData)this.value;
-
- int var9;
- for(var9 = 1; (this.field_0 + var9) % 4 != 0; ++var9) {
- }
-
- return var9 + 16 + (var4.maxValue - var4.minValue) * 4;
- case 171:
- SwitchData var2 = (SwitchData)this.value;
-
- int var3;
- for(var3 = 1; (this.field_0 + var3) % 4 != 0; ++var3) {
- }
-
- return var3 + 8 + var2.tab.size() * 8;
- case 185:
- case 200:
- case 201:
- return 5;
- case 197:
- return 4;
- default:
- return 1;
- }
- }
-
- void write(DataOutputStream var1, ConstantPool var2) throws IOException {
- switch (this.opc) {
- case 0:
- if (this.value != null) {
- if (this.value instanceof Integer) {
- var1.writeByte((Integer)this.value);
- return;
- }
-
- var1.writeShort(var2.index(this.value));
- return;
- }
- default:
- var1.writeByte(this.opc);
- case -3:
- case -2:
- case -1:
- return;
- case 16:
- case 188:
- var1.writeByte(this.opc);
- var1.writeByte(((Number)this.value).intValue());
- return;
- case 17:
- var1.writeByte(this.opc);
- var1.writeShort(((Number)this.value).intValue());
- return;
- case 18:
- var1.writeByte(this.opc);
- var1.writeByte(var2.index(this.value));
- return;
- case 19:
- case 20:
- case 178:
- case 179:
- case 180:
- case 181:
- case 182:
- case 183:
- case 184:
- case 187:
- case 192:
- case 193:
- var1.writeByte(this.opc);
- var1.writeShort(var2.index(this.value));
- return;
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- case 169:
- var1.writeByte(this.opc);
- var1.writeByte(((Number)this.value).intValue());
- return;
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- var1.writeByte(this.opc);
- var1.writeByte(this.value instanceof Number ? ((Number)this.value).intValue() : ((LocalVariable)this.value).slot);
- return;
- case 132:
- var1.writeByte(this.opc);
- var1.writeByte(((int[])this.value)[0]);
- var1.writeByte(((int[])this.value)[1]);
- return;
- case 153:
- case 154:
- case 155:
- case 156:
- case 157:
- case 158:
- case 159:
- case 160:
- case 161:
- case 162:
- case 163:
- case 164:
- case 165:
- case 166:
- case 167:
- case 168:
- case 198:
- case 199:
- var1.writeByte(this.opc);
- var1.writeShort(((Instruction)this.value).field_0 - this.field_0);
- return;
- case 170:
- SwitchData var8 = (SwitchData)this.value;
- var1.writeByte(this.opc);
-
- for(int var9 = 1; (this.field_0 + var9) % 4 != 0; ++var9) {
- var1.writeByte(0);
- }
-
- var1.writeInt(var8.defaultLabel.field_0 - this.field_0);
- var1.writeInt(var8.minValue);
- var1.writeInt(var8.maxValue);
-
- for(int var10 = var8.minValue; var10 <= var8.maxValue; ++var10) {
- Label var11 = var8.get(var10);
- int var7 = var11 != null ? var11.field_0 : var8.defaultLabel.field_0;
- var1.writeInt(var7 - this.field_0);
- }
-
- return;
- case 171:
- SwitchData var3 = (SwitchData)this.value;
- var1.writeByte(this.opc);
-
- for(int var4 = this.field_0 + 1; var4 % 4 != 0; ++var4) {
- var1.writeByte(0);
- }
-
- var1.writeInt(var3.defaultLabel.field_0 - this.field_0);
- var1.writeInt(var3.tab.size());
- Enumeration var5 = var3.sortedKeys();
-
- while(var5.hasMoreElements()) {
- Integer var6 = (Integer)var5.nextElement();
- var1.writeInt(var6);
- var1.writeInt(var3.get(var6).field_0 - this.field_0);
- }
-
- return;
- case 185:
- var1.writeByte(this.opc);
- var1.writeShort(var2.index(this.value));
- var1.writeByte(((FieldDefinition)this.value).getType().stackSize() + 1);
- var1.writeByte(0);
- return;
- case 189:
- var1.writeByte(this.opc);
- var1.writeShort(var2.index(this.value));
- return;
- case 197:
- var1.writeByte(this.opc);
- var1.writeShort(var2.index(((ArrayData)this.value).type));
- var1.writeByte(((ArrayData)this.value).nargs);
- return;
- case 200:
- case 201:
- var1.writeByte(this.opc);
- var1.writeLong((long)(((Instruction)this.value).field_0 - this.field_0));
- return;
- case 277:
- case 278:
- case 279:
- case 280:
- case 281:
- case 425:
- var1.writeByte(196);
- var1.writeByte(this.opc - 256);
- var1.writeShort(((Number)this.value).intValue());
- return;
- case 310:
- case 311:
- case 312:
- case 313:
- case 314:
- var1.writeByte(196);
- var1.writeByte(this.opc - 256);
- var1.writeShort(this.value instanceof Number ? ((Number)this.value).intValue() : ((LocalVariable)this.value).slot);
- return;
- case 388:
- var1.writeByte(196);
- var1.writeByte(this.opc - 256);
- var1.writeShort(((int[])this.value)[0]);
- var1.writeShort(((int[])this.value)[1]);
- }
- }
-
- public String toString() {
- String var1 = (this.where >> 18) + ":\t";
- switch (this.opc) {
- case -3:
- return var1 + "try " + ((TryData)this.value).getEndLabel().hashCode();
- case -2:
- return var1 + "dead";
- case 132:
- int var2 = ((int[])this.value)[0];
- int var3 = ((int[])this.value)[1];
- return var1 + RuntimeConstants.opcNames[this.opc] + " " + var2 + ", " + var3;
- default:
- if (this.value != null) {
- if (this.value instanceof Label) {
- return var1 + RuntimeConstants.opcNames[this.opc] + " " + this.value.toString();
- } else if (this.value instanceof Instruction) {
- return var1 + RuntimeConstants.opcNames[this.opc] + " " + this.value.hashCode();
- } else {
- return this.value instanceof String ? var1 + RuntimeConstants.opcNames[this.opc] + " \"" + this.value + "\"" : var1 + RuntimeConstants.opcNames[this.opc] + " " + this.value;
- }
- } else {
- return var1 + RuntimeConstants.opcNames[this.opc];
- }
- }
- }
- }
-