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 booleanstatic INativeTypebuildArrayType(ITypeManager typeman, String lowestElementSignature, int... dimensions) Convenience routine to create an array type, possibly multi-dimensional.static StringbuildFullyQualifiedTypeNameFromElements(List<String> elements) static INativeTypebuildQuick(ITypeManager typeman, String signature) static IPrototypeItembuildQuickPrototype(ITypeManager typeman, String protoString) Generate a simple prototype item from a prototype string.static INativeTypebuildQuickType(ITypeManager typeman, String signature) Create an array or reference type using an existing base type.static booleancheckAliasedType(INativeType t, INativeType expectedType) Check if a type aliases another type.static List<INativeType>collectTypes(IPrototypeItem proto) static booleancontainsCppSeparator(String name) Fast check, equivalent tostring.contains(CPP_PACKAGE_SEPARATOR).static INativeTypeAttempt 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 StringgenerateRoutineSignature(String name, IPrototypeItem proto) Generate a routine signature given a prototype and a routine name.static INativeTypegetBaseType(INativeType type) Provide the base type of a type.static INativeTypeGet the first simple type embedded in the given type.static TypeLayoutInfostatic INativeTypestatic <T extends INativeType>
TgetNonAlias(INativeType t, Class<T> expected) static IStructureTypeFieldgetStructureField(INativeType t, int fieldStartOffset) Given a structure type (or an alias to one), retrieve the field at the provided offset.static IStructureTypeFieldgetStructureField(INativeType t, String fieldName) Given a structure type (or an alias to one), retrieve the field with the provided name.static booleanstatic booleanstatic booleanstatic booleanDetermine if the (unaliased) type is an array or a structure type.static booleanstatic booleanDetermine if the provided type is a function pointer, that is, a reference (aliased or not) to a prototype item.static booleanisFunctionPointer(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 booleanstatic booleanstatic booleanDetermine if the (unaliased) type is a reference type.static booleanDetermine if the (unaliased) type is a reference to a reference type.static booleanstatic booleanstatic booleanstatic booleanstatic booleanstatic booleanstatic booleanstatic booleanisValidFullyQualifiedName(String basesig, List<String> elements, String[] aname) Parse and validate the elements of a normalized signature (aka fully-qualified name).static booleanstatic booleanstatic booleanstatic booleanstatic StringnormalizeSignature(boolean alreadyPreNormalized, String signature, List<String> elements, int[] counts) Normalize a type signature (including reference types).static StringpreNormalizeSignature(String signature) static StringprocessSignature(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 booleansame(INativeType a, INativeType b) splitCppName(String fullName) Split a C++ name usingCPP_PACKAGE_SEPARATORas separator.splitCppParameters(String parameters) Split a list of C++ parameters separated by comma.static booleanstructureInStructure(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_SEPARATORas 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-normalizedsignature- 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 toTypeStringParserfor 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
-