home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.asm;
-
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.FilterInputStream;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.util.Enumeration;
- import java.util.Vector;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.javac.SourceClass;
-
- public final class Assembler implements Constants {
- static final int NOTREACHED = 0;
- static final int REACHED = 1;
- static final int NEEDED = 2;
- Label first = new Label();
- Instruction last;
- int maxdepth;
- int maxvar;
- int maxpc;
- static Vector TableLot = new Vector();
- static Vector SourceClassList = new Vector();
- static int count;
- static int countclass;
- static int countmeth;
- static Vector TmpCovTable = new Vector();
-
- public void add(Instruction var1) {
- if (var1 != null) {
- this.last.next = var1;
- this.last = var1;
- }
-
- }
-
- public void add(int var1, int var2) {
- this.add(new Instruction(var1, var2, (Object)null));
- }
-
- public void add(int var1, int var2, Object var3) {
- this.add(new Instruction(var1, var2, var3));
- }
-
- public void add(int var1, int var2, Object var3, boolean var4) {
- this.add(new Instruction(var1, var2, var3, var4));
- }
-
- public void add(boolean var1, int var2, int var3, Object var4) {
- this.add(new Instruction(var1, var2, var3, var4));
- }
-
- public void add(int var1, int var2, boolean var3) {
- this.add(new Instruction(var1, var2, var3));
- }
-
- void optimize(Environment var1, Label var2) {
- var2.pc = 1;
-
- for(Instruction var3 = var2.next; var3 != null; var3 = var3.next) {
- switch (var3.pc) {
- case 0:
- var3.optimize(var1);
- var3.pc = 1;
- break;
- case 1:
- return;
- case 2:
- }
-
- switch (var3.opc) {
- case -3:
- TryData var7 = (TryData)var3.value;
- var7.getEndLabel().pc = 2;
- Enumeration var8 = var7.catches.elements();
-
- while(var8.hasMoreElements()) {
- CatchData var6 = (CatchData)var8.nextElement();
- this.optimize(var1, var6.getLabel());
- }
- break;
- case -2:
- case -1:
- if (var3.pc == 1) {
- var3.pc = 0;
- }
- break;
- 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 198:
- case 199:
- this.optimize(var1, (Label)var3.value);
- break;
- case 167:
- this.optimize(var1, (Label)var3.value);
- return;
- case 168:
- this.optimize(var1, (Label)var3.value);
- break;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- return;
- case 170:
- case 171:
- SwitchData var4 = (SwitchData)var3.value;
- this.optimize(var1, var4.defaultLabel);
- Enumeration var5 = var4.tab.elements();
-
- while(var5.hasMoreElements()) {
- this.optimize(var1, (Label)var5.nextElement());
- }
-
- return;
- }
- }
-
- }
-
- boolean eliminate() {
- boolean var1 = false;
- Object var2 = this.first;
-
- for(Instruction var3 = this.first.next; var3 != null; var3 = var3.next) {
- if (var3.pc != 0) {
- ((Instruction)var2).next = var3;
- var2 = var3;
- var3.pc = 0;
- } else {
- var1 = true;
- }
- }
-
- this.first.pc = 0;
- ((Instruction)var2).next = null;
- return var1;
- }
-
- public void optimize(Environment var1) {
- do {
- this.optimize(var1, this.first);
- } while(this.eliminate() && var1.optimize());
-
- }
-
- public void collect(Environment var1, FieldDefinition var2, ConstantPool var3) {
- if (var2 != null && var1.debug() && var2.getArguments() != null) {
- Enumeration var4 = var2.getArguments().elements();
-
- while(var4.hasMoreElements()) {
- FieldDefinition var5 = (FieldDefinition)var4.nextElement();
- var3.put(var5.getName().toString());
- var3.put(var5.getType().getTypeSignature());
- }
- }
-
- for(Object var6 = this.first; var6 != null; var6 = ((Instruction)var6).next) {
- ((Instruction)var6).collect(var3);
- }
-
- }
-
- void balance(Label var1, int var2) {
- for(Object var3 = var1; var3 != null; var3 = ((Instruction)var3).next) {
- var2 += ((Instruction)var3).balance();
- if (var2 < 0) {
- throw new CompilerError("stack under flow: " + ((Instruction)var3).toString() + " = " + var2);
- }
-
- if (var2 > this.maxdepth) {
- this.maxdepth = var2;
- }
-
- switch (((Instruction)var3).opc) {
- case -3:
- TryData var11 = (TryData)((Instruction)var3).value;
- Enumeration var12 = var11.catches.elements();
-
- while(var12.hasMoreElements()) {
- CatchData var6 = (CatchData)var12.nextElement();
- this.balance(var6.getLabel(), var2 + 1);
- }
- break;
- case -1:
- var1 = (Label)var3;
- if (((Instruction)var3).pc == 1) {
- if (var1.depth != var2) {
- throw new CompilerError("stack depth error " + var2 + "/" + var1.depth + ": " + ((Instruction)var3).toString());
- }
-
- return;
- }
-
- var1.pc = 1;
- var1.depth = var2;
- break;
- case 21:
- case 23:
- case 25:
- case 54:
- case 56:
- case 58:
- int var10 = (((Instruction)var3).value instanceof Number ? ((Number)((Instruction)var3).value).intValue() : ((LocalVariable)((Instruction)var3).value).slot) + 1;
- if (var10 > this.maxvar) {
- this.maxvar = var10;
- }
- break;
- case 22:
- case 24:
- case 55:
- case 57:
- int var9 = (((Instruction)var3).value instanceof Number ? ((Number)((Instruction)var3).value).intValue() : ((LocalVariable)((Instruction)var3).value).slot) + 2;
- if (var9 > this.maxvar) {
- this.maxvar = var9;
- }
- break;
- case 132:
- int var8 = ((int[])((Instruction)var3).value)[0] + 1;
- if (var8 > this.maxvar) {
- this.maxvar = var8 + 1;
- }
- break;
- 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 198:
- case 199:
- this.balance((Label)((Instruction)var3).value, var2);
- break;
- case 167:
- this.balance((Label)((Instruction)var3).value, var2);
- return;
- case 168:
- this.balance((Label)((Instruction)var3).value, var2 + 1);
- break;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- return;
- case 170:
- case 171:
- SwitchData var4 = (SwitchData)((Instruction)var3).value;
- this.balance(var4.defaultLabel, var2);
- Enumeration var5 = var4.tab.elements();
-
- while(var5.hasMoreElements()) {
- this.balance((Label)var5.nextElement(), var2);
- }
-
- return;
- }
- }
-
- }
-
- public void write(Environment var1, DataOutputStream var2, FieldDefinition var3, ConstantPool var4) throws IOException {
- if (var3 != null && var3.getArguments() != null) {
- int var5 = 0;
- Vector var6 = var3.getArguments();
-
- FieldDefinition var8;
- for(Enumeration var7 = var6.elements(); var7.hasMoreElements(); var5 += var8.getType().stackSize()) {
- var8 = (FieldDefinition)var7.nextElement();
- }
-
- this.maxvar = var5;
- }
-
- try {
- this.balance(this.first, 0);
- } catch (CompilerError var9) {
- System.out.println("ERROR: " + var9);
- this.listing(System.out);
- throw var9;
- }
-
- int var10 = 0;
- int var11 = 0;
-
- for(Object var12 = this.first; var12 != null; var12 = ((Instruction)var12).next) {
- ((Instruction)var12).pc = var10;
- var10 += ((Instruction)var12).size(var4);
- if (((Instruction)var12).opc == -3) {
- var11 += ((TryData)((Instruction)var12).value).catches.size();
- }
- }
-
- var2.writeShort(this.maxdepth);
- var2.writeShort(this.maxvar);
- var2.writeInt(this.maxpc = var10);
-
- for(Instruction var13 = this.first.next; var13 != null; var13 = var13.next) {
- var13.write(var2, var4);
- }
-
- var2.writeShort(var11);
- if (var11 > 0) {
- this.writeExceptions(var1, var2, var4, this.first, this.last);
- }
-
- }
-
- void writeExceptions(Environment var1, DataOutputStream var2, ConstantPool var3, Instruction var4, Instruction var5) throws IOException {
- for(Object var6 = var4; var6 != var5.next; var6 = ((Instruction)var6).next) {
- if (((Instruction)var6).opc == -3) {
- TryData var7 = (TryData)((Instruction)var6).value;
- this.writeExceptions(var1, var2, var3, ((Instruction)var6).next, var7.getEndLabel());
- Enumeration var8 = var7.catches.elements();
-
- while(var8.hasMoreElements()) {
- CatchData var9 = (CatchData)var8.nextElement();
- var2.writeShort(((Instruction)var6).pc);
- var2.writeShort(var7.getEndLabel().pc);
- var2.writeShort(var9.getLabel().pc);
- if (var9.getType() != null) {
- var2.writeShort(var3.index(var9.getType()));
- } else {
- var2.writeShort(0);
- }
- }
-
- var6 = var7.getEndLabel();
- }
- }
-
- }
-
- public void writeCoverageTable(Environment var1, ClassDefinition var2, DataOutputStream var3, ConstantPool var4, int var5) throws IOException {
- boolean var6 = false;
- boolean var7 = false;
- int var8 = ((SourceClass)var2).getWhere();
- int[] var9 = new int[20];
- int var10 = 0;
- countmeth = count;
-
- for(Object var11 = this.first; var11 != null; var11 = ((Instruction)var11).next) {
- int var12 = ((Instruction)var11).where >> 18;
- if (var12 > 0 && ((Instruction)var11).opc != -1) {
- if (!var7) {
- if (var8 == ((Instruction)var11).where) {
- TableLot.addElement(new Cover(2, var5, ((Instruction)var11).pc));
- } else {
- TableLot.addElement(new Cover(1, var5, ((Instruction)var11).pc));
- }
-
- ++count;
- var7 = true;
- }
-
- if (!var6 && !((Instruction)var11).flagNoCovered) {
- boolean var13 = false;
-
- for(int var14 = 0; var14 < var10; ++var14) {
- if (var9[var14] == ((Instruction)var11).where) {
- var13 = true;
- break;
- }
- }
-
- if (!var13) {
- TableLot.addElement(new Cover(3, ((Instruction)var11).where, ((Instruction)var11).pc));
- ++count;
- var6 = true;
- }
- }
- }
-
- switch (((Instruction)var11).opc) {
- case -3:
- var9[var10++] = ((Instruction)var11).where;
- var6 = false;
- break;
- case -1:
- var6 = false;
- break;
- 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 198:
- case 199:
- if (((Instruction)var11).flagCondInverted) {
- TableLot.addElement(new Cover(7, ((Instruction)var11).where, ((Instruction)var11).pc));
- TableLot.addElement(new Cover(8, ((Instruction)var11).where, ((Instruction)var11).pc));
- } else {
- TableLot.addElement(new Cover(8, ((Instruction)var11).where, ((Instruction)var11).pc));
- TableLot.addElement(new Cover(7, ((Instruction)var11).where, ((Instruction)var11).pc));
- }
-
- count += 2;
- var6 = false;
- break;
- case 167:
- var6 = false;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- default:
- break;
- case 170:
- SwitchData var18 = (SwitchData)((Instruction)var11).value;
-
- for(int var21 = var18.minValue; var21 <= var18.maxValue; ++var21) {
- TableLot.addElement(new Cover(5, var18.whereCase(var21), ((Instruction)var11).pc));
- ++count;
- }
-
- if (!var18.getDefault()) {
- TableLot.addElement(new Cover(6, ((Instruction)var11).where, ((Instruction)var11).pc));
- ++count;
- }
-
- var6 = false;
- break;
- case 171:
- SwitchData var17 = (SwitchData)((Instruction)var11).value;
-
- for(Enumeration var20 = var17.sortedKeys(); var20.hasMoreElements(); ++count) {
- Integer var15 = (Integer)var20.nextElement();
- TableLot.addElement(new Cover(5, var17.whereCase(var15), ((Instruction)var11).pc));
- }
-
- if (!var17.getDefault()) {
- TableLot.addElement(new Cover(6, ((Instruction)var11).where, ((Instruction)var11).pc));
- ++count;
- }
-
- var6 = false;
- }
- }
-
- var3.writeShort(count - countmeth);
-
- for(int var23 = countmeth; var23 < count; ++var23) {
- Cover var16 = (Cover)TableLot.elementAt(var23);
- int var19 = var16.Addr >> 18;
- int var22 = var16.Addr << 14 >> 14;
- var3.writeShort(var16.NumCommand);
- var3.writeShort(var16.Type);
- var3.writeInt(var16.Addr);
- }
-
- }
-
- public void GenVecJCov(Environment var1, ClassDefinition var2, long var3) {
- String var5 = ((SourceClass)var2).getAbsoluteName();
- String var6 = ((SourceClass)var2).getName().toString();
- TmpCovTable.addElement("CLASS: " + var6);
- SourceClassList.addElement(var6);
- TmpCovTable.addElement("SRCFILE: " + var5);
- TmpCovTable.addElement("TIMESTAMP: " + var3);
- TmpCovTable.addElement("#flag\tline\tposition");
-
- for(int var10 = countclass; var10 < count; ++var10) {
- Cover var7 = (Cover)TableLot.elementAt(var10);
- if (var7.Type != 5 || var7.Addr != 0) {
- int var8 = var7.Addr >> 18;
- int var9 = var7.Addr << 14 >> 14;
- TmpCovTable.addElement(new String(var7.Type + "\t" + var8 + "\t" + var9));
- }
- }
-
- countclass = 0;
- count = 0;
- TableLot.removeAllElements();
- }
-
- public void GenJCov(Environment var1) {
- try {
- File var2 = var1.getcovFile();
- if (var2.exists()) {
- DataInputStream var3 = new DataInputStream(new FileInputStream(var2));
- Object var4 = null;
- boolean var5 = true;
- var3.readLine();
-
- while((var11 = var3.readLine()) != null) {
- if (var11.indexOf("CLASS: ") != -1) {
- var5 = true;
- Enumeration var7 = SourceClassList.elements();
-
- while(var7.hasMoreElements()) {
- String var6 = (String)var7.nextElement();
- if (var6.compareTo(var11.substring(7)) == 0) {
- var5 = false;
- break;
- }
- }
- }
-
- if (var5) {
- TmpCovTable.addElement(var11);
- }
- }
-
- ((FilterInputStream)var3).close();
- }
-
- PrintStream var10 = new PrintStream(new DataOutputStream(new FileOutputStream(var2)));
- var10.println("JCOV-DATA-FILE-VERSION: 1.0");
- Enumeration var12 = TmpCovTable.elements();
-
- while(var12.hasMoreElements()) {
- var10.println(var12.nextElement());
- }
-
- var10.close();
- } catch (FileNotFoundException var8) {
- System.out.println("ERROR: " + var8);
- } catch (IOException var9) {
- System.out.println("ERROR: " + var9);
- }
- }
-
- public void writeLineNumberTable(Environment var1, DataOutputStream var2, ConstantPool var3) throws IOException {
- int var4 = -1;
- int var5 = 0;
-
- for(Object var6 = this.first; var6 != null; var6 = ((Instruction)var6).next) {
- int var7 = ((Instruction)var6).where >> 18;
- if (var7 > 0 && var4 != var7) {
- var4 = var7;
- ++var5;
- }
- }
-
- var4 = -1;
- var2.writeShort(var5);
-
- for(Object var10 = this.first; var10 != null; var10 = ((Instruction)var10).next) {
- int var8 = ((Instruction)var10).where >> 18;
- if (var8 > 0 && var4 != var8) {
- var4 = var8;
- var2.writeShort(((Instruction)var10).pc);
- var2.writeShort(var8);
- }
- }
-
- }
-
- void flowFields(Environment var1, Label var2, FieldDefinition[] var3) {
- if (var2.locals != null) {
- FieldDefinition[] var10 = var2.locals;
-
- for(int var11 = 0; var11 < this.maxvar; ++var11) {
- if (var10[var11] != var3[var11]) {
- var10[var11] = null;
- }
- }
-
- } else {
- var2.locals = new FieldDefinition[this.maxvar];
- System.arraycopy(var3, 0, var2.locals, 0, this.maxvar);
- FieldDefinition[] var4 = new FieldDefinition[this.maxvar];
- System.arraycopy(var3, 0, var4, 0, this.maxvar);
- var3 = var4;
-
- for(Instruction var5 = var2.next; var5 != null; var5 = var5.next) {
- switch (var5.opc) {
- case -3:
- Vector var13 = ((TryData)var5.value).catches;
- Enumeration var14 = var13.elements();
-
- while(var14.hasMoreElements()) {
- CatchData var8 = (CatchData)var14.nextElement();
- this.flowFields(var1, var8.getLabel(), var3);
- }
- break;
- case -1:
- this.flowFields(var1, (Label)var5, var3);
- return;
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- if (var5.value instanceof LocalVariable) {
- LocalVariable var12 = (LocalVariable)var5.value;
- var3[var12.slot] = var12.field;
- }
- break;
- 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 168:
- case 198:
- case 199:
- this.flowFields(var1, (Label)var5.value, var3);
- break;
- case 167:
- this.flowFields(var1, (Label)var5.value, var3);
- return;
- case 169:
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- case 191:
- return;
- case 170:
- case 171:
- SwitchData var6 = (SwitchData)var5.value;
- this.flowFields(var1, var6.defaultLabel, var3);
- Enumeration var7 = var6.tab.elements();
-
- while(var7.hasMoreElements()) {
- this.flowFields(var1, (Label)var7.nextElement(), var3);
- }
-
- return;
- }
- }
-
- }
- }
-
- public void writeLocalVariableTable(Environment var1, FieldDefinition var2, DataOutputStream var3, ConstantPool var4) throws IOException {
- FieldDefinition[] var5 = new FieldDefinition[this.maxvar];
- int var6 = 0;
- if (var2 != null && var2.getArguments() != null) {
- int var7 = 0;
- Vector var8 = var2.getArguments();
-
- FieldDefinition var10;
- for(Enumeration var9 = var8.elements(); var9.hasMoreElements(); var7 += var10.getType().stackSize()) {
- var10 = (FieldDefinition)var9.nextElement();
- var5[var7] = var10;
- }
- }
-
- this.flowFields(var1, this.first, var5);
- LocalVariableTable var17 = new LocalVariableTable();
-
- for(int var12 = 0; var12 < this.maxvar; ++var12) {
- var5[var12] = null;
- }
-
- if (var2 != null && var2.getArguments() != null) {
- int var18 = 0;
- Vector var20 = var2.getArguments();
-
- FieldDefinition var11;
- for(Enumeration var22 = var20.elements(); var22.hasMoreElements(); var18 += var11.getType().stackSize()) {
- var11 = (FieldDefinition)var22.nextElement();
- var5[var18] = var11;
- var17.define(var11, var18, 0, this.maxpc);
- }
- }
-
- int[] var19 = new int[this.maxvar];
-
- for(Object var21 = this.first; var21 != null; var21 = ((Instruction)var21).next) {
- switch (((Instruction)var21).opc) {
- case -1:
- var6 = 0;
-
- for(; var6 < this.maxvar; ++var6) {
- if (var5[var6] != null) {
- var17.define(var5[var6], var6, var19[var6], ((Instruction)var21).pc);
- }
- }
-
- int var24 = ((Instruction)var21).pc;
- FieldDefinition[] var26 = ((Label)var21).locals;
- if (var26 == null) {
- for(int var14 = 0; var14 < this.maxvar; ++var14) {
- var5[var14] = null;
- }
- } else {
- System.arraycopy(var26, 0, var5, 0, this.maxvar);
- }
-
- for(int var15 = 0; var15 < this.maxvar; ++var15) {
- var19[var15] = var24;
- }
- break;
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- if (((Instruction)var21).value instanceof LocalVariable) {
- LocalVariable var23 = (LocalVariable)((Instruction)var21).value;
- int var25 = ((Instruction)var21).next != null ? ((Instruction)var21).next.pc : ((Instruction)var21).pc;
- if (var5[var23.slot] != null) {
- var17.define(var5[var23.slot], var23.slot, var19[var23.slot], var25);
- }
-
- var19[var23.slot] = var25;
- var5[var23.slot] = var23.field;
- }
- }
- }
-
- for(int var16 = 0; var16 < this.maxvar; ++var16) {
- if (var5[var16] != null) {
- var17.define(var5[var16], var16, var19[var16], this.maxpc);
- }
- }
-
- var17.write(var1, var3, var4);
- }
-
- public boolean empty() {
- return this.first == this.last;
- }
-
- public void listing(PrintStream var1) {
- var1.println("-- listing --");
-
- for(Object var2 = this.first; var2 != null; var2 = ((Instruction)var2).next) {
- var1.println(((Instruction)var2).toString());
- }
-
- }
-
- public Assembler() {
- this.last = this.first;
- }
- }
-