\r
analyzeFields(jc);\r
\r
- final org.apache.bcel.classfile.Method[] methods = jc.getMethods();\r
- for (int indexMethod = 0; indexMethod < methods.length; indexMethod++) {\r
- final Method method = methods[indexMethod];\r
- System.out.println(" Method:" + method.getName());\r
- final Code code = method.getCode();\r
- if (code == null) {\r
- continue;\r
- }\r
-\r
- final byte[] codes = code.getCode();\r
- for (int pc = 0; pc < codes.length; pc++) {\r
- final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]);\r
- short operands = Constants.NO_OF_OPERANDS[opcode];\r
- if (operands < 0) {\r
- System.out.println(" TODO negative value:"\r
- + Constants.OPCODE_NAMES[opcode] + ": "\r
- + operands);\r
- // break;\r
- }\r
+ analyzeMethods(jc);\r
\r
- switch (opcode) {\r
- case Constants.RETURN: {\r
- System.out.println(" " + pc + ": "\r
- + Constants.OPCODE_NAMES[opcode]);\r
- break;\r
- }\r
- case Constants.GETSTATIC: {\r
- System.out.println(" "\r
- + pc\r
- + ": "\r
- + Constants.OPCODE_NAMES[opcode]\r
- + ": "\r
- + JcfaUtil.getConstantFieldrefString(jc,\r
- codes[pc + 1], codes[pc + 2]));\r
- break;\r
- }\r
- case Constants.LDC: {\r
- System.out\r
- .println(" "\r
- + pc\r
- + ": "\r
- + Constants.OPCODE_NAMES[opcode]\r
- + ": "\r
- + JcfaUtil.getConstantString(jc,\r
- codes[pc + 1]));\r
- }\r
- break;\r
- case Constants.INVOKEVIRTUAL:\r
- case Constants.INVOKESPECIAL: {\r
- final int operand = JcfaUtil.byte2UnsignedShort(\r
- codes[pc + 1], codes[pc + 2]);\r
- System.out.println(" "\r
- + pc\r
- + ": "\r
- + Constants.OPCODE_NAMES[opcode]\r
- + ": "\r
- + JcfaUtil.getConstantMethodRefString(jc,\r
- operand));\r
- }\r
- break;\r
- case Constants.LOOKUPSWITCH:\r
- int result = JcfaUtil.byte2Int(codes[pc + 1],\r
- codes[pc + 2], codes[pc + 3], codes[pc + 4]);\r
- System.out\r
- .println(" TODO skipping bytes: " + (result));\r
-\r
- int lookupOp = pc + 5;\r
-\r
- short diff = JcfaUtil\r
- .byte2UnsignedByte(codes[lookupOp++]);\r
- System.out.println(" TODO skipping bytes: " + (diff));\r
-\r
- int loopCount = JcfaUtil.byte2Int(codes[lookupOp++],\r
- codes[lookupOp++], codes[lookupOp++],\r
- codes[lookupOp++]);\r
- for (int index = 0; index < loopCount; index++) {\r
- System.out.println(" "\r
- + JcfaUtil.byte2Int(codes[lookupOp++],\r
- codes[lookupOp++],\r
- codes[lookupOp++],\r
- codes[lookupOp++])\r
- + ":"\r
- + (JcfaUtil.byte2Int(codes[lookupOp++],\r
- codes[lookupOp++],\r
- codes[lookupOp++],\r
- codes[lookupOp++]) + pc));\r
- }\r
-\r
- short diff2 = JcfaUtil\r
- .byte2UnsignedByte(codes[lookupOp++]);\r
- System.out.println(" TODO skipping bytes: " + (diff2));\r
-\r
- operands += (lookupOp - pc);\r
-\r
- break;\r
- default: {\r
- System.out.println(" " + pc + ": "\r
- + Constants.OPCODE_NAMES[opcode] + " ("\r
- + operands + ")");\r
- }\r
- break;\r
- }\r
- pc += operands;\r
- }\r
- }\r
} catch (ClassFormatException e) {\r
e.printStackTrace();\r
} catch (IOException e) {\r
System.out.println(" " + field.getSignature());\r
}\r
}\r
+\r
+ private void analyzeMethods(final JavaClass jc) throws IOException {\r
+ final org.apache.bcel.classfile.Method[] methods = jc.getMethods();\r
+ for (int indexMethod = 0; indexMethod < methods.length; indexMethod++) {\r
+ final Method method = methods[indexMethod];\r
+ System.out.println(" Method:" + method.getName());\r
+ final Code code = method.getCode();\r
+ if (code == null) {\r
+ continue;\r
+ }\r
+\r
+ final byte[] codes = code.getCode();\r
+ for (int pc = 0; pc < codes.length; pc++) {\r
+ final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]);\r
+ short operands = Constants.NO_OF_OPERANDS[opcode];\r
+ if (operands < 0) {\r
+ System.out.println(" TODO negative value:"\r
+ + Constants.OPCODE_NAMES[opcode] + ": " + operands);\r
+ // break;\r
+ }\r
+\r
+ switch (opcode) {\r
+ case Constants.RETURN: {\r
+ System.out.println(" " + pc + ": "\r
+ + Constants.OPCODE_NAMES[opcode]);\r
+ break;\r
+ }\r
+ case Constants.GETSTATIC: {\r
+ System.out.println(" "\r
+ + pc\r
+ + ": "\r
+ + Constants.OPCODE_NAMES[opcode]\r
+ + ": "\r
+ + JcfaUtil.getConstantFieldrefString(jc,\r
+ codes[pc + 1], codes[pc + 2]));\r
+ break;\r
+ }\r
+ case Constants.LDC: {\r
+ System.out.println(" " + pc + ": "\r
+ + Constants.OPCODE_NAMES[opcode] + ": "\r
+ + JcfaUtil.getConstantString(jc, codes[pc + 1]));\r
+ }\r
+ break;\r
+ case Constants.INVOKEVIRTUAL:\r
+ case Constants.INVOKESPECIAL: {\r
+ final int operand = JcfaUtil.byte2UnsignedShort(\r
+ codes[pc + 1], codes[pc + 2]);\r
+ System.out.println(" " + pc + ": "\r
+ + Constants.OPCODE_NAMES[opcode] + ": "\r
+ + JcfaUtil.getConstantMethodRefString(jc, operand));\r
+ }\r
+ break;\r
+ case Constants.LOOKUPSWITCH:\r
+ int result = JcfaUtil.byte2Int(codes[pc + 1],\r
+ codes[pc + 2], codes[pc + 3], codes[pc + 4]);\r
+ System.out.println(" TODO skipping bytes: " + (result));\r
+\r
+ int lookupOp = pc + 5;\r
+\r
+ short diff = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]);\r
+ System.out.println(" TODO skipping bytes: " + (diff));\r
+\r
+ int loopCount = JcfaUtil.byte2Int(codes[lookupOp++],\r
+ codes[lookupOp++], codes[lookupOp++],\r
+ codes[lookupOp++]);\r
+ for (int index = 0; index < loopCount; index++) {\r
+ System.out.println(" "\r
+ + JcfaUtil.byte2Int(codes[lookupOp++],\r
+ codes[lookupOp++], codes[lookupOp++],\r
+ codes[lookupOp++])\r
+ + ":"\r
+ + (JcfaUtil.byte2Int(codes[lookupOp++],\r
+ codes[lookupOp++], codes[lookupOp++],\r
+ codes[lookupOp++]) + pc));\r
+ }\r
+\r
+ short diff2 = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]);\r
+ System.out.println(" TODO skipping bytes: " + (diff2));\r
+\r
+ operands += (lookupOp - pc);\r
+\r
+ break;\r
+ default: {\r
+ System.out.println(" " + pc + ": "\r
+ + Constants.OPCODE_NAMES[opcode] + " (" + operands\r
+ + ")");\r
+ }\r
+ break;\r
+ }\r
+ pc += operands;\r
+ }\r
+ }\r
+ }\r
}
\ No newline at end of file