Class TypeUtil
java.lang.Object
com.pnfsoftware.jeb.core.units.code.asm.type.TypeUtil
Utility routines for native types.
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic boolean
static INativeType
buildArrayType
(ITypeManager typeman, String lowestElementSignature, int... dimensions) Convenience routine to create an array type, possibly multi-dimensional.static String
buildFullyQualifiedTypeNameFromElements
(List<String> elements) static INativeType
buildQuick
(ITypeManager typeman, String signature) static IPrototypeItem
buildQuickPrototype
(ITypeManager typeman, String protoString) Generate a simple prototype item from a prototype string.static INativeType
buildQuickType
(ITypeManager typeman, String signature) Create an array or reference type using an existing base type.static boolean
checkAliasedType
(INativeType t, INativeType expectedType) Check if a type aliases another type.static List<INativeType>
collectTypes
(IPrototypeItem proto) static boolean
containsCppSeparator
(String name) Fast check, equivalent tostring.contains(CPP_PACKAGE_SEPARATOR)
.static INativeType
Attempt to retrieve a type equivalent to the provided input type, but whose string representation is shorter.static List<INativeType>
findType
(Collection<? extends INativeType> types, String pattern, boolean earlyExitOnFirstMatch) Find a type by pattern (partial name or signature, original or effective).static String
generateRoutineSignature
(String name, IPrototypeItem proto) Generate a routine signature given a prototype and a routine name.static INativeType
getBaseType
(INativeType type) Provide the base type of a type.static INativeType
Get the first simple type embedded in the given type.static TypeLayoutInfo
static INativeType
static <T extends INativeType>
TgetNonAlias
(INativeType t, Class<T> expected) static IStructureTypeField
getStructureField
(INativeType t, int fieldStartOffset) Given a structure type (or an alias to one), retrieve the field at the provided offset.static IStructureTypeField
getStructureField
(INativeType t, String fieldName) Given a structure type (or an alias to one), retrieve the field with the provided name.static boolean
static boolean
static boolean
static boolean
Determine if the (unaliased) type is an array or a structure type.static boolean
static boolean
Determine if the provided type is a function pointer, that is, a reference (aliased or not) to a prototype item.static boolean
isFunctionPointer
(INativeType t, IPrototypeItem[] aproto) Determine if the provided type is a function pointer, that is, a reference (aliased or not) to a prototype item.static boolean
static boolean
static boolean
Determine if the (unaliased) type is a reference type.static boolean
Determine if the (unaliased) type is a reference to a reference type.static boolean
static boolean
static boolean
static boolean
static boolean
static boolean
static boolean
static boolean
isValidFullyQualifiedName
(String basesig, List<String> elements, String[] aname) Parse and validate the elements of a normalized signature (aka fully-qualified name).static boolean
static boolean
static boolean
static boolean
static String
normalizeSignature
(boolean alreadyPreNormalized, String signature, List<String> elements, int[] counts) Normalize a type signature (including reference types).static String
preNormalizeSignature
(String signature) static String
processSignature
(String signature, int[] counts) Process non array or single-dimension arrays of reference or non-reference types.static List<INativeType>
retrieveAvailableTypes
(INativeCodeUnit<?> unit, int sourceFlags) static List<INativeType>
retrieveAvailableTypes
(INativeCodeUnit<?> unit, int sourceFlags, ISimpleFilter<INativeType> filter) static boolean
same
(INativeType a, INativeType b) splitCppName
(String fullName) Split a C++ name usingCPP_PACKAGE_SEPARATOR
as separator.splitCppParameters
(String parameters) Split a list of C++ parameters separated by comma.static boolean
structureInStructure
(IStructureType structType, INativeType type) Detect structure cycles: Determine if the second parameter type is or contains the structure type provided as the first parameter.
-
Field Details
-
CPP_PACKAGE_SEPARATOR
- See Also:
-
CPP_TEMPLATE_REGEXP
-
keywords
-
TYPESOURCE_INUSE
public static final int TYPESOURCE_INUSE- See Also:
-
TYPESOURCE_TYPELIBS
public static final int TYPESOURCE_TYPELIBS- See Also:
-
TYPESOURCE_ALL
public static final int TYPESOURCE_ALL- See Also:
-
-
Constructor Details
-
TypeUtil
public TypeUtil()
-
-
Method Details
-
isKeyword
-
isReservedLiteral
-
isValidPackageName
-
isValidTypeName
-
containsCppSeparator
Fast check, equivalent tostring.contains(CPP_PACKAGE_SEPARATOR)
.- Parameters:
name
- Potential CPP name with pacakges- Returns:
- true if string contains a CPP package separator. See
splitCppName(String)
to retrieve CPP elements.
-
isValidFullyQualifiedName
public static boolean isValidFullyQualifiedName(String basesig, List<String> elements, String[] aname) Parse and validate the elements of a normalized signature (aka fully-qualified name).- Parameters:
basesig
- normalized signature, dimension-less, reference-lesselements
- optional (output elements)aname
- optional (output name)- Returns:
-
splitCppName
Split a C++ name usingCPP_PACKAGE_SEPARATOR
as separator.For example, 'std
::pkg:titi' will be split into [std , pkg, titi] - Parameters:
fullName
-- Returns:
- list of names, never null
-
splitCppParameters
Split a list of C++ parameters separated by comma. Start/End Parentheses are optional.For example, 'std
::pkg:titi, long' will be split into ['std ::pkg:titi, long] - Parameters:
parameters
-- Returns:
- list of parameters, never null
-
processSignature
Process non array or single-dimension arrays of reference or non-reference types.- Parameters:
signature
- a pre-normalized signature of the typecounts
- optional output array, contains the reference count (0 if none) and the single-dimension array count (-1 if none)- Returns:
- the base signature (reference-less, dimension-less) of the base type; null on error
-
normalizeSignature
public static String normalizeSignature(boolean alreadyPreNormalized, String signature, List<String> elements, int[] counts) Normalize a type signature (including reference types).What it does: Make sure the type separator is "::" (not '.' or '/'). Remove header and trailer whitespace. Remove header "::" if any. Validate signature elements.
- Parameters:
alreadyPreNormalized
- true if the signature has beenpre-normalized
signature
- a non-canonical type signatureelements
- optional output list to hold the signature elements of the base type signaturecounts
- optional output two-element array, will hold the reference count and the dimension count of the provided signature; refer toprocessSignature(String, int[])
- Returns:
- the normalized signature, null on error
-
preNormalizeSignature
- Parameters:
signature
-- Returns:
- never return null
-
buildFullyQualifiedTypeNameFromElements
-
buildQuick
- Parameters:
typeman
-signature
-- Returns:
-
buildQuickType
Create an array or reference type using an existing base type. This method is for convenience only, and by no means exhaustive. Proper type building requires adequate parsing; refer toTLGen
. (TODO: bindings to support string type parsing provided byTLGen
).- Parameters:
typeman
-signature
- accepted signatures: abc, abc*, abc**, abc[6], abc*[10], abc**[20]; other type signatures are not accepted (eg, abc[2][4], abc[4]*, abc**[12], etc.)- Returns:
- the type item, null on error
-
buildArrayType
public static INativeType buildArrayType(ITypeManager typeman, String lowestElementSignature, int... dimensions) Convenience routine to create an array type, possibly multi-dimensional.- Parameters:
typeman
-lowestElementSignature
- finest element type (ideally, should be a non-array)dimensions
- highest dimensions first, eg, (2, 3, 4) -> type[2][3][4]- Returns:
- the type
-
isPrimitive
-
isReference
-
isPrototype
-
isSimple
-
isAlias
-
getNonAlias
-
getNonAlias
-
checkAliasedType
Check if a type aliases another type.- Parameters:
t
- the type to be checkedexpectedType
- the other type, supposedly aliased by the first parameter- Returns:
- true or false
-
isBitfieldCompatible
-
areBitfielTypesEquivalent
-
isPointer
Determine if the (unaliased) type is a reference type.- Parameters:
t
-- Returns:
-
isPointerToPointer
Determine if the (unaliased) type is a reference to a reference type.- Parameters:
t
-- Returns:
-
isCompositeType
Determine if the (unaliased) type is an array or a structure type.- Parameters:
t
-- Returns:
-
isFunctionPointer
Determine if the provided type is a function pointer, that is, a reference (aliased or not) to a prototype item.- Parameters:
t
-- Returns:
-
isFunctionPointer
Determine if the provided type is a function pointer, that is, a reference (aliased or not) to a prototype item.- Parameters:
t
- input typeaproto
- optional 1-element array receiving the prototype object on success- Returns:
- success indicator
-
isVoid
-
isVoidPointer
-
isCharacter
-
isInteger
-
isSignedInteger
-
isUnsignedInteger
-
isFloat
-
collectTypes
-
findType
public static List<INativeType> findType(Collection<? extends INativeType> types, String pattern, boolean earlyExitOnFirstMatch) Find a type by pattern (partial name or signature, original or effective). Does not include primitives.- Parameters:
types
- input typespattern
- type "pattern" (partial name or signature)earlyExitOnFirstMatch
- exit on first match: the returned list will contain one element- Returns:
- the list of candidates, possibly empty
-
structureInStructure
Detect structure cycles: Determine if the second parameter type is or contains the structure type provided as the first parameter.- Parameters:
structType
- the input structuretype
- the type to be vetted against the provided structure- Returns:
- true if a cycle was detected (the test type contains the structure type); false otherwise
-
getFirstSimpleType
Get the first simple type embedded in the given type.- Parameters:
type
-- Returns:
-
getBaseType
Provide the base type of a type. The base type of a pointer type is its non-pointer type; the base type of an array type is its dimension-less type. Primitive, class, structure, union, enumeration and alias types, as well as prototypes, are all considered base types.- Parameters:
type
-- Returns:
- the base type of type
-
getStructureField
Given a structure type (or an alias to one), retrieve the field with the provided name.- Parameters:
t
- a type whose non-alias should be a structurefieldName
- a field name- Returns:
- null if not found or on error
-
getStructureField
Given a structure type (or an alias to one), retrieve the field at the provided offset.- Parameters:
t
- a type whose non-alias should be a structurefieldStartOffset
- a field offset- Returns:
- null if not found or on error
-
buildQuickPrototype
Generate a simple prototype item from a prototype string. Complex prototypes cannot be parsed by this routine. Prototypes attributes other than var-arg (via `...`) are not supported either. Refer toTypeStringParser
for a full-blown C type and prototype parser.Format:
[<calling-convention>]returnType([param1Type[, param2Type[, ...]]])
Examples:void() int() unsigned int(char) <cdecl>char(int, int, int)
- Parameters:
typeman
-protoString
- see format above- Returns:
- a prototype item, null on error
- See Also:
-
retrieveAvailableTypes
-
retrieveAvailableTypes
public static List<INativeType> retrieveAvailableTypes(INativeCodeUnit<?> unit, int sourceFlags, ISimpleFilter<INativeType> filter) -
generateRoutineSignature
Generate a routine signature given a prototype and a routine name.- Parameters:
name
-proto
-- Returns:
-
same
- Parameters:
a
-b
-- Returns:
-
getLayoutInfo
-
findShorterForm
Attempt to retrieve a type equivalent to the provided input type, but whose string representation is shorter.- Parameters:
_t
- an input type- Returns:
- shorter form of the type (e.g. an existing alias), or the same input type if nothing was found
-