OSDN Git Service

bug fixed: CVFV birthmark's default value is failed to parse
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Mon, 19 Feb 2007 04:24:34 +0000 (04:24 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Mon, 19 Feb 2007 04:24:34 +0000 (04:24 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@41 acee48c3-7b26-0410-bdac-b3d0e5314bbc

src/main/java/jp/naist/se/stigmata/birthmarks/cvfv/ConstantValueOfFieldVariableBirthmarkExtractVisitor.java

index fc7e62e..6f282c3 100755 (executable)
@@ -4,7 +4,7 @@ package jp.naist.se.stigmata.birthmarks.cvfv;
  * $Id$\r
  */\r
 \r
-import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
 import java.util.Map;\r
 \r
 import jp.naist.se.stigmata.Birthmark;\r
@@ -16,6 +16,7 @@ import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.MethodAdapter;\r
 import org.objectweb.asm.MethodVisitor;\r
 import org.objectweb.asm.Opcodes;\r
+import org.objectweb.asm.Type;\r
 \r
 /**\r
  * \r
@@ -26,7 +27,7 @@ import org.objectweb.asm.Opcodes;
  */\r
 public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends BirthmarkExtractVisitor{\r
     private Birthmark birthmark;\r
-    private Map<String, TypeAndValueBirthmarkElement> elements = new HashMap<String, TypeAndValueBirthmarkElement>();\r
+    private Map<String, TypeAndValueBirthmarkElement> elements = new LinkedHashMap<String, TypeAndValueBirthmarkElement>();\r
     private String className;\r
 \r
     public ConstantValueOfFieldVariableBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkContext context){\r
@@ -36,13 +37,14 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
 \r
     public void visitEnd(){\r
         for(String key: elements.keySet()){\r
+            TypeAndValueBirthmarkElement element = elements.get(key);\r
             birthmark.addElement(elements.get(key));\r
         }\r
         super.visitEnd();\r
     }\r
 \r
     public void visit(int version, int access, String name, String signature,\r
-        String superName, String[] interfaces){\r
+                      String superName, String[] interfaces){\r
         this.className = name;\r
 \r
         super.visit(version, access, name, signature, superName, interfaces);\r
@@ -50,7 +52,7 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
 \r
     @Override\r
     public FieldVisitor visitField(int access, String name, String desc,\r
-        String signature, Object value){\r
+                                   String signature, Object value){\r
 \r
         FieldVisitor visitor = super.visitField(access, name, desc, signature, value);\r
 \r
@@ -68,12 +70,13 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
         return visitor;\r
     }\r
 \r
-    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions){\r
+    public MethodVisitor visitMethod(int access, String name, String desc, String signature,\r
+                                     String[] exceptions){\r
         MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);\r
 \r
         if(name.equals("<init>") || name.equals("<clinit>")){\r
             visitor = new MethodAdapter(visitor){\r
-                private Object constant;\r
+                private Object constant = null;\r
 \r
                 public void visitIntInsn(int opcode, int operand){\r
                     if(opcode == Opcodes.BIPUSH || opcode == Opcodes.SIPUSH){\r
@@ -82,19 +85,50 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
                     super.visitIntInsn(opcode, operand);\r
                 }\r
 \r
+                public void visitMethodInsn(int opcode, String owner, String name, String desc){\r
+                    Type type = Type.getReturnType(desc);\r
+                    if(!type.equals(Type.VOID_TYPE)){\r
+                        constant = null;\r
+                    }\r
+                    super.visitMethodInsn(opcode, owner, name, desc);\r
+                }\r
+\r
+                public void visitInsn(int opcode){\r
+                    if(opcode == Opcodes.ICONST_M1)     constant = new Integer(-1);\r
+                    else if(opcode == Opcodes.ICONST_0) constant = new Integer(0);\r
+                    else if(opcode == Opcodes.ICONST_1) constant = new Integer(1);\r
+                    else if(opcode == Opcodes.ICONST_2) constant = new Integer(2);\r
+                    else if(opcode == Opcodes.ICONST_3) constant = new Integer(3);\r
+                    else if(opcode == Opcodes.ICONST_4) constant = new Integer(4);\r
+                    else if(opcode == Opcodes.ICONST_5) constant = new Integer(5);\r
+                    else if(opcode == Opcodes.LCONST_0) constant = new Long(0L);\r
+                    else if(opcode == Opcodes.LCONST_1) constant = new Long(1L);\r
+                    else if(opcode == Opcodes.DCONST_0) constant = new Double(0D);\r
+                    else if(opcode == Opcodes.DCONST_1) constant = new Double(1D);\r
+                    else if(opcode == Opcodes.FCONST_0) constant = new Float(0F);\r
+                    else if(opcode == Opcodes.FCONST_1) constant = new Float(1F);\r
+                    else if(opcode == Opcodes.FCONST_2) constant = new Float(2F);\r
+\r
+                    super.visitInsn(opcode);\r
+                }\r
+\r
                 public void visitLdcInsn(Object object){\r
                     constant = object;\r
                     super.visitLdcInsn(object);\r
                 }\r
 \r
                 public void visitFieldInsn(int opcode, String owner, String name, String desc){\r
-                    if(className.equals(owner)){\r
+                    if(className.equals(owner) && opcode == Opcodes.PUTFIELD){\r
                         TypeAndValueBirthmarkElement e = elements.get(name);\r
                         if(e == null){\r
+                            e = new TypeAndValueBirthmarkElement(name, desc, constant);\r
+                        }\r
+\r
+                        if(e.getValue() == null && constant != null){\r
                             if(!checkCast(desc, constant)){\r
                                 constant = null;\r
                             }\r
-                            e = new TypeAndValueBirthmarkElement(name, desc, constant);\r
+                            e.setValue(constant);\r
                         }\r
                     }\r
                     super.visitFieldInsn(opcode, owner, name, desc);\r
@@ -107,18 +141,18 @@ public class ConstantValueOfFieldVariableBirthmarkExtractVisitor extends Birthma
 \r
     private boolean checkCast(String desc, Object constant){\r
         if(constant instanceof Integer){\r
-            return desc.equals("Ljava/lang/Integer;") || desc.equals("I") || \r
-                desc.equals("S") || desc.equals("Z") ||  desc.equals("C") || \r
-                desc.equals("B");\r
+            return desc.equals("Ljava/lang/Integer;") ||\r
+                desc.equals("I") || desc.equals("S") || desc.equals("Z") ||\r
+                desc.equals("C") || desc.equals("B");\r
         }\r
         else if(constant instanceof Float){\r
-            return desc.equals("Ljava/lang/Float;") || desc.equals("F"); \r
+            return desc.equals("Ljava/lang/Float;") || desc.equals("F");\r
         }\r
         else if(constant instanceof Double){\r
-            return desc.equals("Ljava/lang/Double;") || desc.equals("D"); \r
+            return desc.equals("Ljava/lang/Double;") || desc.equals("D");\r
         }\r
         else if(constant instanceof Long){\r
-            return desc.equals("Ljava/lang/Long;") || desc.equals("J"); \r
+            return desc.equals("Ljava/lang/Long;") || desc.equals("J");\r
         }\r
         else if(constant instanceof String){\r
             return desc.equals("Ljava/lang/String;");\r