//------------------------------------------------ //--- 010 Editor v5.0 Binary Template // // File: CLASSAdv.bt // Authors: Pishchik Ilya L. (RUS) // Version: 1.1 // Purpose: A template for parsing Java Class (JVM) Files. // Includes visualizing bytecode. // Category: Programming // File Mask: *.class // ID Bytes: CA FE BA BE // History: // 1.1 2016-02-12 SweetScape Software: Updated header for repository submission. // 1.0 Pishchik Ilya: Initial release. // // You can get the document from the Java // Pages http://docs.oracle.com/javase/specs/jvms/se7/html/ //------------------------------------------------ BigEndian(); typedef ubyte u1; typedef uint16 u2; typedef uint32 u4; typedef uint64 u8; typedef byte i1; typedef int16 i2; typedef int32 i4; enum Constant_pool { CONSTANT_Class=7, CONSTANT_Fieldref=9, CONSTANT_Methodref=10, CONSTANT_InterfaceMethodref=11, CONSTANT_String=8, CONSTANT_Integer=3, CONSTANT_Float=4, CONSTANT_Long=5, CONSTANT_Double=6, CONSTANT_NameAndType=12, CONSTANT_Utf8=1, CONSTANT_MethodHandle=15, CONSTANT_MethodType=16, CONSTANT_InvokeDynamic=18 }; enum access_property_flags { ACC_PUBLIC=0x0001, ACC_PRIVATE=0x0002, ACC_PROTECTED=0x0004, ACC_STATIC=0x0008, ACC_FINAL=0x0010, ACC_SUPER_ACC_SYNCHRONIZED=0x0020, ACC_BRIDGE_ACC_VOLATILE=0x0040, ACC_VARARGS_ACC_TRANSIENT=0x0080, ACC_NATIVE=0x0100, ACC_INTERFACE=0x0200, ACC_ABSTRACT=0x0400, ACC_STRICT=0x0800, ACC_SYNTHETIC=0x1000, ACC_ANNOTATION=0x2000, ACC_ENUM=0x4000 }; enum enum_type { Class, Method, Field, Nested_Class }; enum enum_opcodes { nop=0x00, aconst_null=0x01, iconst_m1=0x02, iconst_0=0x03, iconst_1=0x04, iconst_2=0x05, iconst_3=0x06, iconst_4=0x07, iconst_5=0x08, lconst_0=0x09, lconst_1=0x0a, fconst_0=0x0b, fconst_1=0x0c, fconst_2=0x0d, dconst_0=0x0e, dconst_1=0x0f, bipush=0x10, sipush=0x11, ldc=0x12, ldc_w=0x13, ldc2_w=0x14, iload=0x15, lload=0x16, fload=0x17, dload=0x18, aload=0x19, iload_0=0x1a, iload_1=0x1b, iload_2=0x1c, iload_3=0x1d, lload_0=0x1e, lload_1=0x1f, lload_2=0x20, lload_3=0x21, fload_0=0x22, fload_1=0x23, fload_2=0x24, fload_3=0x25, dload_0=0x26, dload_1=0x27, dload_2=0x28, dload_3=0x29, aload_0=0x2a, aload_1=0x2b, aload_2=0x2c, aload_3=0x2d, iaload=0x2e, laload=0x2f, faload=0x30, daload=0x31, aaload=0x32, baload=0x33, caload=0x34, saload=0x35, istore=0x36, lstore=0x37, fstore=0x38, dstore=0x39, astore=0x3a, istore_0=0x3b, istore_1=0x3c, istore_2=0x3d, istore_3=0x3e, lstore_0=0x3f, lstore_1=0x40, lstore_2=0x41, lstore_3=0x42, fstore_0=0x43, fstore_1=0x44, fstore_2=0x45, fstore_3=0x46, dstore_0=0x47, dstore_1=0x48, dstore_2=0x49, dstore_3=0x4a, astore_0=0x4b, astore_1=0x4c, astore_2=0x4d, astore_3=0x4e, iastore=0x4f, lastore=0x50, fastore=0x51, dastore=0x52, aastore=0x53, bastore=0x54, castore=0x55, sastore=0x56, pop=0x57, pop2=0x58, dup=0x59, dup_x1=0x5a, dup_x2=0x5b, dup2=0x5c, dup2_x1=0x5d, dup2_x2=0x5e, swap=0x5f, iadd=0x60, ladd=0x61, fadd=0x62, dadd=0x63, isub=0x64, lsub=0x65, fsub=0x66, dsub=0x67, imul=0x68, lmul=0x69, fmul=0x6a, dmul=0x6b, idiv=0x6c, ldiv=0x6d, fdiv=0x6e, ddiv=0x6f, irem=0x70, lrem=0x71, frem=0x72, drem=0x73, ineg=0x74, lneg=0x75, fneg=0x76, dneg=0x77, ishl=0x78, lshl=0x79, ishr=0x7a, lshr=0x7b, iushr=0x7c, lushr=0x7d, iand=0x7e, land=0x7f, ior=0x80, lor=0x81, ixor=0x82, lxor=0x83, iinc=0x84, i2l=0x85, i2f=0x86, i2d=0x87, l2i=0x88, l2f=0x89, l2d=0x8a, f2i=0x8b, f2l=0x8c, f2d=0x8d, d2i=0x8e, d2l=0x8f, d2f=0x90, i2b=0x91, i2c=0x92, i2s=0x93, lcmp=0x94, fcmpl=0x95, fcmpg=0x96, dcmpl=0x97, dcmpg=0x98, ifeq=0x99, ifne=0x9a, iflt=0x9b, ifge=0x9c, ifgt=0x9d, ifle=0x9e, if_icmpeq=0x9f, if_icmpne=0xa0, if_icmplt=0xa1, if_icmpge=0xa2, if_icmpgt=0xa3, if_icmple=0xa4, if_acmpeq=0xa5, if_acmpne=0xa6, goto=0xa7, jsr=0xa8, ret=0xa9, tableswitch=0xaa, lookupswitch=0xab, ireturn=0xac, lreturn=0xad, freturn=0xae, dreturn=0xaf, areturn=0xb0, Return=0xb1, getstatic=0xb2, putstatic=0xb3, getfield=0xb4, putfield=0xb5, invokevirtual=0xb6, invokespecial=0xb7, invokestatic=0xb8, invokeinterface=0xb9, invokedynamic=0xba, new=0xbb, newarray=0xbc, anewarray=0xbd, arraylength=0xbe, athrow=0xbf, checkcast=0xc0, instanceof=0xc1, monitorenter=0xc2, monitorexit=0xc3, wide=0xc4, multianewarray=0xc5, ifnull=0xc6, ifnonnull=0xc7, goto_w=0xc8, jsr_w=0xc9, breakpoint=0xca, impdep1=0xfe, impdep2=0xff }; enum enum_array_type { no_body=0, index_body=1, index_const_body=2, sipush_body=3, bipush_body=4, newarray_body=5, indexbyte_1_2_body=6, branchbyte1_2_body=7, branchbyte1_4_body=8, invokeinterface_body=9, invokedynamic_body=10, multianewarray_body=11, wide_body=12, tableswitch_body=13, lookupswitch_body=14, index_v2_body=15 }; enum enum_opcodes_body_type { T_BOOLEAN=4, T_CHAR=5, T_FLOAT=6, T_DOUBLE=7, T_BYTE=8, T_SHORT=9, T_INT=10, T_LONG=11 }; const u4 address_constant_pool=0xA; const u4 address_constant_pool_count=0x8; const u2 constant_pool_count=ReadUShort(address_constant_pool_count)-1; local u8 map_address_constant_pool[constant_pool_count]; local u1 array_opcodes_body_type[256]; array_opcodes_body_type[tableswitch]=tableswitch_body;//170 array_opcodes_body_type[lookupswitch]=lookupswitch_body;//171 array_opcodes_body_type[bipush]=bipush_body; //16 +byte array_opcodes_body_type[iload]=index_body; //21 +index array_opcodes_body_type[lload]=index_body; //22 +index array_opcodes_body_type[fload]=index_body; //23 +index array_opcodes_body_type[dload]=index_body; //24 +index array_opcodes_body_type[aload]=index_body; //25 +index array_opcodes_body_type[istore]=index_body; //54 +index array_opcodes_body_type[lstore]=index_body; //55 +index array_opcodes_body_type[fstore]=index_body; //56 +index array_opcodes_body_type[dstore]=index_body; //57 +index array_opcodes_body_type[astore]=index_body; //58 +index array_opcodes_body_type[sipush]=sipush_body; //17 +byte1,byte2 array_opcodes_body_type[ldc]=index_v2_body; //18 +index array_opcodes_body_type[ldc_w]=indexbyte_1_2_body; //19 +indexbyte1,indexbyte2 array_opcodes_body_type[ldc2_w]=indexbyte_1_2_body;//20 +indexbyte1,indexbyte2 array_opcodes_body_type[iinc]=index_const_body; //132 +index,const array_opcodes_body_type[ifeq]=branchbyte1_2_body; //153 +branchbyte1,branchbyte2 array_opcodes_body_type[ifne]=branchbyte1_2_body; //154 +branchbyte1,branchbyte2 array_opcodes_body_type[iflt]=branchbyte1_2_body; //155 +branchbyte1,branchbyte2 array_opcodes_body_type[ifge]=branchbyte1_2_body; //156 +branchbyte1,branchbyte2 array_opcodes_body_type[ifgt]=branchbyte1_2_body; //157 +branchbyte1,branchbyte2 array_opcodes_body_type[ifle]=branchbyte1_2_body; //158 +branchbyte1,branchbyte2 array_opcodes_body_type[if_icmpeq]=branchbyte1_2_body; //159 +branchbyte1,branchbyte2 array_opcodes_body_type[if_icmpne]=branchbyte1_2_body; //160 +branchbyte1,branchbyte2 array_opcodes_body_type[if_icmplt]=branchbyte1_2_body; //161 +branchbyte1,branchbyte2 array_opcodes_body_type[if_icmpge]=branchbyte1_2_body; //162 +branchbyte1,branchbyte2 array_opcodes_body_type[if_icmpgt]=branchbyte1_2_body; //163 +branchbyte1,branchbyte2 array_opcodes_body_type[if_icmple]=branchbyte1_2_body; //164 +branchbyte1,branchbyte2 array_opcodes_body_type[if_acmpeq]=branchbyte1_2_body; //165 +branchbyte1,branchbyte2 array_opcodes_body_type[if_acmpne]=branchbyte1_2_body; //166 +branchbyte1,branchbyte2 array_opcodes_body_type[goto]=branchbyte1_2_body; //167 +branchbyte1,branchbyte2 array_opcodes_body_type[jsr]=branchbyte1_2_body; //168 +branchbyte1,branchbyte2 array_opcodes_body_type[ret]=index_body;//169 +index array_opcodes_body_type[getstatic]=indexbyte_1_2_body; //178 +indexbyte1,indexbyte2 array_opcodes_body_type[putstatic]=indexbyte_1_2_body; //179 +indexbyte1,indexbyte2 array_opcodes_body_type[getfield]=indexbyte_1_2_body; //180 +indexbyte1,indexbyte2 array_opcodes_body_type[putfield]=indexbyte_1_2_body; //181 +indexbyte1,indexbyte2 array_opcodes_body_type[new]=indexbyte_1_2_body; //187 +indexbyte1,indexbyte2 array_opcodes_body_type[newarray]=newarray_body; //188 +atype array_opcodes_body_type[invokevirtual]=indexbyte_1_2_body; //182 +indexbyte1,indexbyte2 array_opcodes_body_type[invokespecial]=indexbyte_1_2_body; //183 +indexbyte1,indexbyte2 array_opcodes_body_type[invokestatic]=indexbyte_1_2_body; //184 +indexbyte1,indexbyte2 array_opcodes_body_type[anewarray]=indexbyte_1_2_body; //189 +indexbyte1,indexbyte2 array_opcodes_body_type[checkcast]=indexbyte_1_2_body; //192 +indexbyte1,indexbyte2 array_opcodes_body_type[instanceof]=indexbyte_1_2_body; //193 +indexbyte1,indexbyte2 array_opcodes_body_type[wide]=wide_body; //196 (iload,fload,aload,lload,dload,istore,fstore,astore,lstore,dstore,ret),indexbyte1,indexbyte2 or iinc,indexbyte1,indexbyte2,constbyte1,constbyte2 array_opcodes_body_type[multianewarray]=multianewarray_body; //197 indexbyte1,indexbyte2,dimensions array_opcodes_body_type[ifnull]=branchbyte1_2_body; //198 +branchbyte1,branchbyte2 array_opcodes_body_type[ifnonnull]=branchbyte1_2_body; //199 +branchbyte1,branchbyte2 array_opcodes_body_type[invokeinterface]=invokeinterface_body; //185 +indexbyte1,indexbyte2,count,0 array_opcodes_body_type[invokedynamic]=invokedynamic_body; //186 +indexbyte1,indexbyte2,0,0 array_opcodes_body_type[goto_w]=branchbyte1_4_body;//200 +branchbyte1,branchbyte2,branchbyte3,branchbyte4 array_opcodes_body_type[jsr_w]=branchbyte1_4_body; //201 +branchbyte1,branchbyte2,branchbyte3,branchbyte4 /* +ConstantValue OK +Code OK +StackMapTable OK! +Exceptions OK +InnerClasses OK +EnclosingMethod OK +Synthetic OK +Signature OK +SourceFile OK +SourceDebugExtension +LineNumberTable OK +LocalVariableTable OK +LocalVariableTypeTable ? +Deprecated OK +RuntimeVisibleAnnotations OK +RuntimeInvisibleAnnotations OK +RuntimeVisibleParameterAnnotations OK +RuntimeInvisibleParameterAnnotations OK +AnnotationDefault OK +BootstrapMethods*/ struct element_value; typedef struct{ u2 type_index; u2 num_element_value_pairs; if(0; element_value value; }element_value_pairs[num_element_value_pairs]; } }annotation; typedef struct{ u1 tag; if(tag=='e') { struct{ u2 type_name_index; u2 const_name_index; }enum_const_value; } else if(tag=='c') { u2 class_info_index; } else if(tag=='@') { annotation annotation_value; } else if(tag=='[') { struct{ u2 num_values; element_value values[num_values]; }array_value; } else { //B,C,D,F,I,J,S Z,or s. u2 const_value_index; } }element_value; typedef struct{ u1 tag; /*Top_variable_info 0 Integer_variable_info 1 Float_variable_info 2 Double_variable_info 3 Long_variable_info 4 Null_variable_info 5 UninitializedThis_variable_info 6*/ if(tag==7) { //Object_variable_info 7 u2 cpool_index; } else if(tag==8) { //Uninitialized_variable_info//Object_variable_info 7 8 u2 offset; } }verification_type_info; typedef struct{ u1 frame_type;//same_frame if(frame_type>=64&&frame_type<=127) { //same_locals_1_stack_item_frame verification_type_info stack[1]; } else if(frame_type==247) { //same_locals_1_stack_item_frame_extended u2 offset_delta; verification_type_info stack[1]; } else if(frame_type>=248&&frame_type<=251) { //chop_frame or same_frame_extended u2 offset_delta; } else if(frame_type>=252&&frame_type<=254) { //append_frame u2 offset_delta; verification_type_info locals[frame_type - 251]; } else if(frame_type==255) { //full_frame u2 offset_delta; u2 number_of_locals; if(0; u2 number_of_stack_items; if(0; } }stack_map_frame; typedef struct(int hidden,u8 offsets){ if(exists(hidden)) { u1 operation; switch(array_opcodes_body_type[operation]) { case index_body: case index_v2_body: u1 index; break; case index_const_body: u1 index; i1 _const; break; case sipush_body: u2 _byte; //byte1,byte2; break; case bipush_body: u1 _byte; break; case newarray_body: u1 atype; break; case multianewarray_body: u2 indexbyte; //indexbyte1,indexbyte2; u1 dimensions; break; case wide_body: u1 operation2; u2 indexbyte; //indexbyte1,indexbyte2; if(operation2==iinc) { u2 constbyte; //constbyte1,constbyte2; } break; case tableswitch_body: local u4 len=4-(offsets+1)%4; if(len<4) u1 byte_pad[len]; i4 defaultbyte; //defaultbyte1,defaultbyte2,defaultbyte3,defaultbyte4 i4 lowbyte; //lowbyte1,lowbyte2,lowbyte3,lowbyte4 i4 highbyte; //highbyte1,highbyte2,highbyte3,highbyte4 u4 jump[highbyte-lowbyte+1]; break; case lookupswitch_body: local u4 len=4-(offsets+1)%4; if(len<4)u1 byte_pad[len]; i4 defaultbyte; //defaultbyte1,defaultbyte2,defaultbyte3,defaultbyte4 i4 npairs; //npairs1,npairs2,npairs3,npairs4 struct { i4 match; i4 offset; }match_offset[npairs]; break; case indexbyte_1_2_body: u2 indexbyte; //indexbyte1,indexbyte2; break; case branchbyte1_2_body: i2 branchbyte; //indexbyte1,indexbyte2; break; case branchbyte1_4_body: i4 branchbyte; //branchbyte1,branchbyte2,branchbyte3,branchbyte4 break; case invokeinterface_body: u2 indexbyte; //indexbyte1,indexbyte2; u1 _count; u1 zero; break; case invokedynamic_body: u2 indexbyte; //indexbyte1,indexbyte2; u1 zero; u1 zero; break; default: break; } } }opcodes_operation; struct attribute_info; typedef struct{ u2 attribute_name_index; u4 attribute_length; local string attribute_name=get_constant_pool_Utf8(attribute_name_index); if(attribute_name=="ConstantValue") { u2 constantvalue_index ; } else if(attribute_name=="Code") { u2 max_stack; u2 max_locals; u4 code_length; //u1 code[code_length]; struct { local u8 begin_address=FTell(); local u8 current_address=FTell(); local u8 end_address=begin_address+code_length; local u4 i; local u8 Len; while( FTell() < end_address) { opcodes_operation operation(0,current_address-begin_address); Len=FTell()-current_address-1; FSkip(-Len); for(i=0;i; } current_address=FTell(); } }code; u2 exception_table_length; if(exception_table_length>0) { struct { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; }exception_table[exception_table_length]; } u2 attributes_count; if(attributes_count>0)attribute_info attributes[attributes_count]; } else if(attribute_name=="Exceptions") { u2 number_of_exceptions; u2 exception_index_table[number_of_exceptions]; } else if(attribute_name=="LineNumberTable") { u2 line_number_table_length; struct{ u2 start_pc; u2 line_number; }line_number_table[line_number_table_length] ; } else if(attribute_name=="LocalVariableTable") { u2 local_variable_table_length; struct LocalVariableTable_struct{ u2 start_pc; u2 length; u2 name_index; u2 descriptor_index; u2 index; }local_variable_table[local_variable_table_length] ; } else if(attribute_name=="LocalVariableTypeTable") { u2 local_variable_type_table_length; struct{ u2 start_pc; u2 length; u2 name_index; u2 signature_index; u2 index; }local_variable_type_table[local_variable_type_table_length]; } else if(attribute_name=="SourceFile") { u2 sourcefile_index; } else if(attribute_name=="InnerClasses") { u2 number_of_classes; struct InnerClasses_struct{ u2 inner_class_info_index; u2 outer_class_info_index; u2 inner_name_index; u2 inner_class_access_flags; }classes[number_of_classes] ; } else if(attribute_name=="EnclosingMethod") { u2 class_index; u2 method_index; } else if(attribute_name=="Signature") { u2 signature_index; } else if(attribute_name=="SourceDebugExtension") { u1 debug_extension[attribute_length] ; } else if(attribute_name=="RuntimeVisibleAnnotations"||attribute_name=="RuntimeInvisibleAnnotations") { u2 num_annotations; annotation annotations[num_annotations]; } else if(attribute_name=="RuntimeVisibleParameterAnnotations"||attribute_name=="RuntimeInvisibleParameterAnnotations") { u1 num_parameters; struct{ u2 num_annotations; annotation annotations[num_annotations]; }parameter_annotations[num_parameters]; } else if(attribute_name=="AnnotationDefault") { element_value default_value; } else if(attribute_name=="BootstrapMethods") { u2 num_bootstrap_methods; struct{ u2 bootstrap_method_ref; u2 num_bootstrap_arguments; u2 bootstrap_arguments[num_bootstrap_arguments]; }bootstrap_methods[num_bootstrap_methods]; } else if(attribute_name=="StackMapTable") { u2 number_of_entries; stack_map_frame entries[number_of_entries]; } else { if(attribute_length>0) u1 info[attribute_length] ; } }attribute_info ; typedef struct { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; if(0; } }field_info ; typedef struct{ u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; if(0; } }method_info ; typedef struct{ if(sizeof(this)>1) { u1 tag; switch(tag) { case CONSTANT_Class: u2 name_index; break; case CONSTANT_Fieldref: case CONSTANT_Methodref: case CONSTANT_InterfaceMethodref: u2 class_index; u2 name_and_type_index; break; case CONSTANT_String: u2 string_index; break; case CONSTANT_Integer: case CONSTANT_Float: u4 bytes; break; case CONSTANT_Long: case CONSTANT_Double: u4 high_bytes; u4 low_bytes; break; case CONSTANT_NameAndType: u2 name_index; u2 descriptor_index; break; case CONSTANT_Utf8: u2 length; if(length>0) { u1 bytes[length]; } break; case CONSTANT_MethodHandle: u1 reference_kind; u2 reference_index; break; case CONSTANT_MethodType: u2 descriptor_index; break; case CONSTANT_InvokeDynamic: u2 bootstrap_method_attr_index; u2 name_and_type_index; break; default: Warning("fix cp_info"); break; } } }cp_info; typedef struct { u4 magic ; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags ; u2 this_class ; u2 super_class ; u2 interfaces_count; if(0; } u2 fields_count; if(0; } u2 methods_count; if(0; } u2 attributes_count; if(0; } }ClassFile; //main void generator_map_address_constant_pool() { local u8 address=address_constant_pool; local u1 tag; local int i; for(i = 0; i =0&&obj.frame_type<=63) { return "same_frame"; } else if(obj.frame_type>=64&&obj.frame_type<=127) { return "same_locals_1_stack_item_frame"; } else if(obj.frame_type==247) { return "same_locals_1_stack_item_frame_extended"; } else if(obj.frame_type>=248&&obj.frame_type<=251) { return "chop_frame or same_frame_extended"; } else if(obj.frame_type>=252&&obj.frame_type<=254) { return "append_frame"; } else if(obj.frame_type==255) { return "full_frame"; } } string annotation_OnComment(annotation &obj) { return get_constant_pool_Utf8(obj.type_index); } string Name_OnComment(u2 n) { return get_constant_pool_Utf8(n); } string Name_Exception_OnComment(u2 n) { if(n==0)return "any"; return get_constant_pool_Utf8(n); } string element_value_OnComment(element_value &obj) { switch(obj.tag) { case 's': return "String"; break; case 'e': return "enum"; break; case 'c': return "class"; break; case '@': return "annotation type"; break; case '[': return "array"; break; default: return ""; break; } } string opcodes_operation_OnComment(opcodes_operation &obj) { if(!exists(obj.operation))return ""; string str; string str2; enum_opcodes obj_operation=obj.operation; switch(array_opcodes_body_type[obj.operation]) { case index_body: SPrintf(str," %d",obj.index); break; case index_v2_body: str=" "+get_constant_pool_Utf8(obj.index); break; case index_const_body: SPrintf(str," %d",obj.index); SPrintf(str2," %d",obj._const); str=str+" by"+str2; break; case sipush_body: SPrintf(str," %d",obj._byte); break; case bipush_body: SPrintf(str," %d",obj._byte); break; case newarray_body: switch(obj.atype) { case T_BOOLEAN: str=" boolean"; break; case T_CHAR: str=" char"; break; case T_FLOAT: str=" float"; break; case T_DOUBLE: str=" double"; break; case T_BYTE: str=" byte"; break; case T_SHORT: str=" short"; break; case T_INT: str=" int"; break; case T_LONG: str=" long"; break; default: Warning("fix opcodes_operation_OnComment"); break; } break; case multianewarray_body: SPrintf(str,"%d",obj.dimensions); str=" "+get_constant_pool_Utf8(obj.indexbyte)+" dimensions "+str; break; case wide_body: enum_opcodes obj_operation2=obj.operation2; str=" "+EnumToString(obj_operation2)+get_constant_pool_Utf8(obj.indexbyte); if(obj_operation2==iinc) { SPrintf(str2,"%d",obj.constbyte); str=str+" by "+str2; } break; case tableswitch_body: SPrintf(str,"%d",obj.lowbyte); SPrintf(str2,"%d",obj.highbyte); str=" "+str+" to "+str2; break; case lookupswitch_body: SPrintf(str,"%d",obj.npairs); str=" "+str; break; case invokedynamic_body: case indexbyte_1_2_body: str=" "+get_constant_pool_Utf8(obj.indexbyte); break; case branchbyte1_2_body: case branchbyte1_4_body: SPrintf(str," %d",obj.branchbyte); break; case invokeinterface_body: SPrintf(str," %d",obj._count); str=" "+get_constant_pool_Utf8(obj.indexbyte)+" count "+str; break; default: break; } return EnumToString(obj_operation)+str; } generator_map_address_constant_pool(); ClassFile classFile;