in modules/swfutils/src/java/flash/swf/tools/AbcPrinter.java [1187:1474]
void printBodies()
{
long n = readU32();
printOffset();
out.println(n + " Method Bodies");
for (int i = 0; i < n; i++)
{
printOffset();
int start = offset;
int methodIndex = (int)readU32();
int maxStack = (int)readU32();
int localCount = (int)readU32();
int initScopeDepth = (int)readU32();
int maxScopeDepth = (int)readU32();
int codeLength = (int)readU32();
if (showByteCode)
{
for (int x = start; x < offset; x++)
{
out.print(hex(abc[(int)x]) + " ");
}
for (int x = offset - start; x < 7; x++)
{
out.print(" ");
}
}
if (abcEnd < codeLength + offset)
out.println(kAbcCorrupt);
MethodInfo mi = methods[methodIndex];
out.print(traitKinds[mi.kind] + " ");
out.print(mi.className + "::" + mi.name + "(");
for (int x = 0; x < mi.paramCount - 1; x++)
{
out.print(multiNameConstants[mi.params[x]].toString() + ", ");
}
if (mi.paramCount > 0)
out.print(multiNameConstants[mi.params[mi.paramCount - 1]].toString());
out.print("):");
out.println(multiNameConstants[mi.returnType].toString());
printOffset();
out.print("maxStack:" + maxStack + " localCount:" + localCount + " ");
out.println("initScopeDepth:" + initScopeDepth + " maxScopeDepth:" + maxScopeDepth);
LabelMgr labels = new LabelMgr();
int stopAt = codeLength + offset;
while (offset < stopAt)
{
String s = "";
start = offset;
printOffset();
int opcode = abc[offset++] & 0xFF;
if (opcode == OP_label || labels.hasLabelAt(offset - 1))
{
s = labels.getLabelAt(offset - 1) + ":";
while (s.length() < 4)
s += " ";
}
else
s = " ";
s += opNames[opcode];
s += opNames[opcode].length() < 8 ? "\t\t" : "\t";
switch (opcode)
{
case OP_debugfile:
case OP_pushstring:
s += '"' + stringConstants[(int)readU32()].replaceAll("\n","\\n").replaceAll("\t","\\t") + '"';
break;
case OP_pushnamespace:
s += namespaceConstants[(int)readU32()];
break;
case OP_pushint:
int k = intConstants[(int)readU32()];
s += k + "\t// 0x" + Integer.toHexString(k);
break;
case OP_pushuint:
long u = uintConstants[(int)readU32()];
s += u + "\t// 0x" + Long.toHexString(u);
break;
case OP_pushdouble:
int f = (int)readU32();
s += "floatConstant" + f;
break;
case OP_getsuper:
case OP_setsuper:
case OP_getproperty:
case OP_initproperty:
case OP_setproperty:
case OP_getlex:
case OP_findpropstrict:
case OP_findproperty:
case OP_finddef:
case OP_deleteproperty:
case OP_istype:
case OP_coerce:
case OP_astype:
case OP_getdescendants:
s += multiNameConstants[(int)readU32()];
break;
case OP_constructprop:
case OP_callproperty:
case OP_callproplex:
case OP_callsuper:
case OP_callsupervoid:
case OP_callpropvoid:
s += multiNameConstants[(int)readU32()];
s += " (" + readU32() + ")";
break;
case OP_newfunction:
int method_id = (int)readU32();
s += methods[method_id].name;
// abc.methods[method_id].anon = true (do later?)
break;
case OP_callstatic:
s += methods[(int)readU32()].name;
s += " (" + readU32() + ")";
break;
case OP_newclass:
s += instanceNames[(int)readU32()];
break;
case OP_lookupswitch:
int pos = offset - 1;
int target = pos + readS24();
int maxindex = (int)readU32();
s += "default:" + labels.getLabelAt(target); // target + "("+(target-pos)+")"
s += " maxcase:" + Integer.toString(maxindex);
for (int m = 0; m <= maxindex; m++)
{
target = pos + readS24();
s += " " + labels.getLabelAt(target); // target + "("+(target-pos)+")"
}
break;
case OP_jump:
case OP_iftrue: case OP_iffalse:
case OP_ifeq: case OP_ifne:
case OP_ifge: case OP_ifnge:
case OP_ifgt: case OP_ifngt:
case OP_ifle: case OP_ifnle:
case OP_iflt: case OP_ifnlt:
case OP_ifstricteq: case OP_ifstrictne:
int delta = readS24();
int targ = offset + delta;
//s += target + " ("+offset+")"
s += labels.getLabelAt(targ);
if (!(labels.hasLabelAt(offset)))
s += "\n";
break;
case OP_inclocal:
case OP_declocal:
case OP_inclocal_i:
case OP_declocal_i:
case OP_getlocal:
case OP_kill:
case OP_setlocal:
case OP_debugline:
case OP_getglobalslot:
case OP_getslot:
case OP_setglobalslot:
case OP_setslot:
case OP_pushshort:
case OP_newcatch:
s += readU32();
break;
case OP_debug:
s += Integer.toString(abc[offset++] & 0xFF);
s += " " + readU32();
s += " " + Integer.toString(abc[offset++] & 0xFF);
s += " " + readU32();
break;
case OP_newobject:
s += "{" + readU32() + "}";
break;
case OP_newarray:
s += "[" + readU32() + "]";
break;
case OP_call:
case OP_construct:
case OP_constructsuper:
s += "(" + readU32() + ")";
break;
case OP_pushbyte:
case OP_getscopeobject:
s += abc[offset++];
break;
case OP_hasnext2:
s += readU32() + " " + readU32();
default:
/*if (opNames[opcode] == ("0x"+opcode.toString(16).toUpperCase()))
s += " UNKNOWN OPCODE"*/
break;
}
if (showByteCode)
{
for (int x = start; x < offset; x++)
{
out.print(hex(abc[(int)x]) + " ");
}
for (int x = offset - start; x < 7; x++)
{
out.print(" ");
}
}
out.println(s);
}
int exCount = (int)readU32();
printOffset();
out.println(exCount + " Extras");
for (int j = 0; j < exCount; j++)
{
start = offset;
printOffset();
int from = (int)readU32();
int to = (int)readU32();
int target = (int)readU32();
int typeIndex = (int)readU32();
int nameIndex = (int)readU32();
if (showByteCode)
{
for (int x = start; x < offset; x++)
{
out.print(hex(abc[(int)x]) + " ");
}
}
out.print(multiNameConstants[nameIndex] + " ");
out.print("type:" + multiNameConstants[typeIndex] + " from:" + from + " ");
out.println("to:" + to + " target:" + target);
}
int numTraits = (int)readU32(); // number of traits
printOffset();
out.println(numTraits + " Traits Entries");
if (numTraits > abcEnd - offset)
out.println(kAbcCorrupt);
for (int j = 0; j < numTraits; j++)
{
printOffset();
start = offset;
String s = multiNameConstants[(int)readU32()].toString(); // eat trait name;
int b = abc[offset++];
int kind = b & 0xf;
switch (kind)
{
case 0x00: // slot
case 0x06: // const
readU32(); // id
readU32(); // type
int index = (int)readU32(); // index;
if (index != 0)
offset++; // kind
break;
case 0x04: // class
readU32(); // id
readU32(); // value;
break;
case 0x01:
case 0x02:
case 0x03:
case 0x05:
readU32(); // id
readU32(); // method
break;
default:
out.println(kAbcCorrupt);
}
if ((b >> 4 & 0x4) == 0x4)
{
int val = (int)readU32(); // metadata count
for (int k = 0; k < val; k++)
{
long index = readU32(); // metadata
if (index > numMetadata)
out.println(kAbcCorrupt);
}
}
if (showByteCode)
{
for (int x = start; x < offset; x++)
{
out.print(hex(abc[(int)x]) + " ");
}
}
out.println(s);
}
out.println("");
}
}