/*
* @(#)TypeInfo.java 1.11 06/10/10
*
* Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program 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 version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*
*/
package com.sun.xlet.ixc;
import java.util.Hashtable;
//
// This little utility class is used by IxcClassLoader to hold
// information that's relevant to it about types (particularly
// primitive types and their wrappers).
//
class TypeInfo {
String typeDescriptor; // 'L', 'D', ...
int localSlots; // Ints take 1 local slot, doubles & longs 2
byte loadInstruction; // iload, dload, fload, ...
byte returnInstruction; // ireturn, dreturn, ...
Class primitiveWrapper; // null for non-primitive
String valueMethod; // "intValue(), floatValue(), ..."
// A Mapping from the java.lang.Class instance for each primitive
// type to some information that relevant to us about these types:
private static Hashtable primitiveMap;
static {
primitiveMap = new Hashtable(11);
primitiveMap.put(Boolean.TYPE, new TypeInfo(
"Z", 1, (byte) 0x15, (byte) 0xac, Boolean.class, "booleanValue"));
primitiveMap.put(Byte.TYPE, new TypeInfo(
"B", 1, (byte) 0x15, (byte) 0xac, Byte.class, "byteValue"));
primitiveMap.put(Character.TYPE, new TypeInfo(
"C", 1, (byte) 0x15, (byte) 0xac, Character.class, "charValue"));
primitiveMap.put(Integer.TYPE, new TypeInfo(
"I", 1, (byte) 0x15, (byte) 0xac, Integer.class, "intValue"));
primitiveMap.put(Long.TYPE, new TypeInfo(
"J", 2, (byte) 0x16, (byte) 0xad, Long.class, "longValue"));
primitiveMap.put(Short.TYPE, new TypeInfo(
"S", 1, (byte) 0x15, (byte) 0xac, Short.class, "shortValue"));
primitiveMap.put(Float.TYPE, new TypeInfo(
"F", 1, (byte) 0x17, (byte) 0xae, Float.class, "floatValue"));
primitiveMap.put(Double.TYPE, new TypeInfo(
"D", 2, (byte) 0x18, (byte) 0xaf, Double.class, "doubleValue"));
primitiveMap.put(Void.TYPE, new TypeInfo(
"V", -1, (byte) 0xff, (byte) 0xb1, null, null));
}
TypeInfo(String typeDescriptor, int localSlots, byte loadInstruction,
byte returnInstruction, Class primitiveWrapper,
String valueMethod) {
this.typeDescriptor = typeDescriptor;
this.localSlots = localSlots;
this.loadInstruction = loadInstruction;
this.returnInstruction = returnInstruction;
this.primitiveWrapper = primitiveWrapper;
this.valueMethod = valueMethod;
}
static TypeInfo get(Class type) {
return (TypeInfo) primitiveMap.get(type);
}
static String descriptorFor(Class type) {
if (type.isPrimitive()) {
return get(type).typeDescriptor;
} else if (type.isArray()) {
return type.getName().replace('.', '/');
} else {
return "L" + type.getName().replace('.', '/') + ";";
}
}
static int localSlotsFor(Class type) {
if (type.isPrimitive()) {
return get(type).localSlots;
} else {
return 1;
}
}
}