OSDN Git Service

[maven-release-plugin] copy for tag opcodes-1.0.0
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Mon, 26 Apr 2010 10:53:12 +0000 (10:53 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Mon, 26 Apr 2010 10:53:12 +0000 (10:53 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/plugins/trunk@393 acee48c3-7b26-0410-bdac-b3d0e5314bbc

12 files changed:
opcodes/opcodes-1.0.0/pom.xml [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/BirthmarkElementBuilder.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/LabelOpcode.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/Opcode.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractListener.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractMethodVisitor.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractVisitor.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeManager.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/main/resources/META-INF/bytecode.def [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/LabelOpcodeTest.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/OpcodeManagerTest.java [new file with mode: 0644]
opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/OpcodeTest.java [new file with mode: 0644]

diff --git a/opcodes/opcodes-1.0.0/pom.xml b/opcodes/opcodes-1.0.0/pom.xml
new file mode 100644 (file)
index 0000000..aa19648
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+  <modelVersion>4.0.0</modelVersion>\r
+  <parent>\r
+    <artifactId>plugins</artifactId>\r
+    <groupId>jp.sourceforge.stigmata</groupId>\r
+    <version>1.0</version>\r
+  </parent>\r
+  <groupId>jp.sourceforge.stigmata.plugins</groupId>\r
+  <artifactId>opcodes</artifactId>\r
+  <version>1.0.0</version>\r
+  <name>opcodes</name>\r
+  <url>http://stigmata.sourceforge.jp/stigmata/plugins/opcodes/</url>\r
+\r
+  <dependencies>\r
+    <dependency>\r
+      <groupId>jp.sourceforge</groupId>\r
+      <artifactId>stigmata</artifactId>\r
+      <version>2.0.0</version>\r
+      <scope>provided</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>asm</groupId>\r
+      <artifactId>asm-all</artifactId>\r
+      <version>3.1</version>\r
+      <scope>compile</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>junit</groupId>\r
+      <artifactId>junit</artifactId>\r
+      <version>4.8.1</version>\r
+      <scope>test</scope>\r
+    </dependency>\r
+  </dependencies>\r
+\r
+  <build>\r
+    <plugins>\r
+      <plugin>\r
+        <artifactId>maven-release-plugin</artifactId>\r
+        <configuration>\r
+          <tagBase>svn+ssh://tama3@svn.sourceforge.jp/svnroot/stigmata/plugins/trunk/opcodes/</tagBase>\r
+        </configuration>\r
+      </plugin>\r
+\r
+      <plugin>\r
+        <groupId>org.apache.maven.plugins</groupId>\r
+        <artifactId>maven-dependency-plugin</artifactId>\r
+        <executions>\r
+          <execution>\r
+            <id>copy-dependencies</id>\r
+            <phase>compile</phase>\r
+            <goals>\r
+              <goal>copy-dependencies</goal>\r
+            </goals>\r
+            <configuration>\r
+              <outputDirectory>${project.build.directory}</outputDirectory>\r
+              <includeScope>runtime</includeScope>\r
+            </configuration>\r
+          </execution>\r
+        </executions>\r
+      </plugin>\r
+    </plugins>\r
+  </build>\r
+\r
+  <scm>\r
+    <connection>scm:svn:http://svn.sourceforge.jp/svnroot/stigmata/plugins/trunk/opcodes/opcodes-1.0.0</connection>\r
+    <developerConnection>scm:svn:svn+ssh://tama3@svn.sourceforge.jp/svnroot/stigmata/plugins/trunk/opcodes/opcodes-1.0.0</developerConnection>\r
+    <url>http://svn.sourceforge.jp/svnroot/stigmata/plugins/trunk/opcodes/opcodes-1.0.0</url>\r
+  </scm>\r
+</project>\r
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/BirthmarkElementBuilder.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/BirthmarkElementBuilder.java
new file mode 100644 (file)
index 0000000..8a6c598
--- /dev/null
@@ -0,0 +1,21 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.List;
+
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+
+/**
+ *
+ *
+ * @author tamada
+ * @version $Revision$
+ */
+public interface BirthmarkElementBuilder {
+    public BirthmarkElement[] buildElements(List<Opcode> opcodes, BirthmarkContext context);
+}
+
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/LabelOpcode.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/LabelOpcode.java
new file mode 100644 (file)
index 0000000..2a6344e
--- /dev/null
@@ -0,0 +1,27 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import org.objectweb.asm.Label;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class LabelOpcode extends Opcode{
+    private static final long serialVersionUID = -346783431316464L;
+
+    private Label label;
+
+    public LabelOpcode(Label label){
+        super(-1, "targeter", 0, 0, Category.TARGETER);
+        this.label = label;
+    }
+
+    public Label getLabel(){
+        return label;
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/Opcode.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/Opcode.java
new file mode 100644 (file)
index 0000000..6aa6bff
--- /dev/null
@@ -0,0 +1,113 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.objectweb.asm.Label;
+
+/**
+ *
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class Opcode implements Serializable{
+    private static final long serialVersionUID = -2349834745416345564L;
+
+    public static enum Category{
+        NORMAL, BRANCH, OBJECT, INVOKE, TARGETER,
+    };
+    private int opcode;
+    private String name;
+    private int argumentCount;
+    private int act;
+    private Category category;
+    private List<Label> labels = new ArrayList<Label>();
+
+    public Opcode(Opcode opcode){
+        this(opcode.getOpcode(), opcode.getName(), opcode.getArgumentCount(), opcode.getAct(), opcode.getCategory());
+    }
+
+    public Opcode(int opcode, String name, int argumentCount, int act, String category){
+        this(opcode, name, argumentCount, act, Category.valueOf(category));
+    }
+
+    public Opcode(int opcode, String name, int argumentCount, int act, Category category){
+        this.opcode = opcode;
+        this.name = name;
+        this.argumentCount = argumentCount;
+        this.act = act;
+        this.category = category;
+    }
+
+    public int getOpcode(){
+        return opcode;
+    }
+
+    public String getName(){
+        return name;
+    }
+
+    public int getArgumentCount(){
+        return argumentCount;
+    }
+
+    public void addLabel(Label label){
+        if(label == null){
+            throw new NullPointerException();
+        }
+        if(category != Category.BRANCH){
+            throw new IllegalStateException("this method allows only branch category");
+        }
+        labels.add(label);
+    }
+
+    public void setLabels(Label[] labelArray){
+        if(labelArray == null){
+            throw new NullPointerException();
+        }
+        if(category != Category.BRANCH){
+            throw new IllegalStateException("this method allows only branch category");
+        }
+        labels.clear();
+        for(Label label: labelArray){
+            if(label == null){
+                throw new NullPointerException();
+            }
+            labels.add(label);
+        }
+    }
+
+    public Label getLabel(int index){
+        return labels.get(index);
+    }
+
+    public Iterator<Label> labels(){
+        return Collections.unmodifiableList(labels).iterator();
+    }
+
+    public void setAct(int act){
+        if(category != Category.OBJECT && category != Category.INVOKE){
+            throw new IllegalStateException("setAct can be called only object and invoke category.");
+        }
+        this.act = act;
+    }
+
+    public int getAct(){
+        return act;
+    }
+
+    public Category getCategory(){
+        return category;
+    }
+
+    public String toString(){
+        return String.format("%d:%s:%f(%s)", getOpcode(), getName(), getAct(), getCategory());
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractListener.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractListener.java
new file mode 100644 (file)
index 0000000..3474912
--- /dev/null
@@ -0,0 +1,16 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.List;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public interface OpcodeExtractListener{
+    public void extractOpcodesFinished(List<Opcode> opcodes);
+}
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractMethodVisitor.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractMethodVisitor.java
new file mode 100644 (file)
index 0000000..6f5cc28
--- /dev/null
@@ -0,0 +1,171 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+/**
+ *
+ * @author Haruaki TAMADA
+ * @version $Revision$
+ */
+public class OpcodeExtractMethodVisitor extends MethodAdapter{
+    private List<Opcode> opcodes;
+    private OpcodeManager manager = OpcodeManager.getInstance();
+    private List<OpcodeExtractListener> listeners = new ArrayList<OpcodeExtractListener>();
+
+    public OpcodeExtractMethodVisitor(MethodVisitor visitor){
+        this(visitor, new ArrayList<Opcode>());
+    }
+
+    public OpcodeExtractMethodVisitor(MethodVisitor visitor, List<Opcode> opcodes){
+        super(visitor);
+        this.opcodes = opcodes;
+    }
+
+    public void addOpcodeExtractListener(OpcodeExtractListener listener){
+        listeners.add(listener);
+    }
+
+    public void removeOpcodeExtractListener(OpcodeExtractListener listener){
+        listeners.add(listener);
+    }
+
+    @Override
+    public void visitFieldInsn(int opcode, String owner, String name, String desc){
+        Opcode field = manager.getOpcode(opcode);
+        Opcode o = new Opcode(field);
+        int size = Type.getType(desc).getSize();
+        switch(opcode){
+        case Opcodes.PUTFIELD:
+            size = -1 - size;
+            break;
+        case Opcodes.PUTSTATIC:
+            size = 0 - size;
+            break;
+        case Opcodes.GETFIELD:
+            size = -1 + size;
+            break;
+        case Opcodes.GETSTATIC:
+            size = 0 + size;
+            break;
+        }
+        o.setAct(size);
+        opcodes.add(o);
+        super.visitFieldInsn(opcode, owner, name, desc);
+    }
+
+    @Override
+    public void visitIincInsn(int var, int increment){
+        opcodes.add(manager.getOpcode(Opcodes.IINC));
+        super.visitIincInsn(var, increment);
+    }
+
+    @Override
+    public void visitInsn(int opcode){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitInsn(opcode);
+    }
+
+    @Override
+    public void visitLabel(Label label){
+        opcodes.add(new LabelOpcode(label));
+    }
+
+    @Override
+    public void visitIntInsn(int opcode, int operand){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitIntInsn(opcode, operand);
+    }
+
+    @Override
+    public void visitJumpInsn(int opcode, Label label){
+        Opcode o = manager.getOpcode(opcode);
+        o.addLabel(label);
+        opcodes.add(o);
+        super.visitJumpInsn(opcode, label);
+    }
+
+    @Override
+    public void visitLdcInsn(Object value){
+        opcodes.add(manager.getOpcode(Opcodes.LDC));
+        super.visitLdcInsn(value);
+    }
+
+    @Override
+    public void visitTableSwitchInsn(int min, int max, Label defaultLabel, Label[] labels){
+        Opcode tableSwitch = new Opcode(manager.getOpcode(Opcodes.TABLESWITCH));
+        tableSwitch.setLabels(labels);
+        tableSwitch.addLabel(defaultLabel);
+
+        opcodes.add(tableSwitch);
+        super.visitTableSwitchInsn(min, max, defaultLabel, labels);
+    }
+
+    @Override
+    public void visitLookupSwitchInsn(Label defaultHandle, int[] keys, Label[] labels){
+        Opcode lookupSwitch = new Opcode(manager.getOpcode(Opcodes.LOOKUPSWITCH));
+        lookupSwitch.setLabels(labels);
+        lookupSwitch.addLabel(defaultHandle);
+
+        opcodes.add(lookupSwitch);
+        super.visitLookupSwitchInsn(defaultHandle, keys, labels);
+    }
+
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String desc){
+        Opcode methodOpcode = new Opcode(manager.getOpcode(opcode));
+        Type[] types = Type.getArgumentTypes(desc);
+        int argumentSize = 0;
+        for(Type type: types) argumentSize = type.getSize();
+        int size = Type.getReturnType(desc).getSize();
+        switch(opcode){
+        case Opcodes.INVOKESTATIC:
+            size = size - argumentSize;
+            break;
+        case Opcodes.INVOKEINTERFACE:
+        case Opcodes.INVOKESPECIAL:
+        case Opcodes.INVOKEVIRTUAL:
+            size = size - argumentSize - 1;
+            break;
+        }
+        methodOpcode.setAct(size);
+
+        opcodes.add(methodOpcode);
+        super.visitMethodInsn(opcode, owner, name, desc);
+    }
+
+    @Override
+    public void visitMultiANewArrayInsn(String desc, int dims){
+        opcodes.add(manager.getOpcode(Opcodes.MULTIANEWARRAY));
+        super.visitMultiANewArrayInsn(desc, dims);
+    }
+
+    @Override
+    public void visitTypeInsn(int opcode, String desc){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitTypeInsn(opcode, desc);
+    }
+
+    @Override
+    public void visitVarInsn(int opcode, int var){
+        opcodes.add(manager.getOpcode(opcode));
+        super.visitVarInsn(opcode, var);
+    }
+
+    @Override
+    public void visitEnd(){
+        for(OpcodeExtractListener listener: listeners){
+            listener.extractOpcodesFinished(opcodes);
+        }
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractVisitor.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeExtractVisitor.java
new file mode 100644 (file)
index 0000000..7d7a272
--- /dev/null
@@ -0,0 +1,46 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import jp.sourceforge.stigmata.Birthmark;
+import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+
+/**
+ *
+ *
+ * @author tamada
+ * @version $Revision$
+ */
+public class OpcodeExtractVisitor extends BirthmarkExtractVisitor{
+    private List<Opcode> opcodeList = new ArrayList<Opcode>();
+    private BirthmarkElementBuilder builder;
+
+    public OpcodeExtractVisitor(ClassVisitor visitor, Birthmark birthmark, BirthmarkContext context, BirthmarkElementBuilder builder){
+        super(visitor, birthmark, context);
+        this.builder = builder;
+    }
+
+    public void visitEnd(){
+        BirthmarkElement[] elements = builder.buildElements(opcodeList, getContext());
+        for(BirthmarkElement element: elements){
+            addElement(element);
+        }
+    }
+
+    @Override
+    public MethodVisitor visitMethod(int arg0, String arg1, String arg2, String arg3, String[] arg4){
+        MethodVisitor visitor = super.visitMethod(arg0, arg1, arg2, arg3, arg4);
+        OpcodeExtractMethodVisitor opcodeVisitor = new OpcodeExtractMethodVisitor(visitor, opcodeList);
+
+        return opcodeVisitor;
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeManager.java b/opcodes/opcodes-1.0.0/src/main/java/jp/sourceforge/stigmata/birthmarks/OpcodeManager.java
new file mode 100644 (file)
index 0000000..bd7d9c6
--- /dev/null
@@ -0,0 +1,57 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import jp.sourceforge.talisman.csvio.CsvLine;
+import jp.sourceforge.talisman.csvio.CsvParser;
+
+/** 
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class OpcodeManager{
+    private Map<Integer, Opcode> opcodeMap = new HashMap<Integer, Opcode>();
+    private static OpcodeManager manager = new OpcodeManager();
+
+    /**
+     * private constructor for singleton pattern.
+     */
+    private OpcodeManager(){
+        try{
+            URL location = OpcodeManager.class.getResource("/META-INF/bytecode.def");
+            BufferedReader in = new BufferedReader(new InputStreamReader(location.openStream()));
+            CsvParser parser = new CsvParser(in);
+            while(parser.hasNext()){
+                CsvLine line = parser.next();
+                String[] values = line.getValues();
+                if(values.length == 5){
+                    Opcode def = new Opcode(
+                        Integer.parseInt(values[0]), values[1],
+                        Integer.parseInt(values[2]),
+                        Integer.parseInt(values[3]), values[4]
+                    );
+                    opcodeMap.put(def.getOpcode(), def);
+                }
+            }
+        } catch(Exception e){
+            throw new InternalError(e.getMessage());
+        }
+    }
+
+    public static OpcodeManager getInstance(){
+        return manager;
+    }
+
+    public Opcode getOpcode(int opcode){
+        return opcodeMap.get(opcode);
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/main/resources/META-INF/bytecode.def b/opcodes/opcodes-1.0.0/src/main/resources/META-INF/bytecode.def
new file mode 100644 (file)
index 0000000..a12af8c
--- /dev/null
@@ -0,0 +1,256 @@
+0,nop,0,0,NORMAL\r
+1,aconst_null,0,1,NORMAL\r
+2,iconst_m1,0,1,NORMAL\r
+3,iconst_0,0,1,NORMAL\r
+4,iconst_1,0,1,NORMAL\r
+5,iconst_2,0,1,NORMAL\r
+6,iconst_3,0,1,NORMAL\r
+7,iconst_4,0,1,NORMAL\r
+8,iconst_5,0,1,NORMAL\r
+9,lconst_0,0,2,NORMAL\r
+10,lconst_1,0,2,NORMAL\r
+11,fconst_0,0,1,NORMAL\r
+12,fconst_1,0,1,NORMAL\r
+13,fconst_2,0,1,NORMAL\r
+14,dconst_0,0,2,NORMAL\r
+15,dconst_1,0,2,NORMAL\r
+16,bipush,1,1,NORMAL\r
+17,sipush,2,1,NORMAL\r
+18,ldc,1,1,NORMAL\r
+19,ldc_w,2,1,NORMAL\r
+20,ldc2_w,2,2,NORMAL\r
+21,iload,1,1,NORMAL\r
+22,lload,1,2,NORMAL\r
+23,fload,1,1,NORMAL\r
+24,dload,1,2,NORMAL\r
+25,aload,1,1,NORMAL\r
+26,iload_0,0,1,NORMAL\r
+27,iload_1,0,1,NORMAL\r
+28,iload_2,0,1,NORMAL\r
+29,iload_3,0,1,NORMAL\r
+30,lload_0,0,2,NORMAL\r
+31,lload_1,0,2,NORMAL\r
+32,lload_2,0,2,NORMAL\r
+33,lload_3,0,2,NORMAL\r
+34,fload_0,0,1,NORMAL\r
+35,fload_1,0,1,NORMAL\r
+36,fload_2,0,1,NORMAL\r
+37,fload_3,0,1,NORMAL\r
+38,dload_0,0,2,NORMAL\r
+39,dload_1,0,2,NORMAL\r
+40,dload_2,0,2,NORMAL\r
+41,dload_3,0,2,NORMAL\r
+42,aload_0,0,1,NORMAL\r
+43,aload_1,0,1,NORMAL\r
+44,aload_2,0,1,NORMAL\r
+45,aload_3,0,1,NORMAL\r
+46,iaload,0,-1,NORMAL\r
+47,laload,0,0,NORMAL\r
+48,faload,0,-1,NORMAL\r
+49,daload,0,0,NORMAL\r
+50,aaload,0,-1,NORMAL\r
+51,baload,0,-1,NORMAL\r
+52,caload,0,-1,NORMAL\r
+53,saload,0,-1,NORMAL\r
+54,istore,1,-1,NORMAL\r
+55,lstore,1,-2,NORMAL\r
+56,fstore,1,-1,NORMAL\r
+57,dstore,1,-2,NORMAL\r
+58,astore,1,-1,NORMAL\r
+59,istore_0,0,-1,NORMAL\r
+60,istore_1,0,-1,NORMAL\r
+61,istore_2,0,-1,NORMAL\r
+62,istore_3,0,-1,NORMAL\r
+63,lstore_0,0,-2,NORMAL\r
+64,lstore_1,0,-2,NORMAL\r
+65,lstore_2,0,-2,NORMAL\r
+66,lstore_3,0,-2,NORMAL\r
+67,fstore_0,0,-1,NORMAL\r
+68,fstore_1,0,-1,NORMAL\r
+69,fstore_2,0,-1,NORMAL\r
+70,fstore_3,0,-1,NORMAL\r
+71,dstore_0,0,-2,NORMAL\r
+72,dstore_1,0,-2,NORMAL\r
+73,dstore_2,0,-2,NORMAL\r
+74,dstore_3,0,-2,NORMAL\r
+75,astore_0,0,-1,NORMAL\r
+76,astore_1,0,-1,NORMAL\r
+77,astore_2,0,-1,NORMAL\r
+78,astore_3,0,-1,NORMAL\r
+79,iastore,0,-3,NORMAL\r
+80,lastore,0,-3,NORMAL\r
+81,fastore,0,-3,NORMAL\r
+82,dastore,0,-3,NORMAL\r
+83,aastore,0,-3,NORMAL\r
+84,bastore,0,-3,NORMAL\r
+85,castore,0,-3,NORMAL\r
+86,sastore,0,-3,NORMAL\r
+87,pop,0,-1,NORMAL\r
+88,pop2,0,-2,NORMAL\r
+89,dup,0,1,NORMAL\r
+90,dup_x1,0,1,NORMAL\r
+91,dup_x2,0,1,NORMAL\r
+92,dup2,0,2,NORMAL\r
+93,dup2_x1,0,2,NORMAL\r
+94,dup2_x2,0,2,NORMAL\r
+95,swap,0,0,NORMAL\r
+96,iadd,0,-1,NORMAL\r
+97,ladd,0,-2,NORMAL\r
+98,fadd,0,-1,NORMAL\r
+99,dadd,0,-2,NORMAL\r
+100,isub,0,-1,NORMAL\r
+101,lsub,0,-2,NORMAL\r
+102,fsub,0,-1,NORMAL\r
+103,dsub,0,-2,NORMAL\r
+104,imul,0,-1,NORMAL\r
+105,lmul,0,-2,NORMAL\r
+106,fmul,0,-1,NORMAL\r
+107,dmul,0,-2,NORMAL\r
+108,idiv,0,-1,NORMAL\r
+109,ldiv,0,-2,NORMAL\r
+110,fdiv,0,-1,NORMAL\r
+111,ddiv,0,-2,NORMAL\r
+112,irem,0,-1,NORMAL\r
+113,lrem,0,-2,NORMAL\r
+114,frem,0,-1,NORMAL\r
+115,drem,0,-2,NORMAL\r
+116,ineg,0,0,NORMAL\r
+117,lneg,0,0,NORMAL\r
+118,fneg,0,0,NORMAL\r
+119,dneg,0,0,NORMAL\r
+120,ishl,0,-1,NORMAL\r
+121,lshl,0,-1,NORMAL\r
+122,ishr,0,-1,NORMAL\r
+123,lshr,0,-1,NORMAL\r
+124,iushr,0,-1,NORMAL\r
+125,lushr,0,-2,NORMAL\r
+126,iand,0,-1,NORMAL\r
+127,land,0,-2,NORMAL\r
+128,ior,0,-1,NORMAL\r
+129,lor,0,-2,NORMAL\r
+130,ixor,0,-1,NORMAL\r
+131,lxor,0,-2,NORMAL\r
+132,iinc,2,0,NORMAL\r
+133,i2l,0,1,NORMAL\r
+134,i2f,0,0,NORMAL\r
+135,i2d,0,1,NORMAL\r
+136,l2i,0,-1,NORMAL\r
+137,l2f,0,-1,NORMAL\r
+138,l2d,0,0,NORMAL\r
+139,f2i,0,0,NORMAL\r
+140,f2l,0,1,NORMAL\r
+141,f2d,0,1,NORMAL\r
+142,d2i,0,-1,NORMAL\r
+143,d2l,0,0,NORMAL\r
+144,d2f,0,-1,NORMAL\r
+145,i2b,0,0,NORMAL\r
+146,i2c,0,0,NORMAL\r
+147,i2s,0,0,NORMAL\r
+148,lcmp,0,-3,NORMAL\r
+149,fcmpl,0,-1,NORMAL\r
+150,fcmpg,0,-1,NORMAL\r
+151,dcmpl,0,-3,NORMAL\r
+152,dcmpg,0,-3,NORMAL\r
+153,ifeq,2,-1,BRANCH\r
+154,ifne,2,-1,BRANCH\r
+155,iflt,2,-1,BRANCH\r
+156,ifge,2,-1,BRANCH\r
+157,ifgt,2,-1,BRANCH\r
+158,ifle,2,-1,BRANCH\r
+159,if_icmpeq,2,-2,BRANCH\r
+160,if_icmpne,2,-2,BRANCH\r
+161,if_icmplt,2,-2,BRANCH\r
+162,if_icmpge,2,-2,BRANCH\r
+163,if_icmpgt,2,-2,BRANCH\r
+164,if_icmple,2,-2,BRANCH\r
+165,if_acmpeq,2,-2,BRANCH\r
+166,if_acmpne,2,-2,BRANCH\r
+167,goto,2,-1,BRANCH\r
+168,jsr,2,-1,BRANCH\r
+169,ret,1,0,NORMAL\r
+170,tableswitch,-1,-1,BRANCH\r
+171,lookupswitch,-1,-1,BRANCH\r
+172,ireturn,0,-1,NORMAL\r
+173,lreturn,0,-2,NORMAL\r
+174,freturn,0,-1,NORMAL\r
+175,dreturn,0,-2,NORMAL\r
+176,areturn,0,-1,NORMAL\r
+177,return,0,0,NORMAL\r
+178,getstatic,2,0,OBJECT\r
+179,putstatic,2,0,OBJECT\r
+180,getfield,2,0,OBJECT\r
+181,putfield,2,0,OBJECT\r
+182,invokevirtual,2,0,INVOKE\r
+183,invokespecial,2,0,INVOKE\r
+184,invokestatic,2,0,INVOKE\r
+185,invokeinterface,2,0,INVOKE\r
+186,__unused,0\r
+187,new,2,1,NORMAL\r
+188,newarray,1,0,NORMAL\r
+189,anewarray,2,0,NORMAL\r
+190,arraylength,0,0,NORMAL\r
+191,athrow,0,-1,NORMAL\r
+192,checkcast,2,0,NORMAL\r
+193,instanceof,2,0,NORMAL\r
+194,monitorenter,0,-1,NORMAL\r
+195,monitorexit,0,-1,NORMAL\r
+196,wide,-1,0,NORMAL\r
+197,multianewarray,3,-1,NORMAL\r
+198,ifnull,2,-1,BRANCH\r
+199,ifnonnull,2,-1,BRANCH\r
+200,goto_w,4,-1,BRANCH\r
+201,jsr_w,4,-1,BRANCH\r
+202,breakpoint,0\r
+203,ldc_quick,1\r
+204,__unused,0\r
+205,ldc2_w_quick,2\r
+206,getfield_quick,2\r
+207,putfield_quick,2\r
+208,getfield2_quick,2\r
+209,putfield2_quick,2\r
+210,__unused,0\r
+211,putstatic_quick,2\r
+212,getstatic2_quick,2\r
+213,putstatic2_quick,2\r
+214,invokevirtual_quick,2\r
+215,invokenonvirtual_quick,2\r
+216,invokesuper_quick,2\r
+217,invokestatic_quick,2\r
+218,invokeinterface_quick,2\r
+219,invokevirtualobject_quick,2\r
+220,__unused,0\r
+221,new_quick,2\r
+222,anewarray_quick,2\r
+223,multianewarray_quick,3\r
+224,checkcast_quick,2\r
+225,instanceof_quick,2\r
+226,invokevirtual_quick_w,4\r
+227,getfield_quick_w,4\r
+228,putfield_quick_w,4\r
+229,__unused,0\r
+230,__unused,0\r
+231,__unused,0\r
+232,__unused,0\r
+233,__unused,0\r
+234,__unused,0\r
+235,__unused,0\r
+236,__unused,0\r
+237,__unused,0\r
+238,__unused,0\r
+239,__unused,0\r
+240,__unused,0\r
+241,__unused,0\r
+242,__unused,0\r
+243,__unused,0\r
+244,__unused,0\r
+245,__unused,0\r
+246,__unused,0\r
+247,__unused,0\r
+248,__unused,0\r
+249,__unused,0\r
+250,__unused,0\r
+251,__unused,0\r
+252,__unused,0\r
+253,__unused,0\r
+254,impdep1,0\r
+255,impdep2,0\r
diff --git a/opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/LabelOpcodeTest.java b/opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/LabelOpcodeTest.java
new file mode 100644 (file)
index 0000000..fbdeffc
--- /dev/null
@@ -0,0 +1,34 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.objectweb.asm.Label;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class LabelOpcodeTest{
+    private LabelOpcode opcode;
+    private Label label;
+
+    @Before
+    public void setup(){
+        label = new Label();
+        opcode = new LabelOpcode(label);
+    }
+
+    @Test
+    public void testBasic(){
+        Assert.assertEquals(Opcode.Category.TARGETER, opcode.getCategory());
+        Assert.assertEquals(-1, opcode.getOpcode());
+        Assert.assertEquals("targeter", opcode.getName());
+        Assert.assertEquals(label, opcode.getLabel());
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/OpcodeManagerTest.java b/opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/OpcodeManagerTest.java
new file mode 100644 (file)
index 0000000..ec807de
--- /dev/null
@@ -0,0 +1,25 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class OpcodeManagerTest{
+    @Test
+    public void testBasic(){
+        Assert.assertNotNull(OpcodeManager.getInstance());
+
+        Opcode opcode = OpcodeManager.getInstance().getOpcode(182);
+
+        Assert.assertEquals(182, opcode.getOpcode());
+        Assert.assertEquals("invokevirtual", opcode.getName());
+    }
+}
diff --git a/opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/OpcodeTest.java b/opcodes/opcodes-1.0.0/src/test/java/jp/sourceforge/stigmata/birthmarks/OpcodeTest.java
new file mode 100644 (file)
index 0000000..703592a
--- /dev/null
@@ -0,0 +1,141 @@
+package jp.sourceforge.stigmata.birthmarks;
+
+/*
+ * $Id$
+ */
+
+import java.util.Iterator;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.objectweb.asm.Label;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class OpcodeTest{
+    private Opcode opcode;
+
+    @Before
+    public void setup(){
+        opcode = new Opcode(26, "iload_0", 0, 1, Opcode.Category.NORMAL);
+    }
+
+    @Test
+    public void testBasic(){
+        Assert.assertEquals(26, opcode.getOpcode());
+        Assert.assertEquals("iload_0", opcode.getName());
+        Assert.assertEquals(0, opcode.getArgumentCount());
+        Assert.assertEquals(1, opcode.getAct());
+        Assert.assertEquals(Opcode.Category.NORMAL, opcode.getCategory());
+    }
+
+    @Test
+    public void testSelfConstructor(){
+        Opcode o = new Opcode(opcode);
+        Assert.assertEquals(26, o.getOpcode());
+        Assert.assertEquals("iload_0", o.getName());
+        Assert.assertEquals(0, o.getArgumentCount());
+        Assert.assertEquals(1, o.getAct());
+        Assert.assertEquals(Opcode.Category.NORMAL, o.getCategory());
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void testSetActThrowException(){
+        opcode.setAct(1);
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void testAddLabelThrowException(){
+        opcode.addLabel(new Label());
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testAddLabelNullPointer(){
+        opcode.addLabel(null);
+    }
+
+    @Test(expected=IllegalStateException.class)
+    public void testSetLabelsThrowException(){
+        opcode.setLabels(new Label[] { new Label() });
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testSetLabelsNullPointer1(){
+        opcode.setLabels(null);
+    }
+
+    @Test
+    public void testAddLabel(){
+        opcode = new Opcode(154, "ifne", 2, -1, "BRANCH");
+        Label label1 = new Label();
+        Label label2 = new Label();
+        Label label3 = new Label();
+
+        opcode.addLabel(label1);
+        opcode.addLabel(label2);
+        opcode.addLabel(label3);
+
+        Assert.assertEquals(label1, opcode.getLabel(0));
+        Assert.assertEquals(label2, opcode.getLabel(1));
+        Assert.assertEquals(label3, opcode.getLabel(2));
+
+        Iterator<Label> iterator = opcode.labels();
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(label1, iterator.next());
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(label2, iterator.next());
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(label3, iterator.next());
+        Assert.assertFalse(iterator.hasNext());
+    }
+
+    @Test
+    public void testSetLabels(){
+        opcode = new Opcode(154, "ifne", 2, -1, "BRANCH");
+        Label label1 = new Label();
+        Label label2 = new Label();
+        Label label3 = new Label();
+
+        opcode.addLabel(label1);
+        opcode.setLabels(new Label[] { label1, label2, label3, });
+
+        Assert.assertEquals(label1, opcode.getLabel(0));
+        Assert.assertEquals(label2, opcode.getLabel(1));
+        Assert.assertEquals(label3, opcode.getLabel(2));
+
+        Iterator<Label> iterator = opcode.labels();
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(label1, iterator.next());
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(label2, iterator.next());
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(label3, iterator.next());
+        Assert.assertFalse(iterator.hasNext());
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testSetLabelsThrownNullPointerException(){
+        opcode = new Opcode(154, "ifne", 2, -1, "BRANCH");
+
+        opcode.setLabels(new Label[] { null, });
+    }
+
+    /**
+     * this test will be thrown IllegalStateException.
+     * Because, IllegalStateException is checked before null check of array elements.
+     */
+    @Test(expected=IllegalStateException.class)
+    public void testSetLabelsNullPointer2(){
+        opcode.setLabels(new Label[] { null, });
+    }
+
+    @Test
+    public void testSetAct() throws Exception{
+        opcode = new Opcode(182, "invokevirtual", 2, 0, "INVOKE");
+        opcode.setAct(4);
+    }
+}