OSDN Git Service

f879c3806e3ff1948c3d42bc70b032f863132c1c
[stigmata/stigmata-plugins.git] / opcodes / src / main / java / jp / sourceforge / stigmata / birthmarks / Opcode.java
1 package jp.sourceforge.stigmata.birthmarks;
2
3 /*
4  * $Id$
5  */
6
7 import java.io.Serializable;
8 import java.util.ArrayList;
9 import java.util.Collections;
10 import java.util.Iterator;
11 import java.util.List;
12
13 import org.objectweb.asm.Label;
14
15 /**
16  * 
17  * @author Haruaki Tamada
18  * @version $Revision$
19  */
20 public class Opcode implements Serializable{
21     private static final long serialVersionUID = -2349834745416345564L;
22
23     public static enum Category{
24         NORMAL, BRANCH, OBJECT, INVOKE, TARGETER,
25     };
26     private int opcode;
27     private String name;
28     private int argumentCount;
29     private int act;
30     private int weight;
31     private Category category;
32     private List<Label> labels = new ArrayList<Label>();
33
34     public Opcode(Opcode opcode){
35         this(opcode.getOpcode(), opcode.getName(), opcode.getArgumentCount(), opcode.getAct(), opcode.getCategory());
36     }
37
38     public Opcode(int opcode, String name, int argumentCount, int act, String category){
39         this(opcode, name, argumentCount, act, Category.valueOf(category));
40     }
41
42     public Opcode(int opcode, String name, int argumentCount, int act, Category category){
43         this.opcode = opcode;
44         this.name = name;
45         this.argumentCount = argumentCount;
46         this.act = act;
47         this.category = category;
48     }
49
50     Opcode(int opcode, String name, int argumentCount, int act, Category category, int weight){
51         this(opcode, name, argumentCount, act, category);
52         setWeight(weight);
53     }
54
55     public int getOpcode(){
56         return opcode;
57     }
58
59     public String getName(){
60         return name;
61     }
62
63     public int getArgumentCount(){
64         return argumentCount;
65     }
66
67     public void addLabel(Label label){
68         if(label == null){
69             throw new NullPointerException();
70         }
71         if(category != Category.BRANCH){
72             throw new IllegalStateException("this method allows only branch category");
73         }
74         labels.add(label);
75     }
76
77     public void setLabels(Label[] labelArray){
78         if(labelArray == null){
79             throw new NullPointerException();
80         }
81         if(category != Category.BRANCH){
82             throw new IllegalStateException("this method allows only branch category");
83         }
84         labels.clear();
85         for(Label label: labelArray){
86             if(label == null){
87                 throw new NullPointerException();
88             }
89             labels.add(label);
90         }
91     }
92
93     public Label getLabel(int index){
94         return labels.get(index);
95     }
96
97     public Iterator<Label> labels(){
98         return Collections.unmodifiableList(labels).iterator();
99     }
100
101     public void setAct(int act){
102         if(category != Category.OBJECT && category != Category.INVOKE){
103             throw new IllegalStateException("setAct can be called only object and invoke category.");
104         }
105         this.act = act;
106     }
107
108     public int getAct(){
109         return act;
110     }
111
112     public Category getCategory(){
113         return category;
114     }
115
116     public void setWeight(int weight){
117         this.weight = weight;
118     }
119
120     public int getWeight(){
121         return weight;
122     }
123
124     public String toString(){
125         return String.format("%d:%s:%d:%f(%s)", getOpcode(), getName(), getAct(), getWeight(), getCategory());
126     }
127 }