Merge remote-tracking branch 'origin/GP-932_ghidra1_isDynamicallySized'

This commit is contained in:
ghidra1 2021-05-12 11:02:02 -04:00
commit 65e4c704ec
83 changed files with 320 additions and 390 deletions

View file

@ -947,7 +947,7 @@ public class DataTypeMergeManager implements MergeResolver {
}
if (resolvedDt != null) {
return PointerDataType.getPointer(resolvedDt,
pointerDt.isDynamicallySized() ? -1 : pointerDt.getLength());
pointerDt.hasLanguageDependantLength() ? -1 : pointerDt.getLength());
}
}
return null;

View file

@ -456,7 +456,7 @@ public class DataTypeUtils {
if (dataType instanceof Pointer) {
Pointer pdt = (Pointer) dataType;
return new PointerDataType(copyToNamedBaseDataType(pdt.getDataType(), dtm),
pdt.isDynamicallySized() ? -1 : pdt.getLength(), dtm);
pdt.hasLanguageDependantLength() ? -1 : pdt.getLength(), dtm);
}
else if (dataType instanceof Array) {
Array adt = (Array) dataType;

View file

@ -40,11 +40,6 @@ public class StackPieceDataType extends DataTypeImpl {
return var.getDataType().getName() + ":" + pieceLen + " (piece)";
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -165,9 +165,4 @@ public abstract class AbstractLeb128DataType extends BuiltIn implements Dynamic
return false;
}
@Override
public boolean isDynamicallySized() {
return true;
}
}

View file

