KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > asm > BCELPerfTest


1 /***
2  * ASM performance test: measures the performances of asm package
3  * Copyright (c) 2002-2005 France Telecom
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  * 3. Neither the name of the copyright holders nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28  * THE POSSIBILITY OF SUCH DAMAGE.
29  */

30 package org.objectweb.asm;
31
32 import org.apache.bcel.Constants;
33 import org.apache.bcel.classfile.ClassParser;
34 import org.apache.bcel.classfile.JavaClass;
35 import org.apache.bcel.classfile.Method;
36 import org.apache.bcel.generic.ALOAD;
37 import org.apache.bcel.generic.ClassGen;
38 import org.apache.bcel.generic.ConstantPoolGen;
39 import org.apache.bcel.generic.FieldGen;
40 import org.apache.bcel.generic.GETFIELD;
41 import org.apache.bcel.generic.IADD;
42 import org.apache.bcel.generic.ICONST;
43 import org.apache.bcel.generic.InstructionHandle;
44 import org.apache.bcel.generic.InstructionList;
45 import org.apache.bcel.generic.MethodGen;
46 import org.apache.bcel.generic.PUTFIELD;
47 import org.apache.bcel.generic.Type;
48
49 import java.io.InputStream JavaDoc;
50
51 /**
52  * @author Eric Bruneton
53  */

54 public class BCELPerfTest extends ALLPerfTest implements Constants {
55
56     public static void main(final String JavaDoc args[]) throws Exception JavaDoc {
57         System.out.println("BCEL PERFORMANCES\n");
58         new BCELPerfTest().perfs(args);
59     }
60
61     ALLPerfTest newInstance() {
62         return new BCELPerfTest();
63     }
64
65     byte[] nullAdaptClass(final InputStream JavaDoc is, final String JavaDoc name)
66             throws Exception JavaDoc
67     {
68         JavaClass jc = new ClassParser(is, name + ".class").parse();
69         ClassGen cg = new ClassGen(jc);
70         ConstantPoolGen cp = cg.getConstantPool();
71         Method[] ms = cg.getMethods();
72         for (int j = 0; j < ms.length; ++j) {
73             MethodGen mg = new MethodGen(ms[j], cg.getClassName(), cp);
74             boolean lv = ms[j].getLocalVariableTable() == null;
75             boolean ln = ms[j].getLineNumberTable() == null;
76             if (lv) {
77                 mg.removeLocalVariables();
78             }
79             if (ln) {
80                 mg.removeLineNumbers();
81             }
82             mg.stripAttributes(skipDebug);
83             InstructionList il = mg.getInstructionList();
84             if (il != null) {
85                 InstructionHandle ih = il.getStart();
86                 while (ih != null) {
87                     ih = ih.getNext();
88                 }
89                 if (compute) {
90                     mg.setMaxStack();
91                     mg.setMaxLocals();
92                 }
93             }
94             cg.replaceMethod(ms[j], mg.getMethod());
95         }
96         return cg.getJavaClass().getBytes();
97     }
98
99     byte[] counterAdaptClass(final InputStream JavaDoc is, final String JavaDoc name)
100             throws Exception JavaDoc
101     {
102         JavaClass jc = new ClassParser(is, name + ".class").parse();
103         ClassGen cg = new ClassGen(jc);
104         ConstantPoolGen cp = cg.getConstantPool();
105         if (!cg.isInterface()) {
106             FieldGen fg = new FieldGen(ACC_PUBLIC,
107                     Type.getType("I"),
108                     "_counter",
109                     cp);
110             cg.addField(fg.getField());
111         }
112         Method[] ms = cg.getMethods();
113         for (int j = 0; j < ms.length; ++j) {
114             MethodGen mg = new MethodGen(ms[j], cg.getClassName(), cp);
115             if (!mg.getName().equals("<init>") && !mg.isStatic()
116                     && !mg.isAbstract() && !mg.isNative())
117             {
118                 if (mg.getInstructionList() != null) {
119                     InstructionList il = new InstructionList();
120                     il.append(new ALOAD(0));
121                     il.append(new ALOAD(0));
122                     il.append(new GETFIELD(cp.addFieldref(name, "_counter", "I")));
123                     il.append(new ICONST(1));
124                     il.append(new IADD());
125                     il.append(new PUTFIELD(cp.addFieldref(name, "_counter", "I")));
126                     mg.getInstructionList().insert(il);
127                     mg.setMaxStack(Math.max(mg.getMaxStack(), 2));
128                     boolean lv = ms[j].getLocalVariableTable() == null;
129                     boolean ln = ms[j].getLineNumberTable() == null;
130                     if (lv) {
131                         mg.removeLocalVariables();
132                     }
133                     if (ln) {
134                         mg.removeLineNumbers();
135                     }
136                     cg.replaceMethod(ms[j], mg.getMethod());
137                 }
138             }
139         }
140         return cg.getJavaClass().getBytes();
141     }
142 }
143
Popular Tags