* $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
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
*/\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
\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
\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
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
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
\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