Package ghidra.program.model.data

# Class AbstractDataType

java.lang.Object
ghidra.program.model.data.AbstractDataType

All Implemented Interfaces:
  `DataType`

Direct Known Subclasses:
  `BitFieldDataType`, `DataTypeImpl`, `PartialUnion`

public abstract class AbstractDataType extends Object implements DataType
Base class for DataType classes. Many of the DataType methods are stubbed out so simple datatype classes can be created without implementing too many methods.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected CategoryPath`
  `categoryPath`
  `protected final DataTypeManager`
  `dataMgr`
  `protected static final TypeDefSettingsDefinition[]`
  `EMPTY_TYPEDEF_DEFINITIONS`
  `protected String`
  `name`

  ### Fields inherited from interface ghidra.program.model.data.DataType

  `CONFLICT_SUFFIX, DEFAULT, NO_LAST_CHANGE_TIME, NO_SOURCE_SYNC_TIME, TYPEDEF_ATTRIBUTE_PREFIX, TYPEDEF_ATTRIBUTE_SUFFIX, VOID`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `AbstractDataType(CategoryPath path, String name, DataTypeManager dataTypeManager)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addParent(DataType dt)`
  Inform this data type that it has the given parent
  TODO: This method is reserved for internal DB use.
  `void`
  `dataTypeAlignmentChanged(DataType dt)`
  Notification that the given datatype's alignment has changed.
  `void`
  `dataTypeDeleted(DataType dt)`
  Informs this datatype that the given datatype has been deleted.
  `void`
  `dataTypeNameChanged(DataType dt, String oldName)`
  Informs this datatype that its name has changed from the indicated old name.
  `void`
  `dataTypeReplaced(DataType oldDt, DataType newDt)`
  Informs this datatype that the given oldDT has been replaced with newDT
  `void`
  `dataTypeSizeChanged(DataType dt)`
  Notification that the given datatype's size has changed.
  `boolean`
  `dependsOn(DataType dt)`
  Check if this datatype depends on the existence of the given datatype.
  `byte[]`
  `encodeRepresentation(String repr, MemBuffer buf, Settings settings, int length)`
  Encode bytes according to the display format for this type.
  `byte[]`
  `encodeValue(Object value, MemBuffer buf, Settings settings, int length)`
  Encode bytes from an Object appropriate for this DataType.
  `CategoryPath`
  `getCategoryPath()`
  Gets the categoryPath associated with this datatype
  `final DataOrganization`
  `getDataOrganization()`
  Returns the DataOrganization associated with this data-type
  `protected static DataOrganization`
  `getDataOrganization(DataTypeManager dataMgr)`
  Get the `DataOrganization` which should be used by a `AbstractDataType` when associated with a specified `dataMgr`.
  `final DataTypeManager`
  `getDataTypeManager()`
  Get the DataTypeManager containing this datatype.
  `DataTypePath`
  `getDataTypePath()`
  Returns the dataTypePath for this datatype;
  `String`
  `getDefaultAbbreviatedLabelPrefix()`
  Returns the prefix to use for this datatype when an abbreviated prefix is desired.
  `String`
  `getDefaultLabelPrefix()`
  Returns the appropriate string to use as the default label prefix in the absence of any data.
  `String`
  `getDefaultLabelPrefix(MemBuffer buf, Settings settings, int len, DataTypeDisplayOptions options)`
  Returns the appropriate string to use as the default label prefix.
  `String`
  `getDefaultOffcutLabelPrefix(MemBuffer buf, Settings settings, int len, DataTypeDisplayOptions options, int offcutLength)`
  Returns the appropriate string to use as the default label prefix.
  `String`
  `getDisplayName()`
  Gets the name for referring to this datatype.
  `long`
  `getLastChangeTime()`
  Get the timestamp corresponding to the last time this type was changed within its datatype manager
  `long`
  `getLastChangeTimeInSourceArchive()`
  Get the timestamp corresponding to the last time this type was sync'd within its source archive
  `String`
  `getMnemonic(Settings settings)`
  Get the mnemonic for this DataType.
  `String`
  `getName()`
  Get the name of this datatype.
  `Collection<DataType>`
  `getParents()`
  Get the parents of this datatype.
  `final String`
  `getPathName()`
  Get the full category path name that includes this datatype's name.
  `SourceArchive`
  `getSourceArchive()`
  Get the source archive where this type originated
  `TypeDefSettingsDefinition[]`
  `getTypeDefSettingsDefinitions()`
  Get the list of all settings definitions for this datatype that may be used for an associated `TypeDef`.
  `UniversalID`
  `getUniversalID()`
  Get the universal ID for this datatype.
  `boolean`
  `hasLanguageDependantLength()`
  Indicates if the length of this data-type is determined based upon the `DataOrganization` obtained from the associated `DataTypeManager`.
  `boolean`
  `isDeleted()`
  Returns true if this datatype has been deleted and is no longer valid
  `boolean`
  `isEncodable()`
  Check if this type supports encoding (patching)
  `boolean`
  `isNotYetDefined()`
  Indicates if this datatype has not yet been fully defined.
  `boolean`
  `isZeroLength()`
  Indicates this datatype is defined with a zero length.
  `void`
  `removeParent(DataType dt)`
  Remove a parent datatype
  `void`
  `replaceWith(DataType dataType)`
  For datatypes that support change, this method replaces the internals of this datatype with the internals of the given datatype.
  `void`
  `setCategoryPath(CategoryPath path)`
  Set the categoryPath associated with this datatype
  `void`
  `setDescription(String description)`
  Sets a String briefly describing this DataType.
  `void`
  `setLastChangeTime(long lastChangeTime)`
  Sets the lastChangeTime for this datatype.
  `void`
  `setLastChangeTimeInSourceArchive(long lastChangeTimeInSourceArchive)`
  Sets the lastChangeTimeInSourceArchive for this datatype.
  `void`
  `setName(String name)`
  Sets the name of the datatype
  `void`
  `setNameAndCategory(CategoryPath path, String name)`
  Sets the name and category of a datatype at the same time.
  `void`
  `setSourceArchive(SourceArchive archive)`
  Set the source archive where this type originated
  `String`
  `toString()`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

  ### Methods inherited from interface ghidra.program.model.data.DataType

  `clone, copy, getAlignedLength, getAlignment, getDefaultSettings, getDescription, getLength, getRepresentation, getSettingsDefinitions, getValue, getValueClass, isEquivalent`

- ## Field Details

  - ### EMPTY_TYPEDEF_DEFINITIONS

    protected static final TypeDefSettingsDefinition[] EMPTY_TYPEDEF_DEFINITIONS

  - ### name

    protected String name

  - ### categoryPath

    protected CategoryPath categoryPath

  - ### dataMgr

    protected final DataTypeManager dataMgr

- ## Constructor Details

  - ### AbstractDataType

    protected AbstractDataType(CategoryPath path, String name, DataTypeManager dataTypeManager)

- ## Method Details

  - ### getTypeDefSettingsDefinitions

    public TypeDefSettingsDefinition[] getTypeDefSettingsDefinitions()
    Description copied from interface: `DataType`
    Get the list of all settings definitions for this datatype that may be used for an associated `TypeDef`. When used for an associated `TypeDef`, these settings will be considered during a `DataType.isEquivalent(DataType)` check and will be preserved during the resolve process.
    Specified by:
      `getTypeDefSettingsDefinitions` in interface `DataType`
    Returns:
      a list of the settings definitions for a `TypeDef` associated with this datatype.

  - ### getCategoryPath

    public CategoryPath getCategoryPath()
    Description copied from interface: `DataType`
    Gets the categoryPath associated with this datatype
    Specified by:
      `getCategoryPath` in interface `DataType`
    Returns:
      the datatype's category path

  - ### getDataTypeManager

    public final DataTypeManager getDataTypeManager()
    Description copied from interface: `DataType`
    Get the DataTypeManager containing this datatype.

    This association should not be used to indicate whether this DataType has been resolved, but is intended to indicate whether the appropriate DataOrganization is being used.

    Specified by:
      `getDataTypeManager` in interface `DataType`
    Returns:
      the DataTypeManager that is associated with this datatype.

  - ### getDataOrganization

    public final DataOrganization getDataOrganization()
    Description copied from interface: `DataType`
    Returns the DataOrganization associated with this data-type
    Specified by:
      `getDataOrganization` in interface `DataType`
    Returns:
      associated data organization

  - ### getDataOrganization

    protected static DataOrganization getDataOrganization(DataTypeManager dataMgr)
    Get the `DataOrganization` which should be used by a `AbstractDataType` when associated with a specified `dataMgr`. If a null `dataMgr` is specified the default `DataOrganization` will be returned.
    Parameters:
      `dataMgr` - datatype manager
    Returns:
      the `DataOrganization` which should be used by a `AbstractDataType` instance.

  - ### getDataTypePath

    public DataTypePath getDataTypePath()
    Description copied from interface: `DataType`
    Returns the dataTypePath for this datatype;
    Specified by:
      `getDataTypePath` in interface `DataType`
    Returns:
      the dataTypePath for this datatype;

  - ### getName

    public String getName()
    Description copied from interface: `DataType`
    Get the name of this datatype.
    Specified by:
      `getName` in interface `DataType`
    Returns:
      the name

  - ### getPathName

    public final String getPathName()
    Description copied from interface: `DataType`
    Get the full category path name that includes this datatype's name.

    If the category is null, then this just the datatype's name is returned.

    Specified by:
      `getPathName` in interface `DataType`
    Returns:
      the path, or just this type's name

  - ### getDisplayName

    public String getDisplayName()
    Description copied from interface: `DataType`
    Gets the name for referring to this datatype.
    Specified by:
      `getDisplayName` in interface `DataType`
    Returns:
      generic name for this Data Type (i.e.: Word)

  - ### getMnemonic

    public String getMnemonic(Settings settings)
    Description copied from interface: `DataType`
    Get the mnemonic for this DataType.
    Specified by:
      `getMnemonic` in interface `DataType`
    Parameters:
      `settings` - settings which may influence the result or null
    Returns:
      the mnemonic for this DataType.

  - ### isNotYetDefined

    public boolean isNotYetDefined()
    Description copied from interface: `DataType`
    Indicates if this datatype has not yet been fully defined.

    Such datatypes should always return a `DataType.getLength()` of 1 and true for `DataType.isZeroLength()`. (example: empty structure)

    Specified by:
      `isNotYetDefined` in interface `DataType`
    Returns:
      true if this type is not yet defined.

  - ### isZeroLength

    public boolean isZeroLength()
    Description copied from interface: `DataType`
    Indicates this datatype is defined with a zero length.

    This method should not be confused with `DataType.isNotYetDefined()` which indicates that nothing but the name and basic type is known.

    NOTE: a zero-length datatype must return a length of 1 via `DataType.getLength()`. Zero-length datatypes used as a component within a `Composite` may, or may not, be assigned a component length of 0. The method `DataTypeComponent.usesZeroLengthComponent(DataType)` is used to make this determination.

    Specified by:
      `isZeroLength` in interface `DataType`
    Returns:
      true if type definition has a length of 0, else false

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### isDeleted

    public boolean isDeleted()
    Description copied from interface: `DataType`
    Returns true if this datatype has been deleted and is no longer valid
    Specified by:
      `isDeleted` in interface `DataType`
    Returns:
      true if this datatype has been deleted and is no longer valid.

  - ### setName

    public void setName(String name) throws InvalidNameException
    Description copied from interface: `DataType`
    Sets the name of the datatype
    Specified by:
      `setName` in interface `DataType`
    Parameters:
      `name` - the new name for this datatype.
    Throws:
      `InvalidNameException` - if the given name does not form a valid name.

  - ### setNameAndCategory

    public void setNameAndCategory(CategoryPath path, String name) throws InvalidNameException
    Description copied from interface: `DataType`
    Sets the name and category of a datatype at the same time.
    Specified by:
      `setNameAndCategory` in interface `DataType`
    Parameters:
      `path` - the new category path.
      `name` - the new name
    Throws:
      `InvalidNameException` - if the name is invalid

  - ### dataTypeSizeChanged

    public void dataTypeSizeChanged(DataType dt)
    Description copied from interface: `DataType`
    Notification that the given datatype's size has changed.

    DataTypes may need to make internal changes in response.
    TODO: This method is reserved for internal DB use.

    Specified by:
      `dataTypeSizeChanged` in interface `DataType`
    Parameters:
      `dt` - the datatype that has changed.

  - ### dataTypeAlignmentChanged

    public void dataTypeAlignmentChanged(DataType dt)
    Description copied from interface: `DataType`
    Notification that the given datatype's alignment has changed.

    DataTypes may need to make internal changes in response.
    TODO: This method is reserved for internal DB use.

    Specified by:
      `dataTypeAlignmentChanged` in interface `DataType`
    Parameters:
      `dt` - the datatype that has changed.

  - ### dataTypeDeleted

    public void dataTypeDeleted(DataType dt)
    Description copied from interface: `DataType`
    Informs this datatype that the given datatype has been deleted.

    TODO: This method is reserved for internal DB use.

    Specified by:
      `dataTypeDeleted` in interface `DataType`
    Parameters:
      `dt` - the datatype that has been deleted.

  - ### dataTypeReplaced

    public void dataTypeReplaced(DataType oldDt, DataType newDt)
    Description copied from interface: `DataType`
    Informs this datatype that the given oldDT has been replaced with newDT

    TODO: This method is reserved for internal DB use.

    Specified by:
      `dataTypeReplaced` in interface `DataType`
    Parameters:
      `oldDt` - old datatype
      `newDt` - new datatype

  - ### addParent

    public void addParent(DataType dt)
    Description copied from interface: `DataType`
    Inform this data type that it has the given parent
    TODO: This method is reserved for internal DB use.
    Specified by:
      `addParent` in interface `DataType`
    Parameters:
      `dt` - parent data type

  - ### removeParent

    public void removeParent(DataType dt)
    Description copied from interface: `DataType`
    Remove a parent datatype

    TODO: This method is reserved for internal DB use.

    Specified by:
      `removeParent` in interface `DataType`
    Parameters:
      `dt` - parent datatype

  - ### getParents

    public Collection<DataType> getParents()
    Description copied from interface: `DataType`
    Get the parents of this datatype. NOTE: This method is intended to be used on a DB-managed datatype only and is not fully supported for use with non-DB datatype instances.
    Specified by:
      `getParents` in interface `DataType`
    Returns:
      parents of this datatype

  - ### dependsOn

    public boolean dependsOn(DataType dt)
    Description copied from interface: `DataType`
    Check if this datatype depends on the existence of the given datatype.

    For example byte[] depends on byte. If byte were deleted, then byte[] would also be deleted.

    Specified by:
      `dependsOn` in interface `DataType`
    Parameters:
      `dt` - the datatype to test that this datatype depends on.
    Returns:
      true if the existence of this datatype relies on the existence of the specified datatype dt.

  - ### getSourceArchive

    public SourceArchive getSourceArchive()
    Description copied from interface: `DataType`
    Get the source archive where this type originated
    Specified by:
      `getSourceArchive` in interface `DataType`
    Returns:
      source archive object

  - ### setSourceArchive

    public void setSourceArchive(SourceArchive archive)
    Description copied from interface: `DataType`
    Set the source archive where this type originated
    Specified by:
      `setSourceArchive` in interface `DataType`
    Parameters:
      `archive` - source archive object

  - ### getLastChangeTime

    public long getLastChangeTime()
    Description copied from interface: `DataType`
    Get the timestamp corresponding to the last time this type was changed within its datatype manager
    Specified by:
      `getLastChangeTime` in interface `DataType`
    Returns:
      timestamp of last change within datatype manager

  - ### getLastChangeTimeInSourceArchive

    public long getLastChangeTimeInSourceArchive()
    Description copied from interface: `DataType`
    Get the timestamp corresponding to the last time this type was sync'd within its source archive
    Specified by:
      `getLastChangeTimeInSourceArchive` in interface `DataType`
    Returns:
      timestamp of last sync with source archive

  - ### getUniversalID

    public UniversalID getUniversalID()
    Description copied from interface: `DataType`
    Get the universal ID for this datatype.

    This value is intended to be a unique identifier across all programs and archives. The same ID indicates that two datatypes were originally the same one. Keep in mind names, categories, and component makeup may differ and have changed since there origin.

    Specified by:
      `getUniversalID` in interface `DataType`
    Returns:
      datatype UniversalID

  - ### dataTypeNameChanged

    public void dataTypeNameChanged(DataType dt, String oldName)
    Description copied from interface: `DataType`
    Informs this datatype that its name has changed from the indicated old name.

    TODO: This method is reserved for internal DB use.

    Specified by:
      `dataTypeNameChanged` in interface `DataType`
    Parameters:
      `dt` - the datatype whose name changed
      `oldName` - the datatype's old name

  - ### replaceWith

    public void replaceWith(DataType dataType)
    Description copied from interface: `DataType`
    For datatypes that support change, this method replaces the internals of this datatype with the internals of the given datatype.

    The datatypes must be of the same "type" (i.e. structure can only be replacedWith another structure.

    Specified by:
      `replaceWith` in interface `DataType`
    Parameters:
      `dataType` - the datatype that contains the internals to upgrade to.

  - ### setLastChangeTime

    public void setLastChangeTime(long lastChangeTime)
    Description copied from interface: `DataType`
    Sets the lastChangeTime for this datatype.

    Normally, this is updated automatically when a datatype is changed, but when committing or updating while synchronizing an archive, the lastChangeTime may need to be updated externally.

    Specified by:
      `setLastChangeTime` in interface `DataType`
    Parameters:
      `lastChangeTime` - the time to use as the lastChangeTime for this datatype

  - ### setLastChangeTimeInSourceArchive

    public void setLastChangeTimeInSourceArchive(long lastChangeTimeInSourceArchive)
    Description copied from interface: `DataType`
    Sets the lastChangeTimeInSourceArchive for this datatype.

    This is used by when a datatype change is committed back to its source archive.

    Specified by:
      `setLastChangeTimeInSourceArchive` in interface `DataType`
    Parameters:
      `lastChangeTimeInSourceArchive` - the time to use as the lastChangeTimeInSourceArchive for this datatype

  - ### setDescription

    public void setDescription(String description) throws UnsupportedOperationException
    Description copied from interface: `DataType`
    Sets a String briefly describing this DataType.
    Specified by:
      `setDescription` in interface `DataType`
    Parameters:
      `description` - a one-liner describing this DataType.
    Throws:
      `UnsupportedOperationException` - if the description is not allowed to be set for this datatype.

  - ### hasLanguageDependantLength

    public boolean hasLanguageDependantLength()
    Description copied from interface: `DataType`
    Indicates if the length of this data-type is determined based upon the `DataOrganization` obtained from the associated `DataTypeManager`.
    Specified by:
      `hasLanguageDependantLength` in interface `DataType`
    Returns:
      true length is language/compiler-specification dependent, else false

  - ### getDefaultLabelPrefix

    public String getDefaultLabelPrefix()
    Description copied from interface: `DataType`
    Returns the appropriate string to use as the default label prefix in the absence of any data.
    Specified by:
      `getDefaultLabelPrefix` in interface `DataType`
    Returns:
      the default label prefix or null if none specified.

  - ### getDefaultAbbreviatedLabelPrefix

    public String getDefaultAbbreviatedLabelPrefix()
    Description copied from interface: `DataType`
    Returns the prefix to use for this datatype when an abbreviated prefix is desired.

    For example, some datatypes will build a large default label, at which it is more desirable to have a shortened prefix.

    Specified by:
      `getDefaultAbbreviatedLabelPrefix` in interface `DataType`
    Returns:
      the prefix to use for this datatype when an abbreviated prefix is desired. May return null.

  - ### setCategoryPath

    public void setCategoryPath(CategoryPath path)
    Description copied from interface: `DataType`
    Set the categoryPath associated with this datatype
    Specified by:
      `setCategoryPath` in interface `DataType`
    Parameters:
      `path` - the new path

  - ### getDefaultLabelPrefix

    public String getDefaultLabelPrefix(MemBuffer buf, Settings settings, int len, DataTypeDisplayOptions options)
    Description copied from interface: `DataType`
    Returns the appropriate string to use as the default label prefix.
    Specified by:
      `getDefaultLabelPrefix` in interface `DataType`
    Parameters:
      `buf` - memory buffer containing the bytes.
      `settings` - the Settings object
      `len` - the length of the data.
      `options` - options for how to format the default label prefix.
    Returns:
      the default label prefix or null if none specified.

  - ### getDefaultOffcutLabelPrefix

    public String getDefaultOffcutLabelPrefix(MemBuffer buf, Settings settings, int len, DataTypeDisplayOptions options, int offcutLength)
    Description copied from interface: `DataType`
    Returns the appropriate string to use as the default label prefix.

    This takes into account the fact that there exists a reference to the data that references `offcutLength` bytes into this type

    Specified by:
      `getDefaultOffcutLabelPrefix` in interface `DataType`
    Parameters:
      `buf` - memory buffer containing the bytes.
      `settings` - the Settings object
      `len` - the length of the data.
      `options` - options for how to format the default label prefix.
      `offcutLength` - offset into datatype
    Returns:
      the default label prefix.

  - ### isEncodable

    public boolean isEncodable()
    Description copied from interface: `DataType`
    Check if this type supports encoding (patching)

    If unsupported, `DataType.encodeValue(Object, MemBuffer, Settings, int)` and `DataType.encodeRepresentation(String, MemBuffer, Settings, int)` will always throw an exception. Actions which rely on either `encode` method should not be displayed if the applicable datatype is not encodable.

    Specified by:
      `isEncodable` in interface `DataType`
    Returns:
      true if encoding is supported

  - ### encodeValue

    public byte[] encodeValue(Object value, MemBuffer buf, Settings settings, int length) throws DataTypeEncodeException
    Description copied from interface: `DataType`
    Encode bytes from an Object appropriate for this DataType.

    Converts the given object to the byte encoding and returns it. When appropriate, this should seek the nearest encoding to the specified value, since the object may come from a user script. For example, a floating-point value may be rounded. Invalid values should be rejected with a `DataTypeEncodeException`.

    Specified by:
      `encodeValue` in interface `DataType`
    Parameters:
      `value` - the desired value.
      `buf` - a buffer representing the eventual destination of the bytes.
      `settings` - the settings to use.
      `length` - the expected length of the result, usually the length of the data unit, or -1 to let the type choose the length. It may be ignored, e.g., for fixed-length types.
    Returns:
      the encoded value.
    Throws:
      `DataTypeEncodeException` - if the value cannot be encoded for any reason, e.g., incorrect type, not enough space, buffer overflow, unsupported (see `DataType.isEncodable()`).

  - ### encodeRepresentation

    public byte[] encodeRepresentation(String repr, MemBuffer buf, Settings settings, int length) throws DataTypeEncodeException
    Description copied from interface: `DataType`
    Encode bytes according to the display format for this type.

    Converts the given representation to the byte encoding and returns it. When appropriate, this should seek the nearest encoding to the specified value, since the representation is likely coming from user input. For example, a floating-point value may be rounded. Invalid representations should be rejected with a `DataTypeEncodeException`.

    Specified by:
      `encodeRepresentation` in interface `DataType`
    Parameters:
      `repr` - the representation of the desired value, as in `DataType.getRepresentation(MemBuffer, Settings, int)`. The supported formats depend on the specific datatype and its settings.
      `buf` - a buffer representing the eventual destination of the bytes.
      `settings` - the settings to use for the representation.
      `length` - the expected length of the result, usually the length of the data unit, or -1 to let the type choose the length. It may be ignored, e.g., for fixed-length types.
    Returns:
      the encoded value.
    Throws:
      `DataTypeEncodeException` - if the value cannot be encoded for any reason, e.g., incorrect format, not enough space, buffer overflow, unsupported (see `DataType.isEncodable()`).