home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.debug;
-
- import sun.tools.java.RuntimeConstants;
- import sun.tools.util.UnboundedArrayOfInt;
-
- class FlowTracer implements RuntimeConstants {
- private final Agent agent;
- private final Class clazz;
- private final int lineNumber;
- private final int IN_LINE = 1;
- private final int FLOW_OUT = 2;
- private final int RETURN = 3;
- private final boolean debug = true;
- private UnboundedArrayOfInt map = new UnboundedArrayOfInt();
-
- FlowTracer(int var1, Agent var2, Class var3, int var4) {
- this.agent = var2;
- this.clazz = var3;
- this.lineNumber = var4;
- this.trace(var1);
- }
-
- FlowTracer(int var1, Agent var2) {
- this.agent = var2;
- this.clazz = null;
- this.lineNumber = 0;
- this.trace(var1);
- }
-
- // $FF: renamed from: at (int) int
- private final int method_0(int var1) {
- return this.agent.peekSafely(var1);
- }
-
- private final int shortAt(int var1) {
- return this.method_0(var1) << 8 | this.method_0(var1 + 1);
- }
-
- private final int intAt(int var1) {
- return this.method_0(var1) << 24 | this.method_0(var1 + 1) << 16 | this.method_0(var1 + 2) << 8 | this.method_0(var1 + 3);
- }
-
- private final int entryAt(int var1, int var2) {
- int var3 = var1 + (var2 << 2);
- return this.intAt(var3);
- }
-
- int[] exitPoints() {
- return this.points(2);
- }
-
- int[] returnPoints() {
- return this.points(3);
- }
-
- private int[] points(int var1) {
- int var2 = 0;
-
- for(int var3 = this.map.getFirstIndex(); var3 <= this.map.getLastIndex(); ++var3) {
- int var4 = this.map.at(var3);
- if (var4 == var1) {
- ++var2;
- }
- }
-
- int[] var8 = new int[var2];
- int var5 = 0;
-
- for(int var6 = this.map.getFirstIndex(); var6 <= this.map.getLastIndex(); ++var6) {
- int var7 = this.map.at(var6);
- if (var7 == var1) {
- var8[var5++] = var6;
- }
- }
-
- return var8;
- }
-
- private void setMapping(int var1, int var2) {
- this.map.setAt(var1, var2);
- int var3 = this.method_0(var1);
- Agent.message((var2 == 2 ? " out: " : (var2 == 1 ? " in: " : " ret: ")) + var1 + ": " + (var3 <= 202 ? RuntimeConstants.opcNames[var3] : "[" + var3 + "]"));
- }
-
- private void trace(int var1) {
- int var2 = var1;
-
- while(this.map.at(var2) == 0) {
- label69: {
- boolean var10000;
- if (this.clazz == null) {
- if (var2 != var1) {
- break label69;
- }
-
- var10000 = false;
- } else {
- if (this.agent.pc2lineno(this.clazz, var2) != this.lineNumber) {
- break label69;
- }
-
- var10000 = false;
- }
-
- if (!var10000) {
- this.setMapping(var2, 1);
- int var3 = this.method_0(var2);
- switch (var3) {
- 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:
- int var13 = var2 + (short)this.shortAt(var2 + 1);
- this.trace(var13);
- var2 += 3;
- continue;
- case 167:
- var2 += (short)this.shortAt(var2 + 1);
- continue;
- case 169:
- this.setMapping(var2, 3);
- return;
- case 170:
- int var11 = var2 + 1 + 3 & -4;
- int var14 = this.entryAt(var11, 0);
- int var15 = this.entryAt(var11, 1);
- int var16 = this.entryAt(var11, 2);
- var11 += 12;
-
- for(int var8 = var15; var8 <= var16; ++var8) {
- this.trace(var2 + this.entryAt(var11, var8 - var15));
- }
-
- var2 += var14;
- continue;
- case 171:
- int var4 = var2 + 1 + 3 & -4;
- int var5 = this.entryAt(var4, 0);
- int var6 = this.entryAt(var4, 1) * 2;
- var4 += 8;
-
- for(int var7 = 0; var7 < var6; var7 += 2) {
- this.trace(var2 + this.entryAt(var4, var7 + 1));
- }
-
- var2 += var5;
- continue;
- case 172:
- case 173:
- case 174:
- case 175:
- case 176:
- case 177:
- this.setMapping(var2, 3);
- return;
- case 196:
- var3 = this.method_0(var2 + 1);
- switch (var3) {
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- var2 += 4;
- continue;
- case 132:
- var2 += 6;
- continue;
- case 169:
- this.setMapping(var2, 3);
- return;
- default:
- throw new IllegalArgumentException("PANIC: Invalid opcode");
- }
- case 200:
- var2 += this.intAt(var2 + 1);
- continue;
- default:
- if (var3 >= 203) {
- if (var3 > 228) {
- throw new IllegalArgumentException("PANIC: Invalid opcode");
- }
-
- switch (var3) {
- case 203:
- var2 += 2;
- continue;
- case 218:
- var2 += 5;
- continue;
- case 223:
- var2 += 4;
- continue;
- default:
- var2 += 3;
- }
- } else {
- var2 += RuntimeConstants.opcLengths[var3];
- }
- continue;
- }
- }
- }
-
- this.setMapping(var2, 2);
- return;
- }
-
- }
- }
-