OSDN Git Service

save
authoriga <tosiki.iga@nifty.ne.jp>
Tue, 1 Apr 2014 14:06:55 +0000 (23:06 +0900)
committeriga <tosiki.iga@nifty.ne.jp>
Tue, 1 Apr 2014 14:06:55 +0000 (23:06 +0900)
jcfa/src/jp/igapyon/jcfa/JavaClassFileAnalyzer.java
jcfa/testJavaClass/output/test/TestJavaClass031.jcfa

index 0f1477c..cfcbdb0 100644 (file)
@@ -174,68 +174,79 @@ public class JavaClassFileAnalyzer {
 \r
                final byte[] codes = code.getCode();\r
                for (int pc = 0; pc < codes.length; pc++) {\r
-                       final JcfaCode jcfaCode = new JcfaCode();\r
-                       jcfaMethod.getCodeList().add(jcfaCode);\r
-                       jcfaCode.setJavaClass(jc);\r
-\r
-                       jcfaCode.setOpcode(JcfaUtil.byte2UnsignedByte(codes[pc]));\r
-                       jcfaCode.getComment()\r
-                                       .getCommentList()\r
-                                       .add("" + pc + ": "\r
-                                                       + Constants.OPCODE_NAMES[jcfaCode.getOpcode()]);\r
-\r
-                       short operands = Constants.NO_OF_OPERANDS[jcfaCode.getOpcode()];\r
+                       final int operands = analyzeCodes(jc, method, jcfaClass,\r
+                                       jcfaMethod, pc, codes);\r
                        if (operands < 0) {\r
-                               jcfaCode.getComment()\r
-                                               .getCommentList()\r
-                                               .add("TODO negative value:"\r
-                                                               + Constants.OPCODE_NAMES[jcfaCode.getOpcode()]\r
-                                                               + ": " + operands);\r
                                break;\r
                        }\r
 \r
-                       switch (jcfaCode.getOpcode()) {\r
-                       case Constants.RETURN:\r
-                               break;\r
-                       case Constants.GETSTATIC:\r
-                               break;\r
-                       case Constants.LDC:\r
-                               break;\r
-                       case Constants.INVOKEVIRTUAL:\r
-                       case Constants.INVOKESPECIAL:\r
-                               break;\r
-                       case Constants.LOOKUPSWITCH: {\r
-                               int result = JcfaUtil.byte2Int(codes[pc + 1], codes[pc + 2],\r
-                                               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\r
-                                               .byte2Int(codes[lookupOp++], codes[lookupOp++],\r
-                                                               codes[lookupOp++], codes[lookupOp++]);\r
+                       pc += operands;\r
+               }\r
+       }\r
 \r
-                               short diff2 = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]);\r
-                               jcfaCode.getComment().getCommentList()\r
-                                               .add("  TODO skipping bytes: " + (diff2));\r
+       private int analyzeCodes(final JavaClass jc, final Method method,\r
+                       final JcfaClass jcfaClass, final JcfaMethod jcfaMethod,\r
+                       final int pc, final byte[] codes) throws IOException {\r
+               final JcfaCode jcfaCode = new JcfaCode();\r
+               jcfaMethod.getCodeList().add(jcfaCode);\r
+               jcfaCode.setJavaClass(jc);\r
+\r
+               jcfaCode.setOpcode(JcfaUtil.byte2UnsignedByte(codes[pc]));\r
+               jcfaCode.getComment()\r
+                               .getCommentList()\r
+                               .add("" + pc + ": "\r
+                                               + Constants.OPCODE_NAMES[jcfaCode.getOpcode()]);\r
+\r
+               short operands = Constants.NO_OF_OPERANDS[jcfaCode.getOpcode()];\r
+               if (operands < 0) {\r
+                       jcfaCode.getComment()\r
+                                       .getCommentList()\r
+                                       .add("FIXME NO_OF_OPERANDS has negative value:"\r
+                                                       + Constants.OPCODE_NAMES[jcfaCode.getOpcode()]\r
+                                                       + ": " + operands);\r
+                       return operands;\r
+               }\r
 \r
-                               operands += (lookupOp - pc);\r
-                       }\r
-                               break;\r
-                       default:\r
-                               break;\r
-                       }\r
+               switch (jcfaCode.getOpcode()) {\r
+               case Constants.RETURN:\r
+                       break;\r
+               case Constants.GETSTATIC:\r
+                       break;\r
+               case Constants.LDC:\r
+                       break;\r
+               case Constants.INVOKEVIRTUAL:\r
+               case Constants.INVOKESPECIAL:\r
+                       break;\r
+               case Constants.LOOKUPSWITCH: {\r
+                       int result = JcfaUtil.byte2Int(codes[pc + 1], codes[pc + 2],\r
+                                       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++], codes[lookupOp++]);\r
+\r
+                       short diff2 = JcfaUtil.byte2UnsignedByte(codes[lookupOp++]);\r
+                       jcfaCode.getComment().getCommentList()\r
+                                       .add("  TODO skipping bytes: " + (diff2));\r
+\r
+                       operands += (lookupOp - pc);\r
+               }\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
 \r
-                       {\r
-                               final ByteArrayOutputStream outStream = new ByteArrayOutputStream();\r
-                               outStream.write(codes, pc, operands + 1);\r
-                               outStream.flush();\r
-                               jcfaCode.setCodes(outStream.toByteArray());\r
-                       }\r
-                       pc += operands;\r
+               {\r
+                       final ByteArrayOutputStream outStream = new ByteArrayOutputStream();\r
+                       outStream.write(codes, pc, operands + 1);\r
+                       outStream.flush();\r
+                       jcfaCode.setCodes(outStream.toByteArray());\r
                }\r
+               return operands;\r
        }\r
 }
\ No newline at end of file
index e2ea933..df50902 100644 (file)
@@ -22,7 +22,8 @@ public class TestJavaClass031 {
                /* 2: iload_1 */
 
                /*
-                * 3: tableswitch TODO negative value:tableswitch: -2
+                * 3: tableswitch FIXME NO_OF_OPERANDS has negative value:tableswitch:
+                * -2
                 */
        }
 }
\ No newline at end of file