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 */ 30package org.objectweb.asm; 31 32import java.io.InputStream; 33import java.lang.reflect.Modifier; 34 35import javassist.ClassPool; 36import javassist.CtClass; 37import javassist.CtField; 38import javassist.CtMethod; 39import javassist.bytecode.Bytecode; 40import javassist.bytecode.CodeIterator; 41import javassist.bytecode.MethodInfo; 42import javassist.bytecode.Opcode; 43 44/** 45 * @author Eric Bruneton 46 */ 47public class JavassistPerfTest extends ALLPerfTest { 48 49 public static void main(final String args[]) throws Exception { 50 System.out.println("Javassist PERFORMANCES\n"); 51 new JavassistPerfTest().perfs(args); 52 } 53 54 ClassPool pool; 55 56 public JavassistPerfTest() { 57 pool = new ClassPool(null); 58 } 59 60 ALLPerfTest newInstance() { 61 return new JavassistPerfTest(); 62 } 63 64 byte[] nullAdaptClass(final InputStream is, final String name) 65 throws Exception 66 { 67 CtClass cc = pool.makeClass(is); 68 CtMethod[] ms = cc.getDeclaredMethods(); 69 for (int j = 0; j < ms.length; ++j) { 70 if (skipDebug) { 71 // is there a mean to remove the debug attributes? 72 } 73 if (compute) { 74 // how to force recomputation of maxStack and maxLocals? 75 } 76 } 77 return cc.toBytecode(); 78 } 79 80 byte[] counterAdaptClass(final InputStream is, final String name) 81 throws Exception 82 { 83 CtClass cc = pool.makeClass(is); 84 if (!cc.isInterface()) { 85 cc.addField(new CtField(CtClass.intType, "_counter", cc)); 86 } 87 CtMethod[] ms = cc.getDeclaredMethods(); 88 for (int j = 0; j < ms.length; ++j) { 89 CtMethod m = ms[j]; 90 int modifiers = m.getModifiers(); 91 if (!Modifier.isStatic(modifiers) 92 && !Modifier.isAbstract(modifiers) 93 && !Modifier.isNative(modifiers)) 94 { 95 if (!m.isEmpty()) { 96 MethodInfo info = m.getMethodInfo(); 97 Bytecode bc = new Bytecode(info.getConstPool(), 1, 0); 98 bc.addAload(0); 99 bc.addAload(0); 100 bc.addGetfield(cc, "_counter", "I"); 101 bc.add(Opcode.ICONST_1); 102 bc.add(Opcode.IADD); 103 bc.addPutfield(cc, "_counter", "I"); 104 CodeIterator iter = info.getCodeAttribute().iterator(); 105 iter.begin(); 106 iter.insert(bc.get()); 107 } 108 } 109 } 110 return cc.toBytecode(); 111 } 112} 113