/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ package com.db4o.instrumentation.util; import java.io.*; import com.db4o.instrumentation.core.*; import EDU.purdue.cs.bloat.editor.*; /** * @exclude */ public class BloatUtil { public static String normalizeClassName(Type type) { return normalizeClassName(type.className()); } public static String normalizeClassName(String className) { return className.replace('/', '.'); } public static Class classForEditor(ClassEditor ce, ClassLoader loader) throws ClassNotFoundException { String clazzName = normalizeClassName(ce.name()); return loader.loadClass(clazzName); } public static boolean isPlatformClassName(String name) { return name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("sun."); } public static String classNameForPath(String classPath) { String className = classPath.substring(0, classPath.length()-".class".length()); return className.replace(File.separatorChar,'.'); } public static String classPathForName(String className) { String classPath = className.replace('.', '/'); return classPath + ".class"; } private BloatUtil() { } public static LoadStoreInstructions loadStoreInstructionsFor(Type type) { if (type.isPrimitive()) { switch (type.typeCode()) { case Type.DOUBLE_CODE: return new LoadStoreInstructions(Opcode.opc_dload, Opcode.opc_dstore); case Type.FLOAT_CODE: return new LoadStoreInstructions(Opcode.opc_fload, Opcode.opc_fstore); case Type.LONG_CODE: return new LoadStoreInstructions(Opcode.opc_lload, Opcode.opc_lstore); default: return new LoadStoreInstructions(Opcode.opc_iload, Opcode.opc_istore); } } return new LoadStoreInstructions(Opcode.opc_aload, Opcode.opc_astore); } public static boolean implementsInHierarchy(ClassEditor ce, Class markerInterface, BloatLoaderContext context) throws ClassNotFoundException { while(ce != null) { if(implementsDirectly(ce, markerInterface)) { return true; } ce = context.classEditor(ce.superclass()); } return false; } public static boolean extendsInHierarchy(ClassEditor ce, Class superClazz, BloatLoaderContext context) throws ClassNotFoundException { while(ce != null) { if(normalizeClassName(ce.name()).equals(superClazz.getName())) { return true; } ce = context.classEditor(ce.superclass()); } return false; } public static boolean implementsDirectly(ClassEditor ce, Class markerInterface) { if(markerInterface.getName().equals(normalizeClassName(ce.type()))) { return true; } Type[] interfaces = ce.interfaces(); for (int idx = 0; idx < interfaces.length; idx++) { Type type = interfaces[idx]; if(normalizeClassName(type).equals(markerInterface.getName())) { return true; } } return false; } }