void printBodies()

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("");
        }
    }