WALA/com.ibm.wala.core/com.ibm.wala.core/src/com/ibm/wala/classLoader/ArrayClassLoader.java

76 lines
2.6 KiB
Java

/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.classLoader;
import java.util.HashMap;
import com.ibm.wala.types.TypeName;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.debug.Assertions;
/**
* Pseudo-classloader for all array classes; all other IClassLoader
* implementations should delegate to this one for array classes only.
*
* @author Stephen Fink
*/
public class ArrayClassLoader {
private final static boolean DEBUG = false;
/**
* map: TypeReference -> ArrayClass
*/
private HashMap<TypeReference, ArrayClass> arrayClasses = HashMapFactory.make();
/**
* @param className
* name of the array class
* @param delegator
* class loader to look up element type with
*/
public IClass lookupClass(TypeName className, IClassLoader delegator) {
if (DEBUG) {
Assertions._assert(className.toString().startsWith("["));
}
TypeReference type = TypeReference.findOrCreate(delegator.getReference(), className);
ArrayClass arrayClass = arrayClasses.get(type);
if (arrayClass == null) {
TypeReference elementType = type.getArrayElementType();
if (elementType.isPrimitiveType()) {
TypeReference aRef = TypeReference.findOrCreateArrayOf(elementType);
arrayClass = arrayClasses.get(aRef);
IClassLoader primordial = getRootClassLoader(delegator);
if (arrayClass == null) {
arrayClasses.put(aRef, arrayClass = new ArrayClass(aRef, primordial));
}
} else {
// check that the element class is loadable. If not, return null.
if (delegator.lookupClass(elementType.getName()) == null) {
return null;
}
arrayClass = new ArrayClass(type, delegator);
}
arrayClasses.put(type, arrayClass);
}
return arrayClass;
}
private static IClassLoader getRootClassLoader(IClassLoader l) {
while (l.getParent() != null) {
l = l.getParent();
}
return l;
}
}