This is a basic implementation of the TypeDataBase interface. It allows an external type database builder to add types to be consumed by a client through the Type interfaces. It has no knowledge of symbol lookup; for example, the builder is responsible for providing the addresses of static fields.
Among other things, the database builder is responsible for providing the Types for the Java primitive types, as well as their sizes.
Modifier and Type | Field and Description |
---|---|
private static final boolean | DEBUG
For debugging |
private Type | jbooleanType
Primitive types. |
private Type | |
private Type | |
private Type | |
private Type | |
private Type | |
private Type | |
private Type | |
private MachineDescription | |
private Map | nameToIntConstantMap
Maps strings to Integers, used for enums, etc. |
private Map | nameToLongConstantMap
Maps strings to Longs, used for 32/64-bit constants, etc. |
private Map | nameToTypeMap
Maps strings to Type objects. |
private Map | |
private VtblAccess |
Access | Constructor and Description |
---|---|
public |
Modifier and Type | Method and Description |
---|---|
public void | addIntConstant(String name, int value)
This method should only be used by the builder of the TypeDataBase. |
public void | addLongConstant(String name, long value)
This method should only be used by the builder of the TypeDataBase. |
public boolean | addressTypeIsEqualToType(Address addr, Type type)
Implements sun. This is an experimental interface emulating C++'s run-time type information (RTTI) mechanism: determines whether the given address is a pointer to the start of a C++ object of precisely the given type -- it does not search superclasses of the type. |
public void | |
public long | |
public long | |
public Type | findDynamicTypeForAddress(Address addr, Type baseType)
Implements sun. |
public long | getAddressSize()
Implements sun. |
public Iterator | getIntConstants()
Implements sun. |
public Type | getJBooleanType()
Implements sun. |
public Type | |
public Type | |
public Type | |
public Type | |
public Type | |
public Type | |
public Type | |
public Iterator | getLongConstants()
Implements sun. |
public long | getOopSize()
Implements sun. |
public Iterator | getTypes()
Implements sun. |
public Type | guessTypeForAddress(Address addr)
Implements sun. |
public Integer | lookupIntConstant(String constantName)
Implements sun. |
public Integer | lookupIntConstant(String constantName, boolean throwException)
Implements sun. |
public Long | lookupLongConstant(String constantName)
Implements sun. |
public Long | lookupLongConstant(String constantName, boolean throwException)
Implements sun. |
public Type | lookupType(String cTypeName)
Implements sun. |
public Type | lookupType(String cTypeName, boolean throwException)
Implements sun. |
public void | |
public void | |
public void | |
public void | setJBooleanType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJByteType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJCharType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJDoubleType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJFloatType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJIntType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJLongType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public void | setJShortType(Type type)
This method should only be called by the builder of the TypeDataBase and at most once |
public Address |
DEBUG | back to summary |
---|---|
private static final boolean DEBUG For debugging |
jbooleanType | back to summary |
---|---|
private Type jbooleanType Primitive types. |
jbyteType | back to summary |
---|---|
private Type jbyteType |
jcharType | back to summary |
---|---|
private Type jcharType |
jdoubleType | back to summary |
---|---|
private Type jdoubleType |
jfloatType | back to summary |
---|---|
private Type jfloatType |
jintType | back to summary |
---|---|
private Type jintType |
jlongType | back to summary |
---|---|
private Type jlongType |
jshortType | back to summary |
---|---|
private Type jshortType |
machDesc | back to summary |
---|---|
private MachineDescription machDesc |
nameToIntConstantMap | back to summary |
---|---|
private Map<String, Integer> nameToIntConstantMap Maps strings to Integers, used for enums, etc. |
nameToLongConstantMap | back to summary |
---|---|
private Map<String, Long> nameToLongConstantMap Maps strings to Longs, used for 32/64-bit constants, etc. |
nameToTypeMap | back to summary |
---|---|
private Map<String, Type> nameToTypeMap Maps strings to Type objects. This does not contain the primitive types. |
typeToVtbl | back to summary |
---|---|
private Map<Type, Address> typeToVtbl |
vtblAccess | back to summary |
---|---|
private VtblAccess vtblAccess |
BasicTypeDataBase | back to summary |
---|---|
public BasicTypeDataBase(MachineDescription machDesc, VtblAccess vtblAccess) |
addIntConstant | back to summary |
---|---|
public void addIntConstant(String name, int value) This method should only be used by the builder of the TypeDataBase. Throws a RuntimeException if an integer constant with this name was already present. |
addLongConstant | back to summary |
---|---|
public void addLongConstant(String name, long value) This method should only be used by the builder of the TypeDataBase. Throws a RuntimeException if a long constant with this name was already present. |
addressTypeIsEqualToType | back to summary |
---|---|
public boolean addressTypeIsEqualToType(Address addr, Type type) Implements sun. Doc from sun. This is an experimental interface emulating C++'s run-time type information (RTTI) mechanism: determines whether the given address is a pointer to the start of a C++ object of precisely the given type -- it does not search superclasses of the type. The convention is that this returns false for the null pointer. It is needed to allow wrapper Java objects of the appropriate type to be constructed for existing C++ objects of polymorphic type. This method is only intended to work for C++ types (implying that we should rename this package and the classes contained within back to "ctypes"). Further, since the vptr offset in an object is known at compile time but not necessarily at runtime (unless debugging information is available), it is reasonable for an implementation of this method to search nearby memory for the (known) vtbl value for the given type. For this reason, this method is not intended to support scans through memory finding C++ objects, but is instead targeted towards discovering the true type of a pointer assumed to be intact. The reason this method was placed in the type database is that the latter is the first level at which it could be exposed, and placing it here could avoid modifying the Type interface. It is unclear what other, if any, vtbl access would be useful (or implementable), so we are trying to avoid changing interfaces at this point to support this kind of functionality. This method necessarily does not support multiple inheritance. |
addType | back to summary |
---|---|
public void addType(Type type) This method should only be used by the builder of the TypeDataBase. Throws a RuntimeException if a class with this name was already present. |
cIntegerTypeMaxValue | back to summary |
---|---|
public long cIntegerTypeMaxValue(long sizeInBytes, boolean isUnsigned) |
cIntegerTypeMinValue | back to summary |
---|---|
public long cIntegerTypeMinValue(long sizeInBytes, boolean isUnsigned) |
findDynamicTypeForAddress | back to summary |
---|---|
public Type findDynamicTypeForAddress(Address addr, Type baseType) Implements sun. Doc from sun. Helper routine for guessing the most derived type of a polymorphic C++ object. Requires a baseType that must be virtual so that lookup can be performed without false positives |
getAddressSize | back to summary |
---|---|
public long getAddressSize() Implements sun. Doc from sun. Returns the size of a C address in bytes. This is currently needed in order to properly traverse an array of pointers. Traversing an array of structs, for example, is possible by looking up the type of the struct and multiplying the index by its size when indexing off of a base Address. (FIXME: what about alignment?) |
getIntConstants | back to summary |
---|---|
public Iterator Implements sun. Doc from sun. Returns an Iterator over the String names of the integer constants in the database. |
getJBooleanType | back to summary |
---|---|
public Type getJBooleanType() Implements sun. Doc from sun. Accessors for types representing the Java primitive types; used for both proper type checking and for walking down Java arrays. |
getJByteType | back to summary |
---|---|
public Type getJByteType() Implements sun. |
getJCharType | back to summary |
---|---|
public Type getJCharType() Implements sun. |
getJDoubleType | back to summary |
---|---|
public Type getJDoubleType() Implements sun. |
getJFloatType | back to summary |
---|---|
public Type getJFloatType() Implements sun. |
getJIntType | back to summary |
---|---|
public Type getJIntType() Implements sun. |
getJLongType | back to summary |
---|---|
public Type getJLongType() Implements sun. |
getJShortType | back to summary |
---|---|
public Type getJShortType() Implements sun. |
getLongConstants | back to summary |
---|---|
public Iterator Implements sun. Doc from sun. Returns an Iterator over the String names of the long constants in the database. |
getOopSize | back to summary |
---|---|
public long getOopSize() Implements sun. Doc from sun. Returns the size of an oop in bytes. This is currently needed in order to properly traverse an array of oops; it is distinguished from the address size, above, because object pointers could conceivably have a different representation than direct pointers. Traversing an array of structs, for example, is possible by looking up the type of the struct and multiplying the index by its size when indexing off of a base Address. |
getTypes | back to summary |
---|---|
public Iterator Implements sun. Doc from sun. Returns an Iterator over the Types in the database. |
guessTypeForAddress | back to summary |
---|---|
public Type guessTypeForAddress(Address addr) Implements sun. Doc from sun. Helper routine for guessing the most derived type of a polymorphic C++ object. Iterates the type database calling addressTypeIsEqualToType for all known types. Returns a matching Type for the given address if one was found, or null if none was found. |
lookupIntConstant | back to summary |
---|---|
public Integer lookupIntConstant(String constantName) Implements sun. Doc from sun. Equivalent to lookupIntConstant(constantName, true) |
lookupIntConstant | back to summary |
---|---|
public Integer lookupIntConstant(String constantName, boolean throwException) Implements sun. |
lookupLongConstant | back to summary |
---|---|
public Long lookupLongConstant(String constantName) Implements sun. Doc from sun. Equivalent to lookupLongConstant(constantName, true) |
lookupLongConstant | back to summary |
---|---|
public Long lookupLongConstant(String constantName, boolean throwException) Implements sun. |
lookupType | back to summary |
---|---|
public Type lookupType(String cTypeName) Implements sun. Doc from sun. Equivalent to lookupType(cTypeName, true) |
lookupType | back to summary |
---|---|
public Type lookupType(String cTypeName, boolean throwException) Implements sun. Doc from sun. For simplicity of the initial implementation, this is not guaranteed to work for primitive types. If throwException is true, throws an (unspecified) run-time exception if the type is not found. |
removeIntConstant | back to summary |
---|---|
public void removeIntConstant(String name) This method should only be used by the builder of the TypeDataBase. Throws a RuntimeException if an integer constant with this name was not present. |
removeLongConstant | back to summary |
---|---|
public void removeLongConstant(String name) This method should only be used by the builder of the TypeDataBase. Throws a RuntimeException if a long constant with this name was not present. |
removeType | back to summary |
---|---|
public void removeType(Type type) This method should only be used by the builder of the TypeDataBase. Throws a RuntimeException if this class was not present. |
setJBooleanType | back to summary |
---|---|
public void setJBooleanType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJByteType | back to summary |
---|---|
public void setJByteType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJCharType | back to summary |
---|---|
public void setJCharType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJDoubleType | back to summary |
---|---|
public void setJDoubleType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJFloatType | back to summary |
---|---|
public void setJFloatType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJIntType | back to summary |
---|---|
public void setJIntType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJLongType | back to summary |
---|---|
public void setJLongType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
setJShortType | back to summary |
---|---|
public void setJShortType(Type type) This method should only be called by the builder of the TypeDataBase and at most once |
vtblForType | back to summary |
---|---|
public Address vtblForType(Type type) |