KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > jbet > AliasDB


1
2 /*
3  * JBET - Java Binary Enhancement Tool
4  * Copyright (c) 2003 Networks Associates Technology, Inc.
5  *
6  * This software was developed under DARPA/SPAWAR contract
7  * N66001-00-C-8602 "SPMA" as part of the
8  * DARPA OASIS research program.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31 */

32
33 package jbet;
34 import java.util.*;
35 import java.io.*;
36
37 public class AliasDB {
38
39     Vector revdb;
40     Hashtable db;
41     int nextserial;
42
43     public AliasDB() {
44     nextserial = 1;
45     db = new Hashtable();
46     revdb = new Vector();
47     }
48     
49     private int next() {
50     return nextserial++;
51     }
52
53     private int get(String JavaDoc key) {
54     Integer JavaDoc s = (Integer JavaDoc) db.get(key);
55     if (s == null) {
56         int ret = next();
57         db.put(key, new Integer JavaDoc(ret));
58         return ret;
59     } else
60         return s.intValue();
61     }
62     
63     private int peek(String JavaDoc key) {
64     Integer JavaDoc s = (Integer JavaDoc) db.get(key);
65     if (s == null)
66         return 0;
67     else
68         return s.intValue();
69     }
70     
71     private void set(String JavaDoc key, int val) {
72     db.put(key, new Integer JavaDoc(val));
73     }
74
75     
76     public int getField (int struc, String JavaDoc name) {
77     return get (struc + "," + name);
78     }
79
80     public int peekField (int struc, String JavaDoc name) {
81     return peek (struc + "," + name);
82     }
83
84     public void setField(int struc, String JavaDoc name, int val) {
85     set(struc + "," + name, val);
86     }
87
88     public int getSField(String JavaDoc cname, String JavaDoc fname) {
89     return get (cname + "." + fname);
90     }
91
92     public int peekSField(String JavaDoc cname, String JavaDoc fname) {
93     return peek (cname + "." + fname);
94     }
95
96     public void setSField(String JavaDoc cname, String JavaDoc fname, int val) {
97     set (cname + "." + fname, val);
98     }
99
100     public int getArrayElt (int array, int index) {
101     return get (array + "," + index);
102     }
103
104     public int peekArrayElt (int array, int index) {
105     return peek (array + "," + index);
106     }
107
108     public void setArrayElt (int array, int index, int value) {
109     set (array + "," + index, value);
110     }
111
112     public boolean isBad (int array) {
113     return db.get(array + ",,,BAD") != null;
114     }
115
116     public void setBad (int array) {
117     db.put(array + ",,,BAD", this);
118     }
119
120     public void print(LineWriter out) {
121     out.println("---");
122     for (Enumeration e = db.keys(); e.hasMoreElements();) {
123         Object JavaDoc k = e.nextElement();
124         Object JavaDoc v = db.get(k);
125         out.println(" " + k + " -> " + v);
126     }
127     out.println("---");
128     }
129
130     /* public Node getNode(int serial) {
131     return (Node.constant) db.get("NODE,,," + serial);
132     }*/

133
134     public Iterator getNodes(int serial) {
135     List l = (List) revdb.elementAt(serial);
136     if (l == null)
137         return null;
138     else
139         return l.iterator();
140     }
141     
142     public void setNode (Node val, int serial) {
143     val.serial = serial;
144     if (revdb.size() <= serial) {
145         revdb.setSize(serial+1);
146     }
147     LinkedList l = (LinkedList) revdb.elementAt(serial);
148     if (l == null) {
149         l = new LinkedList();
150         revdb.setElementAt(l, serial);
151     }
152     l.add (val);
153     }
154
155     public void setNode (Node val) {
156     if (val.serial == 0)
157         val.serial = next();
158     setNode(val, val.serial);
159     }
160
161
162     public Node getNodeFromBlock(int serial, BasicBlock bb) {
163     for (Iterator i = getNodes(serial); i.hasNext();) {
164         Node n = (Node) i.next();
165         if (n.sb == bb) return n;
166     }
167     return null;
168     }
169
170     public Node getGoodNodeFromBlock(int serial, BasicBlock bb) {
171     for (Iterator i = getNodes(serial); i.hasNext();) {
172         Node n = (Node) i.next();
173         if (n.sb == bb && !(n instanceof Node.getfield || n instanceof Node.aload))
174         return n;
175     }
176     return null;
177     }
178
179     public Node getBestNodeFromBlock (int serial, BasicBlock bb) {
180     Node n = getGoodNodeFromBlock(serial, bb);
181     if (n != null) return n;
182     return getNodeFromBlock(serial, bb);
183     }
184
185     public Node getGoodNode(int serial) {
186     for (Iterator i = getNodes(serial); i.hasNext();) {
187         Node n = (Node) i.next();
188         if (!(n instanceof Node.getfield || n instanceof Node.aload || n instanceof Node.var))
189         return n;
190     }
191     return null;
192     }
193
194     public Node getBestNode(int serial) {
195     Node var = null, lookup = null, other = null;
196     for (Iterator i = getNodes(serial); i.hasNext();) {
197         Node n = (Node) i.next();
198         if (n instanceof Node.var && var==null)
199         var = n;
200         else if ((n instanceof Node.aload || n instanceof Node.getfield) && lookup==null)
201         lookup = n;
202         else if (other == null)
203         other = n;
204         if (var!=null && lookup!=null && other!=null)
205         break;
206     }
207     if (other != null)
208         return other;
209     else if (lookup != null)
210         return lookup;
211     else if (var != null)
212         return var;
213     else return null;
214     }
215 }
216
217     
218
Popular Tags