/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.lang.ir;
import gw.lang.reflect.IType;
import gw.lang.GosuShop;
import gw.lang.UnstableAPI;
import gw.lang.reflect.TypeSystem;
import gw.lang.reflect.TypeSystemShutdownListener;
import gw.util.concurrent.LocklessLazyVar;
import java.util.Iterator;
@UnstableAPI
public class IRTypeConstants {
final public static IRType ITYPE() {
return ITYPE.get();
}
final public static IRType OBJECT() {
return OBJECT.get();
}
final public static IRType STRING() {
return STRING.get();
}
final public static IRType CLASS() {
return CLASS.get();
}
final public static IRType pVOID() {
return pVOID.get();
}
final public static IRType pBOOLEAN() {
return pBOOLEAN.get();
}
final public static IRType pBYTE() {
return pBYTE.get();
}
final public static IRType pSHORT() {
return pSHORT.get();
}
final public static IRType pCHAR() {
return pCHAR.get();
}
final public static IRType pINT() {
return pINT.get();
}
final public static IRType pLONG() {
return pLONG.get();
}
final public static IRType pFLOAT() {
return pFLOAT.get();
}
final public static IRType pDOUBLE() {
return pDOUBLE.get();
}
final public static IRType ITERATOR() {
return ITERATOR.get();
}
final public static IRType NUMBER() {
return NUMBER.get();
}
private static LocklessLazyVar<IRType> ITYPE = make(IType.class);
private static LocklessLazyVar<IRType> OBJECT = make(Object.class);
private static LocklessLazyVar<IRType> STRING = make(String.class);
private static LocklessLazyVar<IRType> CLASS = make(Class.class);
private static LocklessLazyVar<IRType> pVOID = make(void.class);
private static LocklessLazyVar<IRType> pBOOLEAN = make(boolean.class);
private static LocklessLazyVar<IRType> pBYTE = make(byte.class);
private static LocklessLazyVar<IRType> pSHORT = make(short.class);
private static LocklessLazyVar<IRType> pCHAR = make(char.class);
private static LocklessLazyVar<IRType> pINT = make(int.class);
private static LocklessLazyVar<IRType> pLONG = make(long.class);
private static LocklessLazyVar<IRType> pFLOAT = make(float.class);
private static LocklessLazyVar<IRType> pDOUBLE = make(double.class);
private static LocklessLazyVar<IRType> ITERATOR = make(Iterator.class);
private static LocklessLazyVar<IRType> NUMBER = make(Number.class);
private static LocklessLazyVar<IRType> make(final Class<?> clazz) {
return new LocklessLazyVar<IRType>() {
@Override
protected IRType init() {
return GosuShop.getIRTypeResolver().getDescriptor( clazz );
}
};
}
static {
// It is necessary to clear those since they keep references to JRE module.
TypeSystem.addShutdownListener(new TypeSystemShutdownListener() {
public void shutdown() {
ITYPE.clear();
OBJECT.clear();
STRING.clear();
pVOID.clear();
pBOOLEAN.clear();
pBYTE.clear();
pSHORT.clear();
pCHAR.clear();
pINT.clear();
pLONG.clear();
pFLOAT.clear();
pDOUBLE.clear();
ITERATOR.clear();
NUMBER.clear();
}
});
}
}