@ -44,11 +44,6 @@ public class DwarfEncodingModeDataType extends BuiltIn {
super(CategoryPath.ROOT, "dwfenc", dtm);
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -67,11 +67,6 @@ public class PcRelative31AddressDataType extends BuiltIn {
return name;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public int getLength() {
return 4;

View file

@ -84,8 +84,17 @@ public class FdeTable {
DataType encodedDt = decoder.getDataType(prog);
if (encodedDt.isDynamicallySized()) {
throw new ExceptionHandlerFrameException("Cannot build FDE structure with dynamically-encoded values");
if (encodedDt.getLength() <= 0) {
throw new ExceptionHandlerFrameException(
"Cannot build FDE structure with Dynamic or Void value type: " +
encodedDt.getClass().getName());
}
if (encodedDt.hasLanguageDependantLength()) {
// Should avoid using value types whose size fluctuates with Data Organization
throw new ExceptionHandlerFrameException(
"Cannot build FDE structure with dynamically-sized value type: " +
encodedDt.getClass().getName());
}
fdeTableEntry.deleteAll();

View file

@ -1418,7 +1418,7 @@ public class DWARFDataTypeImporter {
for (int i = ptrChainTypes.size() - 1; i >= 0; i--) {
Pointer origPtr = ptrChainTypes.get(i);
result = new PointerDataType(result,
origPtr.isDynamicallySized() ? -1 : origPtr.getLength(), dataTypeManager);
origPtr.hasLanguageDependantLength() ? -1 : origPtr.getLength(), dataTypeManager);
}
return result;

View file

@ -34,11 +34,6 @@ class MSRichProductBuildNumberDataType extends DataTypeImpl {
this.compid = compid;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -34,11 +34,6 @@ class MSRichProductIDDataType extends DataTypeImpl {
this.compid = compid;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -34,7 +34,7 @@ class MSRichProductInfoDataType extends StructureDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}

View file

@ -128,7 +128,7 @@ public class PERichTableDataType extends DynamicDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}
@ -193,7 +193,7 @@ public class PERichTableDataType extends DynamicDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}
@ -259,7 +259,7 @@ public class PERichTableDataType extends DynamicDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}

View file

@ -34,11 +34,6 @@ class RichObjectCountDataType extends DataTypeImpl {
this.count = count;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -35,7 +35,7 @@ class RichTableRecordDataType extends StructureDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}

View file

@ -21,9 +21,9 @@ package ghidra.app.util.datatype.microsoft;
import ghidra.docking.settings.Settings;
import ghidra.docking.settings.SettingsDefinition;
import ghidra.program.model.data.*;
import ghidra.program.model.lang.ProcessorContext;
import ghidra.program.model.mem.MemBuffer;
import ghidra.util.*;
import ghidra.util.Conv;
import ghidra.util.DataConverter;
import ghidra.util.classfinder.ClassTranslator;
/**
@ -76,11 +76,6 @@ public class GuidDataType extends BuiltIn {
return SIZE;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getDescription() {
return NAME;
@ -130,8 +125,9 @@ public class GuidDataType extends BuiltIn {
retVal += Conv.toHexString((short) (data[1] >> 16)) + delim;
for (int i = 0; i < 4; i++) {
retVal += Conv.toHexString((byte) (data[2] >> i * 8));
if (i == 1)
if (i == 1) {
retVal += delim;
}
}
for (int i = 0; i < 4; i++) {
retVal += Conv.toHexString((byte) (data[3] >> i * 8));
@ -166,6 +162,7 @@ public class GuidDataType extends BuiltIn {
return NAME;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {
return this;

View file

@ -31,11 +31,6 @@ public class HTMLResourceDataType extends BuiltIn implements Dynamic {
super(null, "HTML-Resource", dtm);
}
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -36,6 +36,7 @@ public class ElfDataType extends FactoryStructureDataType {
super("ELF", dtm);
}
@Override
public String getMnemonic(Settings settings) {
return "ELF";
}
@ -44,13 +45,6 @@ public class ElfDataType extends FactoryStructureDataType {
public String getDescription() {
return "ELF Data Type";
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return true;
}
@Override
protected void populateDynamicStructure(MemBuffer buf, Structure struct) {

View file

@ -31,7 +31,6 @@ import ghidra.util.exception.DuplicateNameException;
* A datatype for creating portable executable data structures.
*/
public class PeDataType extends FactoryStructureDataType {
private final static long serialVersionUID = 1;
/**
* Constructs a new PE datatype.
@ -53,14 +52,6 @@ public class PeDataType extends FactoryStructureDataType {
public String getDescription() {
return "Windows Portable Executable Data Type";
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
protected void populateDynamicStructure(MemBuffer buf, Structure struct) {

View file

@ -111,8 +111,8 @@ class ArrayDB extends DataTypeDB implements Array {
}
@Override
public boolean isDynamicallySized() {
return getDataType().isDynamicallySized();
public boolean hasLanguageDependantLength() {
return getDataType().hasLanguageDependantLength();
}
@Override

View file

@ -189,10 +189,8 @@ abstract class CompositeDB extends DataTypeDB implements CompositeInternal {
}
@Override
public boolean isDynamicallySized() {
return isPackingEnabled();
}
public abstract boolean hasLanguageDependantLength();
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) {
return null;
@ -285,27 +283,33 @@ abstract class CompositeDB extends DataTypeDB implements CompositeInternal {
/**
* This method throws an exception if the indicated data type is not a valid
* data type for a component of this composite data type.
* data type for a component of this composite data type. If the DEFAULT
* datatype is specified when unsupported an Undefined1 will be returned
* in its place (e.g., packing enabled, Union).
*
* @param dataType the data type to be checked.
* @return datatype to be used for insert/add
* @throws IllegalArgumentException if the data type is invalid.
*/
protected void validateDataType(DataType dataType) {
if (isPackingEnabled() && dataType == DataType.DEFAULT) {
throw new IllegalArgumentException(
"The DEFAULT data type is not allowed in an aligned composite data type.");
protected DataType validateDataType(DataType dataType) {
if (dataType == DataType.DEFAULT) {
if (isPackingEnabled() || (this instanceof Union)) {
return Undefined1DataType.dataType;
}
return dataType;
}
if (dataType instanceof FactoryDataType) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
else if (dataType instanceof Dynamic) {
if (dataType instanceof Dynamic) {
Dynamic dynamicDataType = (Dynamic) dataType;
if (!dynamicDataType.canSpecifyLength()) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
}
else if (dataType instanceof FactoryDataType || dataType.getLength() <= 0) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
return dataType;
}
@Override

View file

@ -2314,7 +2314,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager {
}
else if (dt instanceof Pointer) {
Pointer ptr = (Pointer) dt;
int len = ptr.isDynamicallySized() ? -1 : ptr.getLength();
int len = ptr.hasLanguageDependantLength() ? -1 : ptr.getLength();
newDataType = createPointer(ptr.getDataType(), cat, (byte) len, handler);
}
else if (dt instanceof StructureInternal) {

View file

@ -155,7 +155,7 @@ class EnumDB extends DataTypeDB implements Enum {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}

View file

@ -87,7 +87,7 @@ class FunctionDefinitionDB extends DataTypeDB implements FunctionDefinition {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false;
}

View file

@ -126,7 +126,7 @@ class PointerDB extends DataTypeDB implements Pointer {
return this;
}
// don't clone referenced data-type to avoid potential circular reference
return new PointerDataType(getDataType(), isDynamicallySized() ? -1 : getLength(), dtm);
return new PointerDataType(getDataType(), hasLanguageDependantLength() ? -1 : getLength(), dtm);
}
@Override
@ -148,7 +148,7 @@ class PointerDB extends DataTypeDB implements Pointer {
DataType dt = getDataType();
if (dt == null) {
displayName = PointerDataType.POINTER_NAME;
if (!isDynamicallySized()) {
if (!hasLanguageDependantLength()) {
displayName += Integer.toString(getLength() * 8);
}
}
@ -180,7 +180,7 @@ class PointerDB extends DataTypeDB implements Pointer {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
lock.acquire();
try {
checkIsValid();
@ -213,7 +213,7 @@ class PointerDB extends DataTypeDB implements Pointer {
try {
checkIsValid();
StringBuffer sbuf = new StringBuffer();
if (!isDynamicallySized()) {
if (!hasLanguageDependantLength()) {
sbuf.append(Integer.toString(getLength() * 8));
sbuf.append("-bit ");
}
@ -291,10 +291,10 @@ class PointerDB extends DataTypeDB implements Pointer {
Pointer p = (Pointer) dt;
DataType otherDataType = p.getDataType();
if (isDynamicallySized() != p.isDynamicallySized()) {
if (hasLanguageDependantLength() != p.hasLanguageDependantLength()) {
return false;
}
if (!isDynamicallySized() && (getLength() != p.getLength())) {
if (!hasLanguageDependantLength() && (getLength() != p.getLength())) {
return false;
}
@ -447,7 +447,7 @@ class PointerDB extends DataTypeDB implements Pointer {
@Override
public Pointer newPointer(DataType dataType) {
if (isDynamicallySized()) {
if (hasLanguageDependantLength()) {
return new PointerDataType(dataType, dataMgr);
}
return new PointerDataType(dataType, getLength(), dataMgr);

View file

@ -119,7 +119,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
checkDeleted();
if (validatePackAndNotify) {
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = resolve(dataType);
checkAncestry(dataType);
}
@ -178,12 +178,14 @@ class StructureDB extends CompositeDB implements StructureInternal {
checkDeleted();
if (validatePackAndNotify) {
validateDataType(dataType);
dataType = resolve(dataType);
if (isInvalidFlexArrayDataType(dataType)) {
throw new IllegalArgumentException(
"Unsupported flexType: " + dataType.getDisplayName());
}
validateDataType(dataType);
dataType = resolve(dataType);
checkAncestry(dataType);
}
@ -262,7 +264,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
if (ordinal == numComponents) {
return add(dataType, length, name, comment);
}
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = resolve(dataType);
checkAncestry(dataType);
@ -819,6 +821,11 @@ class StructureDB extends CompositeDB implements StructureInternal {
}
}
@Override
public boolean hasLanguageDependantLength() {
return isPackingEnabled();
}
@Override
public void clearComponent(int ordinal) {
lock.acquire();
@ -1047,7 +1054,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
lock.acquire();
try {
checkDeleted();
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = resolve(dataType);
checkAncestry(dataType);
@ -1121,7 +1128,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
throw new IndexOutOfBoundsException(ordinal);
}
validateDataType(dataType);
dataType = validateDataType(dataType);
DataTypeComponent origDtc = getComponent(ordinal);
if (origDtc.isBitFieldComponent()) {
@ -1182,7 +1189,7 @@ class StructureDB extends CompositeDB implements StructureInternal {
try {
checkDeleted();
validateDataType(dataType);
dataType = validateDataType(dataType);
DataTypeComponent origDtc = getComponentAt(offset);
if (origDtc.isBitFieldComponent()) {

View file

@ -61,8 +61,8 @@ class TypedefDB extends DataTypeDB implements TypeDef {
}
@Override
public boolean isDynamicallySized() {
return getDataType().isDynamicallySized();
public boolean hasLanguageDependantLength() {
return getDataType().hasLanguageDependantLength();
}
@Override

View file

@ -130,7 +130,7 @@ class UnionDB extends CompositeDB implements UnionInternal {
private DataTypeComponent doAdd(DataType dataType, int length, String name, String comment,
boolean validateAlignAndNotify) throws DataTypeDependencyException {
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = adjustBitField(dataType);
@ -178,7 +178,7 @@ class UnionDB extends CompositeDB implements UnionInternal {
lock.acquire();
try {
checkDeleted();
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = adjustBitField(dataType);
@ -471,6 +471,12 @@ class UnionDB extends CompositeDB implements UnionInternal {
}
}
@Override
public boolean hasLanguageDependantLength() {
// Assume any component may have a language-dependent length
return true;
}
@Override
protected void fixupComponents() {
boolean changed = false;

View file

@ -81,14 +81,6 @@ public class AIFFDataType extends BuiltIn implements Dynamic {
return false;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -85,14 +85,6 @@ public class AUDataType extends BuiltIn implements Dynamic {
return false;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -91,11 +91,6 @@ public abstract class AbstractComplexDataType extends BuiltIn {
return "The data type for a complex number: a + bi";
}
@Override
public boolean isDynamicallySized() {
return false;
}
private static double toDouble(Object obj) {
if (obj instanceof Double) {
return (Double) obj;

View file

@ -232,7 +232,7 @@ public abstract class AbstractDataType implements DataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return false; // not applicable
}

View file

@ -47,14 +47,6 @@ public abstract class AbstractFloatDataType extends BuiltIn {
return name;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/**
*
* @see ghidra.program.model.data.DataType#getDescription()
@ -125,7 +117,7 @@ public abstract class AbstractFloatDataType extends BuiltIn {
@Override
public String getCTypeDeclaration(DataOrganization dataOrganization) {
return isDynamicallySized() ? null : name;
return hasLanguageDependantLength() ? null : name;
}
private static TreeMap<Integer, AbstractFloatDataType> floatTypes; // fixed-size float types

View file

@ -58,11 +58,6 @@ abstract class AbstractImageBaseOffsetDataType extends BuiltIn {
return getScalarDataType().getLength();
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) {
Address addr = (Address) getValue(buf, settings, length);

View file

@ -65,14 +65,6 @@ public abstract class AbstractIntegerDataType extends BuiltIn implements ArraySt
this.signed = signed;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/**
* Return the Format settings definition included in the settings
* definition array

View file

@ -195,11 +195,6 @@ abstract public class AbstractStringDataType extends BuiltIn
StringDataInstance.DEFAULT_CHARSET_NAME);
}
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public int getLength() {
return -1;

View file

@ -78,14 +78,6 @@ public class AlignmentDataType extends BuiltIn implements Dynamic {
return new AlignmentDataType(dtm);
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public String getDescription() {
return "Consumes alignment/repeating bytes.";

View file

@ -88,8 +88,8 @@ public class ArrayDataType extends DataTypeImpl implements Array {
}
@Override
public boolean isDynamicallySized() {
return dataType.isDynamicallySized();
public boolean hasLanguageDependantLength() {
return dataType.hasLanguageDependantLength();
}
@Override

View file

@ -43,6 +43,7 @@ public class BadDataType extends BuiltIn implements Dynamic {
*
* @see ghidra.program.model.data.DataType#getMnemonic(Settings)
*/
@Override
public String getMnemonic(Settings settings) {
return getName();
}
@ -51,21 +52,16 @@ public class BadDataType extends BuiltIn implements Dynamic {
*
* @see ghidra.program.model.data.DataType#getLength()
*/
@Override
public int getLength() {
return -1;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return false;
}
/**
*
* @see ghidra.program.model.data.DataType#getDescription()
*/
@Override
public String getDescription() {
return "** Bad Data Type **";
}
@ -74,6 +70,7 @@ public class BadDataType extends BuiltIn implements Dynamic {
*
* @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int)
*/
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) {
return getDescription();
}
@ -87,10 +84,12 @@ public class BadDataType extends BuiltIn implements Dynamic {
*
* @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int)
*/
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) {
return getDescription();
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {
return this;
@ -98,14 +97,17 @@ public class BadDataType extends BuiltIn implements Dynamic {
return new BadDataType(dtm);
}
@Override
public boolean canSpecifyLength() {
return true;
}
@Override
public int getLength(MemBuffer buf, int maxLength) {
return -1;
}
@Override
public DataType getReplacementBaseType() {
return null;
}

View file

@ -28,8 +28,6 @@ import ghidra.program.model.mem.MemoryAccessException;
*/
public class BooleanDataType extends AbstractIntegerDataType {
private final static long serialVersionUID = 1;
private static SettingsDefinition[] SETTINGS_DEFS = {};
public static final BooleanDataType dataType = new BooleanDataType();
@ -52,8 +50,9 @@ public class BooleanDataType extends AbstractIntegerDataType {
@Override
public String getDecompilerDisplayName(DecompilerLanguage language) {
if (language == DecompilerLanguage.JAVA_LANGUAGE)
if (language == DecompilerLanguage.JAVA_LANGUAGE) {
return "boolean";
}
return name;
}
@ -67,11 +66,6 @@ public class BooleanDataType extends AbstractIntegerDataType {
return 1; // TODO: Size should probably be based upon data organization
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getDescription() {
return "Boolean";

View file

@ -99,7 +99,7 @@ public class CharDataType extends AbstractIntegerDataType implements DataTypeWit
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -111,9 +111,7 @@ public abstract class CompositeDataTypeImpl extends GenericDataType implements C
}
@Override
public boolean isDynamicallySized() {
return true; // assume dynamically sized component datatype may be present
}
public abstract boolean hasLanguageDependantLength();
@Override
public boolean isPartOf(DataType dataTypeOfInterest) {
@ -142,23 +140,33 @@ public abstract class CompositeDataTypeImpl extends GenericDataType implements C
/**
* This method throws an exception if the indicated data type is not a valid
* data type for a component of this composite data type.
* data type for a component of this composite data type. If the DEFAULT
* datatype is specified when unsupported an Undefined1 will be returned
* in its place (e.g., packing enabled, Union).
*
* @param dataType the data type to be checked.
* @return datatype to be used for insert/add
* @throws IllegalArgumentException if the data type is invalid.
*/
protected void validateDataType(DataType dataType) {
if (dataType instanceof FactoryDataType) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
protected DataType validateDataType(DataType dataType) {
if (dataType == DataType.DEFAULT) {
if (isPackingEnabled() || (this instanceof Union)) {
return Undefined1DataType.dataType;
}
return dataType;
}
else if (dataType instanceof Dynamic) {
if (dataType instanceof Dynamic) {
Dynamic dynamicDataType = (Dynamic) dataType;
if (!dynamicDataType.canSpecifyLength()) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
}
else if (dataType instanceof FactoryDataType || dataType.getLength() <= 0) {
throw new IllegalArgumentException("The \"" + dataType.getName() +
"\" data type is not allowed in a composite data type.");
}
return dataType;
}
/**

View file

@ -38,10 +38,11 @@ public interface DataType {
static final long NO_LAST_CHANGE_TIME = 0L;
/**
* Indicates if this data-type is dynamically sized based upon DataOrganization.
* @return true if dynamically sized
* Indicates if the length of this data-type is determined based
* upon the {@link DataOrganization} obtained from the associated {@link DataTypeManager}.
* @return true length is language/compiler-specification dependent, else false
*/
public boolean isDynamicallySized();
public boolean hasLanguageDependantLength();
/**
* Indicates if type has not yet been defined.

View file

@ -54,14 +54,6 @@ public class DefaultDataType extends DataTypeImpl {
return 1;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/**
*
* @see ghidra.program.model.data.DataType#getDescription()

View file

@ -1,6 +1,5 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -43,7 +42,7 @@ public class DoubleDataType extends AbstractFloatDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -50,14 +50,6 @@ public abstract class DynamicDataType extends BuiltIn implements Dynamic {
return false;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
/**
* Gets the number of component data types in this data type.
* @param buf a membuffer to be used by dataTypes that change depending on

View file

@ -73,11 +73,6 @@ public class EnumDataType extends GenericDataType implements Enum {
return ENUM_SETTINGS_DEFINITIONS;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public long getValue(String valueName) throws NoSuchElementException {
Long value = nameMap.get(valueName);

View file

@ -1,6 +1,5 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -30,7 +29,17 @@ public interface FactoryDataType extends BuiltInDataType {
* Returns the appropriate DataType which corresponds to the specified
* memory location.
* @param buf memory location
* @return fabricated datatype based upon memory data
*/
DataType getDataType(MemBuffer buf);
/**
* All implementations must return a length of -1.
* @return length of -1
*/
@Override
default int getLength() {
return -1;
}
}

View file

@ -24,7 +24,6 @@ import ghidra.util.exception.DuplicateNameException;
* a Structure and create a new Dynamic structure each time they are used.
*/
public abstract class FactoryStructureDataType extends BuiltIn implements FactoryDataType {
private final static long serialVersionUID = 1;
/**
* Constructs a new DynamicStructureDataType with the given name
@ -41,7 +40,7 @@ public abstract class FactoryStructureDataType extends BuiltIn implements Factor
* @see ghidra.program.model.data.DataType#getLength()
*/
@Override
public int getLength() {
public final int getLength() {
return -1;
}

View file

@ -67,14 +67,6 @@ public class FileTimeDataType extends BuiltIn {
return 8;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getMnemonic(Settings settings) {
return "FileTime";

View file

@ -1,6 +1,5 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -43,7 +42,7 @@ public class FloatDataType extends AbstractFloatDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -97,11 +97,11 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
Parameter[] parameters = function.getParameters();
ArrayList<ParameterDefinition> paramList = new ArrayList<ParameterDefinition>();
for (int i = 0; i < parameters.length; i++) {
if (formalSignature && parameters[i].isAutoParameter()) {
for (Parameter parameter : parameters) {
if (formalSignature && parameter.isAutoParameter()) {
continue;
}
paramList.add(getParameterDefinition(parameters[i], formalSignature));
paramList.add(getParameterDefinition(parameter, formalSignature));
}
params = paramList.toArray(new ParameterDefinition[paramList.size()]);
@ -150,11 +150,6 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
}
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public void setReturnType(DataType type) {
returnType = ParameterDefinitionImpl.validateDataType(type, dataMgr, true);
@ -350,8 +345,7 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
return;
}
}
for (int i = 0; i < params.length; i++) {
ParameterDefinition param = params[i];
for (ParameterDefinition param : params) {
if (param.getDataType() == oldDt) {
try {
param.setDataType(newDt);
@ -391,9 +385,9 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
if (returnType == dt) {
returnType = DataType.DEFAULT;
}
for (int i = 0; i < params.length; i++) {
if (params[i].getDataType() == dt) {
params[i].setDataType(DataType.DEFAULT);
for (ParameterDefinition param : params) {
if (param.getDataType() == dt) {
param.setDataType(DataType.DEFAULT);
}
}
}

View file

@ -66,14 +66,6 @@ public class GifDataType extends BuiltIn implements Dynamic, Resource {
return false;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -34,10 +34,10 @@ public class IntegerDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -80,14 +80,6 @@ public class JPEGDataType extends BuiltIn implements Dynamic, Resource {
return false;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -42,10 +42,10 @@ public class LongDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -1,6 +1,5 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -48,7 +47,7 @@ public class LongDoubleDataType extends AbstractFloatDataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -42,10 +42,10 @@ public class LongLongDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -15,15 +15,15 @@
*/
package ghidra.program.model.data;
import ghidra.docking.settings.Settings;
import ghidra.program.model.mem.MemBuffer;
import ghidra.util.Msg;
import ghidra.util.classfinder.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import ghidra.docking.settings.Settings;
import ghidra.program.model.mem.MemBuffer;
import ghidra.util.Msg;
import ghidra.util.classfinder.ClassTranslator;
/**
* A datatype to interpret the Mac OS timestamp
* convention, which is based on the number of
@ -57,26 +57,23 @@ public class MacintoshTimeStampDataType extends BuiltIn {
super(null, "MacTime", dtm);
}
@Override
public String getDescription() {
return "The stamp follows the Macintosh time-measurement scheme "
+ "(that is, the number of seconds measured from January 1, 1904).";
}
@Override
public int getLength() {
return 4;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return false;
}
@Override
public String getMnemonic(Settings settings) {
return "MacTime";
}
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) {
if (macStartDate == null) {
return "unparsed date";
@ -93,10 +90,12 @@ public class MacintoshTimeStampDataType extends BuiltIn {
return "";
}
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) {
return getRepresentation(buf, settings, length);
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {
return this;

View file

@ -85,14 +85,6 @@ public class MissingBuiltInDataType extends DataTypeImpl implements Dynamic {
return -1;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public boolean canSpecifyLength() {
return true;

View file

@ -79,7 +79,7 @@ public class ParameterDefinitionImpl implements ParameterDefinition {
dataType.getName());
}
dataType = dataType.clone(dtMgr != null ? dtMgr : dataType.getDataTypeManager());
if (!dataType.isDynamicallySized() && dataType.getLength() < 0) {
if (dataType.getLength() < 0) {
throw new IllegalArgumentException(kind +
" type must be specified with fixed-length data type: " + dataType.getName());
}
@ -94,7 +94,7 @@ public class ParameterDefinitionImpl implements ParameterDefinition {
"Parameter type may not specify the void datatype - empty parameter list should be used");
}
}
else if (!(dataType instanceof Composite) && dataType.getLength() == 0) {
else if (dataType.getLength() == 0) {
throw new IllegalArgumentException(kind +
" type must be specified with fixed-length data type: " + dataType.getName());
}

View file

@ -57,14 +57,6 @@ public class PngDataType extends BuiltIn implements Dynamic, Resource {
return -1;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public boolean canSpecifyLength() {
return false;

View file

@ -31,8 +31,6 @@ import ghidra.util.DataConverter;
*/
public class PointerDataType extends BuiltIn implements Pointer {
private final static long serialVersionUID = 1;
public final static PointerDataType dataType = new PointerDataType();
public final static int MAX_POINTER_SIZE_BYTES = 8;
@ -156,7 +154,7 @@ public class PointerDataType extends BuiltIn implements Pointer {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return length <= 0;
}
@ -460,10 +458,10 @@ public class PointerDataType extends BuiltIn implements Pointer {
Pointer p = (Pointer) dt;
DataType otherDataType = p.getDataType();
if (isDynamicallySized() != p.isDynamicallySized()) {
if (hasLanguageDependantLength() != p.hasLanguageDependantLength()) {
return false;
}
if (!isDynamicallySized() && (getLength() != p.getLength())) {
if (!hasLanguageDependantLength() && (getLength() != p.getLength())) {
return false;
}
if (referencedDataType == null) {

View file

@ -54,14 +54,6 @@ public class SegmentedCodePointerDataType extends BuiltIn {
return 4;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getDescription() {
return "Code address from 16 bit segment and 16 bit offset";
@ -98,8 +90,9 @@ public class SegmentedCodePointerDataType extends BuiltIn {
public String getRepresentation(MemBuffer buf, Settings settings, int length) {
Object obj = getValue(buf, settings, length);
if (obj == null)
if (obj == null) {
return "??";
}
return obj.toString();
}

View file

@ -18,7 +18,6 @@ package ghidra.program.model.data;
import ghidra.docking.settings.Settings;
import ghidra.docking.settings.SettingsDefinition;
import ghidra.program.model.address.*;
import ghidra.program.model.lang.ProcessorContext;
import ghidra.program.model.mem.MemBuffer;
import ghidra.util.DataConverter;
import ghidra.util.classfinder.ClassTranslator;
@ -60,7 +59,7 @@ public class ShiftedAddressDataType extends BuiltIn {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -42,10 +42,10 @@ public class ShortDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -203,6 +203,11 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
return structLength;
}
@Override
public boolean hasLanguageDependantLength() {
return isPackingEnabled();
}
@Override
public void delete(int ordinal) {
if (ordinal < 0 || ordinal >= numComponents) {
@ -373,16 +378,6 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
return super.getPreferredComponentLength(dataType, length);
}
@Override
protected void validateDataType(DataType dataType) {
// TODO: need tests - questionable if transitioning to/from no-packing works properly
if (isPackingEnabled() && dataType == DataType.DEFAULT) {
throw new IllegalArgumentException(
"The DEFAULT data type is not allowed in an aligned composite data type.");
}
super.validateDataType(dataType);
}
@Override
public final DataTypeComponentImpl insertAtOffset(int offset, DataType dataType, int length) {
return insertAtOffset(offset, dataType, length, null, null);
@ -410,7 +405,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
}
}
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = dataType.clone(dataMgr);
checkAncestry(dataType);
@ -487,13 +482,15 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
String componentName, String comment, boolean packAndNotify)
throws IllegalArgumentException {
validateDataType(dataType);
dataType = dataType.clone(dataMgr);
if (isFlexibleArray && isInvalidFlexArrayDataType(dataType)) {
throw new IllegalArgumentException(
"Unsupported flexType: " + dataType.getDisplayName());
}
dataType = validateDataType(dataType);
dataType = dataType.clone(dataMgr);
checkAncestry(dataType);
DataTypeComponentImpl dtc;
@ -566,7 +563,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
if (index == numComponents) {
return add(dataType, length, componentName, comment);
}
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = dataType.clone(dataMgr);
checkAncestry(dataType);
@ -1311,7 +1308,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
throw new IndexOutOfBoundsException(index);
}
validateDataType(dataType);
dataType = validateDataType(dataType);
DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponent(index);
if (origDtc.isBitFieldComponent()) {
@ -1354,7 +1351,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur
"Offset " + offset + " is beyond end of structure (" + getLength() + ").");
}
validateDataType(dataType);
dataType = validateDataType(dataType);
DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponentAt(offset);
if (origDtc.isBitFieldComponent()) {

View file

@ -104,8 +104,8 @@ public class TypedefDataType extends GenericDataType implements TypeDef {
}
@Override
public boolean isDynamicallySized() {
return dataType.isDynamicallySized();
public boolean hasLanguageDependantLength() {
return dataType.hasLanguageDependantLength();
}
@Override

View file

@ -39,14 +39,6 @@ public abstract class Undefined extends BuiltIn {
return undefinedTypes;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
@Override
public boolean isDynamicallySized() {
return false;
}
/**
* Get an Undefined data-type instance of the requested size
* @param size data type size, sizes greater than 8 will cause an Undefined1[size] (i.e., Array) to be returned.
@ -74,10 +66,12 @@ public abstract class Undefined extends BuiltIn {
* its various forms, else false.
*/
public static boolean isUndefined(DataType dataType) {
if (dataType instanceof DefaultDataType)
if (dataType instanceof DefaultDataType) {
return true;
if (dataType instanceof Undefined)
}
if (dataType instanceof Undefined) {
return true;
}
return isUndefinedArray(dataType);
}

View file

@ -170,7 +170,7 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna
DataTypeComponent doAdd(DataType dataType, int length, String componentName, String comment)
throws IllegalArgumentException {
validateDataType(dataType);
dataType = validateDataType(dataType);
dataType = adjustBitField(dataType);
@ -190,7 +190,7 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna
@Override
public DataTypeComponent insert(int ordinal, DataType dataType, int length,
String componentName, String comment) throws IllegalArgumentException {
validateDataType(dataType);
dataType = validateDataType(dataType);
int oldAlignment = getAlignment();
@ -248,6 +248,12 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna
return unionLength;
}
@Override
public boolean hasLanguageDependantLength() {
// Assume any component may have a language-dependent length
return true;
}
@Override
public Union clone(DataTypeManager dtm) {
if (dataMgr == dtm) {

View file

@ -43,10 +43,10 @@ public class UnsignedIntegerDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -43,10 +43,10 @@ public class UnsignedLongDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -43,10 +43,10 @@ public class UnsignedLongLongDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -43,10 +43,10 @@ public class UnsignedShortDataType extends AbstractIntegerDataType {
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
* @see ghidra.program.model.data.DataType#hasLanguageDependantLength()
*/
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -23,7 +23,6 @@ import ghidra.program.model.mem.MemBuffer;
* a function has no return value.
*/
public class VoidDataType extends BuiltIn {
private final static long serialVersionUID = 1;
/** A statically defined DefaultDataType used when an Undefined byte is needed.*/
public static VoidDataType dataType = new VoidDataType();
@ -40,6 +39,7 @@ public class VoidDataType extends BuiltIn {
*
* @see ghidra.program.model.data.DataType#getMnemonic(Settings)
*/
@Override
public String getMnemonic(Settings settings) {
return "void";
}
@ -48,21 +48,16 @@ public class VoidDataType extends BuiltIn {
*
* @see ghidra.program.model.data.DataType#getLength()
*/
@Override
public int getLength() {
return 0;
}
/**
* @see ghidra.program.model.data.DataType#isDynamicallySized()
*/
public boolean isDynamicallySized() {
return false;
}
/**
*
* @see ghidra.program.model.data.DataType#getDescription()
*/
@Override
public String getDescription() {
return "void datatype";
}
@ -71,6 +66,7 @@ public class VoidDataType extends BuiltIn {
*
* @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int)
*/
@Override
public String getRepresentation(MemBuffer buf, Settings settings, int length) {
return "";
}
@ -79,10 +75,12 @@ public class VoidDataType extends BuiltIn {
*
* @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int)
*/
@Override
public Object getValue(MemBuffer buf, Settings settings, int length) {
return null;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {
return this;

View file

@ -78,11 +78,6 @@ public class WAVEDataType extends BuiltIn implements Dynamic {
return false;
}
@Override
public boolean isDynamicallySized() {
return true;
}
@Override
public DataType clone(DataTypeManager dtm) {
if (dtm == getDataTypeManager()) {

View file

@ -23,8 +23,6 @@ import ghidra.util.StringUtilities;
public class WideChar16DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset {
private final static long serialVersionUID = 1;
/** A statically defined WideCharDataType instance.*/
public final static WideChar16DataType dataType = new WideChar16DataType();
@ -41,11 +39,6 @@ public class WideChar16DataType extends BuiltIn implements ArrayStringable, Data
return 2;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getDescription() {
return "Wide-Character (16-bit/UTF16)";

View file

@ -24,8 +24,6 @@ import ghidra.util.StringUtilities;
public class WideChar32DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset {
private final static long serialVersionUID = 1;
/** A statically defined WideCharDataType instance.*/
public final static WideChar32DataType dataType = new WideChar32DataType();
@ -42,11 +40,6 @@ public class WideChar32DataType extends BuiltIn implements ArrayStringable, Data
return 4;
}
@Override
public boolean isDynamicallySized() {
return false;
}
@Override
public String getDescription() {
return "Wide-Character (32-bit/UTF32)";

View file

@ -26,8 +26,6 @@ public class WideCharDataType extends BuiltIn implements ArrayStringable, DataTy
final static SettingsDefinition[] DEFAULT_WIDE_CHAR_SETTINGS = new SettingsDefinition[] {
EndianSettingsDefinition.DEF, RenderUnicodeSettingsDefinition.RENDER };
private final static long serialVersionUID = 1;
/** A statically defined WideCharDataType instance.*/
public final static WideCharDataType dataType = new WideCharDataType();
@ -45,7 +43,7 @@ public class WideCharDataType extends BuiltIn implements ArrayStringable, DataTy
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
return true;
}

View file

@ -272,7 +272,9 @@ public class VariableUtilities {
}
dataType = Undefined.getUndefinedDataType(defaultSize);
}
else if (dataType.isDynamicallySized()) {
else if (dataType.hasLanguageDependantLength()) {
// A clone is done to ensure that any affects of the data organization
// are properly reflected in the sizing of the datatype
dataType = dataType.clone(program.getDataTypeManager());
}
else if (dataType instanceof FunctionDefinition || (dataType instanceof TypeDef &&

View file

@ -43,7 +43,7 @@ public class TestDoubleDataType implements DataType {
}
@Override
public boolean isDynamicallySized() {
public boolean hasLanguageDependantLength() {
throw new UnsupportedOperationException();
}

View file

@ -0,0 +1,67 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.program.model.listing;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import generic.jar.ResourceFile;
import generic.test.AbstractGenericTest;
import ghidra.framework.Application;
import ghidra.program.database.ProgramDB;
import ghidra.program.model.data.*;
import ghidra.program.model.lang.*;
import ghidra.program.util.DefaultLanguageService;
public class VariableUtilitiesTest extends AbstractGenericTest {
private ProgramDB program;
@Before
public void setUp() throws Exception {
Language language = getLanguage("Toy:BE:64:default");
CompilerSpec compilerSpec = language.getDefaultCompilerSpec();
program = new ProgramDB("Test", language, compilerSpec, this);
}
private Language getLanguage(String languageName) throws Exception {
ResourceFile ldefFile = Application.getModuleDataFile("Toy", "languages/toy.ldefs");
if (ldefFile != null) {
LanguageService languageService = DefaultLanguageService.getLanguageService(ldefFile);
Language language = languageService.getLanguage(new LanguageID(languageName));
return language;
}
throw new LanguageNotFoundException("Unsupported test language: " + languageName);
}
@Test
public void testCheckDataType() throws Exception {
DataType dt = new TypedefDataType("Foo", new PointerDataType()); // point size will be 8 in program
assertEquals(4, dt.getLength());
dt = VariableUtilities.checkDataType(dt, false, -1, program);
assertEquals(8, dt.getLength());
dt = new ArrayDataType(new PointerDataType(), 5, -1); // point size will be 8 in program
assertEquals(20, dt.getLength());
dt = VariableUtilities.checkDataType(dt, false, -1, program);
assertEquals(40, dt.getLength());
}
}

View file

@ -1,6 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<compiler_spec>
<data_organization>
<absolute_max_alignment value="0" /> <!-- no maximum alignment -->
<machine_alignment value="8" />
<default_alignment value="1" />
<default_pointer_alignment value="4" />
<pointer_size value="4" />
<wchar_size value="2" />
<short_size value="2" />
<integer_size value="4" />
<long_size value="4" />
<long_long_size value="8" />
<float_size value="4" />
<double_size value="8" />
<long_double_size value="8" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="4" />
</size_alignment_map>
</data_organization>
<global>
<range space="ram"/>
</global>

View file

@ -1,6 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<compiler_spec>
<data_organization>
<absolute_max_alignment value="0" />
<machine_alignment value="2" />
<default_alignment value="1" />
<default_pointer_alignment value="8" />
<pointer_size value="8" />
<wchar_size value="2" />
<short_size value="2" />
<integer_size value="4" />
<long_size value="4" />
<long_long_size value="8" />
<float_size value="4" />
<double_size value="8" />
<long_double_size value="8" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<global>
<range space="ram"/>
</global>