mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
Merge remote-tracking branch 'origin/GP-2-dragonmacher-spelling-fixes'
This commit is contained in:
commit
2ef4f26120
16 changed files with 312 additions and 301 deletions
|
@ -751,7 +751,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
/**
|
/**
|
||||||
* Set category path. If name conflict occurs within new category
|
* Set category path. If name conflict occurs within new category
|
||||||
* the specified dt will remain within its current category
|
* the specified dt will remain within its current category
|
||||||
* @param dt datatype whoose category is to changed
|
* @param dt datatype whose category is to changed
|
||||||
* @param newPath new category path
|
* @param newPath new category path
|
||||||
*/
|
*/
|
||||||
private void setCategoryPath(DataType dt, CategoryPath newPath) {
|
private void setCategoryPath(DataType dt, CategoryPath newPath) {
|
||||||
|
@ -2222,8 +2222,9 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
UniversalID resultDtUniversalID = resultDt.getUniversalID();
|
UniversalID resultDtUniversalID = resultDt.getUniversalID();
|
||||||
UniversalID myDtUniversalID = myDt.getUniversalID();
|
UniversalID myDtUniversalID = myDt.getUniversalID();
|
||||||
// UniversalID can be null if data type is BuiltIn.
|
// UniversalID can be null if data type is BuiltIn.
|
||||||
if (!resultSourceArchive.getSourceArchiveID().equals(
|
if (!resultSourceArchive.getSourceArchiveID()
|
||||||
mySourceArchive.getSourceArchiveID()) ||
|
.equals(
|
||||||
|
mySourceArchive.getSourceArchiveID()) ||
|
||||||
!Objects.equals(resultDtUniversalID, myDtUniversalID)) {
|
!Objects.equals(resultDtUniversalID, myDtUniversalID)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2237,7 +2238,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
|
|
||||||
private void cleanUpDataTypes() {
|
private void cleanUpDataTypes() {
|
||||||
// clean up data types
|
// clean up data types
|
||||||
List<Long> keys = new ArrayList<Long>(cleanupPlaceHolderList.keySet());
|
List<Long> keys = new ArrayList<>(cleanupPlaceHolderList.keySet());
|
||||||
for (long key : keys) {
|
for (long key : keys) {
|
||||||
CleanUpInfo cleanUpInfo = cleanupPlaceHolderList.get(key);
|
CleanUpInfo cleanUpInfo = cleanupPlaceHolderList.get(key);
|
||||||
cleanUpInfo.cleanUp();
|
cleanUpInfo.cleanUp();
|
||||||
|
@ -2649,11 +2650,6 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param compID
|
|
||||||
* @param dataTypeManager
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private DataType resolve(long id, DataTypeManager dtm,
|
private DataType resolve(long id, DataTypeManager dtm,
|
||||||
Map<Long, DataType> resolvedDataTypes) {
|
Map<Long, DataType> resolvedDataTypes) {
|
||||||
DataType dt = getResolvedComponent(id, resolvedDataTypes);
|
DataType dt = getResolvedComponent(id, resolvedDataTypes);
|
||||||
|
@ -2945,7 +2941,7 @@ public class DataTypeMergeManager implements MergeResolver {
|
||||||
/**
|
/**
|
||||||
* Processes my data types that were added and determines whether each is actually a
|
* Processes my data types that were added and determines whether each is actually a
|
||||||
* conflict, an added data type, or a changed data type relative to the Latest check in.
|
* conflict, an added data type, or a changed data type relative to the Latest check in.
|
||||||
* @param myDtAdds
|
* @param myDtAdds the data type IDs
|
||||||
*/
|
*/
|
||||||
private void processAddIDs(long[] myDtAdds) {
|
private void processAddIDs(long[] myDtAdds) {
|
||||||
myDtAddedList = new ArrayList<>();
|
myDtAddedList = new ArrayList<>();
|
||||||
|
|
|
@ -28,43 +28,43 @@ public class DatabaseUtils {
|
||||||
/**
|
/**
|
||||||
* Reassign the long key assigned to a contiguous group of records within a table.
|
* Reassign the long key assigned to a contiguous group of records within a table.
|
||||||
* A shift in the key value is computed as the difference of oldStart and newStart.
|
* A shift in the key value is computed as the difference of oldStart and newStart.
|
||||||
* Existing records whoose keys lie within the new range will be removed prior to
|
* Existing records whose keys lie within the new range will be removed prior to
|
||||||
* moving the target set of records.
|
* moving the target set of records.
|
||||||
* @param table table within which records should be moved.
|
* @param table table within which records should be moved.
|
||||||
* @param oldStart old key value for start of range
|
* @param oldStart old key value for start of range
|
||||||
* @param newStart new key value for start of range
|
* @param newStart new key value for start of range
|
||||||
* @param size determines the range of keys to be moved (oldStart to oldStart+size-1, inclusive)
|
* @param size determines the range of keys to be moved (oldStart to oldStart+size-1, inclusive)
|
||||||
* @throws IOException
|
* @throws IOException if there is an error moving the records
|
||||||
*/
|
*/
|
||||||
public static void moveRecords(Table table, long oldStart, long newStart, long size) throws IOException{
|
public static void moveRecords(Table table, long oldStart, long newStart, long size)
|
||||||
|
throws IOException {
|
||||||
if (oldStart == newStart) {
|
if (oldStart == newStart) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
throw new IllegalArgumentException("size must be > 0");
|
throw new IllegalArgumentException("size must be > 0");
|
||||||
}
|
}
|
||||||
if ((oldStart + size -1 < 0) || (newStart+size-1 <0)){
|
if ((oldStart + size - 1 < 0) || (newStart + size - 1 < 0)) {
|
||||||
throw new IllegalArgumentException("Illegal range: end range overflow");
|
throw new IllegalArgumentException("Illegal range: end range overflow");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DBHandle tmp = new DBHandle();
|
DBHandle tmp = new DBHandle();
|
||||||
Table tmpTable = tmp.createTable("tmp", table.getSchema());
|
Table tmpTable = tmp.createTable("tmp", table.getSchema());
|
||||||
long txID = tmp.startTransaction();
|
long txID = tmp.startTransaction();
|
||||||
|
|
||||||
long keyDiff = newStart - oldStart;
|
long keyDiff = newStart - oldStart;
|
||||||
RecordIterator it = table.iterator(oldStart, oldStart+size-1, oldStart);
|
RecordIterator it = table.iterator(oldStart, oldStart + size - 1, oldStart);
|
||||||
while(it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
DBRecord rec = it.next();
|
DBRecord rec = it.next();
|
||||||
rec.setKey(rec.getKey()+keyDiff);
|
rec.setKey(rec.getKey() + keyDiff);
|
||||||
tmpTable.putRecord(rec);
|
tmpTable.putRecord(rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
table.deleteRecords(oldStart, oldStart+size-1);
|
table.deleteRecords(oldStart, oldStart + size - 1);
|
||||||
table.deleteRecords(newStart, newStart+size-1);
|
table.deleteRecords(newStart, newStart + size - 1);
|
||||||
|
|
||||||
it = tmpTable.iterator(newStart, newStart+size-1, newStart);
|
it = tmpTable.iterator(newStart, newStart + size - 1, newStart);
|
||||||
while(it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
DBRecord rec = it.next();
|
DBRecord rec = it.next();
|
||||||
table.putRecord(rec);
|
table.putRecord(rec);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.util.ArrayList;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>FieldIndexTable</code> provides a simplified index table whoose key is
|
* <code>FieldIndexTable</code> provides a simplified index table whose key is
|
||||||
* a fixed or variable length {@link IndexField} which consists of a concatenation of
|
* a fixed or variable length {@link IndexField} which consists of a concatenation of
|
||||||
* the index field value and associated primary table key.
|
* the index field value and associated primary table key.
|
||||||
*/
|
*/
|
||||||
|
@ -40,8 +40,10 @@ public class FieldIndexTable extends IndexTable {
|
||||||
* @throws IOException thrown if IO error occurs
|
* @throws IOException thrown if IO error occurs
|
||||||
*/
|
*/
|
||||||
FieldIndexTable(Table primaryTable, int colIndex) throws IOException {
|
FieldIndexTable(Table primaryTable, int colIndex) throws IOException {
|
||||||
this(primaryTable, primaryTable.getDBHandle().getMasterTable().createTableRecord(
|
this(primaryTable, primaryTable.getDBHandle()
|
||||||
primaryTable.getName(), getIndexTableSchema(primaryTable, colIndex), colIndex));
|
.getMasterTable()
|
||||||
|
.createTableRecord(
|
||||||
|
primaryTable.getName(), getIndexTableSchema(primaryTable, colIndex), colIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -448,7 +448,7 @@ abstract class LongKeyRecordNode extends LongKeyNode implements RecordNode {
|
||||||
abstract DBRecord getRecord(Schema schema, int index) throws IOException;
|
abstract DBRecord getRecord(Schema schema, int index) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the first record whoose key is less than the specified key.
|
* Get the first record whose key is less than the specified key.
|
||||||
* @param key record key
|
* @param key record key
|
||||||
* @param schema record data schema
|
* @param schema record data schema
|
||||||
* @return Record requested or null if record not found.
|
* @return Record requested or null if record not found.
|
||||||
|
@ -470,7 +470,7 @@ abstract class LongKeyRecordNode extends LongKeyNode implements RecordNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the first record whoose key is greater than the specified key.
|
* Get the first record whose key is greater than the specified key.
|
||||||
* @param key record key
|
* @param key record key
|
||||||
* @param schema record data schema
|
* @param schema record data schema
|
||||||
* @return Record requested or null if record not found.
|
* @return Record requested or null if record not found.
|
||||||
|
@ -492,7 +492,7 @@ abstract class LongKeyRecordNode extends LongKeyNode implements RecordNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the first record whoose key is less than or equal to the specified
|
* Get the first record whose key is less than or equal to the specified
|
||||||
* key.
|
* key.
|
||||||
* @param key record key
|
* @param key record key
|
||||||
* @param schema record data schema
|
* @param schema record data schema
|
||||||
|
@ -512,7 +512,7 @@ abstract class LongKeyRecordNode extends LongKeyNode implements RecordNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the first record whoose key is greater than or equal to the specified
|
* Get the first record whose key is greater than or equal to the specified
|
||||||
* key.
|
* key.
|
||||||
* @param key record key
|
* @param key record key
|
||||||
* @param schema record data schema
|
* @param schema record data schema
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,14 +15,14 @@
|
||||||
*/
|
*/
|
||||||
package db.buffers;
|
package db.buffers;
|
||||||
|
|
||||||
import ghidra.util.datastruct.IntIntHashtable;
|
|
||||||
import ghidra.util.exception.AssertException;
|
|
||||||
import ghidra.util.exception.NoValueException;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import ghidra.util.datastruct.IntIntHashtable;
|
||||||
|
import ghidra.util.exception.AssertException;
|
||||||
|
import ghidra.util.exception.NoValueException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>VersionFile</code> records buffer changes and parameters necessary to reconstruct an
|
* <code>VersionFile</code> records buffer changes and parameters necessary to reconstruct an
|
||||||
* older version of a LocalBufferFile.
|
* older version of a LocalBufferFile.
|
||||||
|
@ -44,7 +43,8 @@ class RecoveryFile {
|
||||||
private static final String TIMESTAMP_HI_PARM = RECOVERY_PARM_PREFIX + "TimestampHi";
|
private static final String TIMESTAMP_HI_PARM = RECOVERY_PARM_PREFIX + "TimestampHi";
|
||||||
private static final String TIMESTAMP_LOW_PARM = RECOVERY_PARM_PREFIX + "TimestampLow";
|
private static final String TIMESTAMP_LOW_PARM = RECOVERY_PARM_PREFIX + "TimestampLow";
|
||||||
private static final String MAP_BUFFER_INDEX_PARM = RECOVERY_PARM_PREFIX + "MapIndex";
|
private static final String MAP_BUFFER_INDEX_PARM = RECOVERY_PARM_PREFIX + "MapIndex";
|
||||||
private static final String FREE_LIST_BUFFER_INDEX_PARM = RECOVERY_PARM_PREFIX + "FreeListIndex";
|
private static final String FREE_LIST_BUFFER_INDEX_PARM =
|
||||||
|
RECOVERY_PARM_PREFIX + "FreeListIndex";
|
||||||
private static final String FREE_LIST_SIZE_PARM = RECOVERY_PARM_PREFIX + "FreeListSize";
|
private static final String FREE_LIST_SIZE_PARM = RECOVERY_PARM_PREFIX + "FreeListSize";
|
||||||
private static final String INDEX_COUNT_PARM = RECOVERY_PARM_PREFIX + "BufferCount";
|
private static final String INDEX_COUNT_PARM = RECOVERY_PARM_PREFIX + "BufferCount";
|
||||||
|
|
||||||
|
@ -77,7 +77,8 @@ class RecoveryFile {
|
||||||
* Construct a new recovery file for update/output.
|
* Construct a new recovery file for update/output.
|
||||||
* @param srcBf the original source buffer file to which this file applies.
|
* @param srcBf the original source buffer file to which this file applies.
|
||||||
* @param rfile version buffer file to be updated/created
|
* @param rfile version buffer file to be updated/created
|
||||||
* @throws IOException if vfile already exists or an IO error occurs
|
* @param create true to create the file
|
||||||
|
* @throws IOException if the file already exists or an IO error occurs
|
||||||
*/
|
*/
|
||||||
RecoveryFile(LocalBufferFile srcBf, File rfile, boolean create) throws IOException {
|
RecoveryFile(LocalBufferFile srcBf, File rfile, boolean create) throws IOException {
|
||||||
|
|
||||||
|
@ -94,10 +95,10 @@ class RecoveryFile {
|
||||||
// Mark as invalid
|
// Mark as invalid
|
||||||
recoveryFile.setParameter(IS_VALID_PARM, INVALID);
|
recoveryFile.setParameter(IS_VALID_PARM, INVALID);
|
||||||
|
|
||||||
// Save original and source file ID as user paramater values
|
// Save original and source file ID as user parameter values
|
||||||
srcFileId = srcBf.getFileId();
|
srcFileId = srcBf.getFileId();
|
||||||
recoveryFile.setParameter(SRC_FILE_ID_HI_PARM, (int)(srcFileId >>> 32));
|
recoveryFile.setParameter(SRC_FILE_ID_HI_PARM, (int) (srcFileId >>> 32));
|
||||||
recoveryFile.setParameter(SRC_FILE_ID_LOW_PARM, (int)(srcFileId & 0xffffffffL));
|
recoveryFile.setParameter(SRC_FILE_ID_LOW_PARM, (int) (srcFileId & 0xffffffffL));
|
||||||
|
|
||||||
vfIndexProvider = new IndexProvider();
|
vfIndexProvider = new IndexProvider();
|
||||||
|
|
||||||
|
@ -117,7 +118,8 @@ class RecoveryFile {
|
||||||
throw new IOException("Recovery file not associated with source file");
|
throw new IOException("Recovery file not associated with source file");
|
||||||
}
|
}
|
||||||
|
|
||||||
vfIndexProvider = new IndexProvider(recoveryFile.getIndexCount(), recoveryFile.getFreeIndexes());
|
vfIndexProvider =
|
||||||
|
new IndexProvider(recoveryFile.getIndexCount(), recoveryFile.getFreeIndexes());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -126,14 +128,14 @@ class RecoveryFile {
|
||||||
* Construct a read-only recovery file
|
* Construct a read-only recovery file
|
||||||
* @param srcBf the original source buffer file to which this file applies.
|
* @param srcBf the original source buffer file to which this file applies.
|
||||||
* @param rfile version buffer file to be updated/created
|
* @param rfile version buffer file to be updated/created
|
||||||
* @throws IOException
|
* @throws IOException if the file already exists or an IO error occurs
|
||||||
* @throws IOException if vfile already exists or an IO error occurs
|
|
||||||
*/
|
*/
|
||||||
RecoveryFile(LocalBufferFile srcBf, File rfile) throws IOException {
|
RecoveryFile(LocalBufferFile srcBf, File rfile) throws IOException {
|
||||||
recoveryFile = new LocalBufferFile(rfile, true);
|
recoveryFile = new LocalBufferFile(rfile, true);
|
||||||
readOnly = true;
|
readOnly = true;
|
||||||
parseFile();
|
parseFile();
|
||||||
valid = (recoveryFile.getParameter(IS_VALID_PARM) == VALID && srcFileId == srcBf.getFileId());
|
valid =
|
||||||
|
(recoveryFile.getParameter(IS_VALID_PARM) == VALID && srcFileId == srcBf.getFileId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setModified() {
|
private void setModified() {
|
||||||
|
@ -156,13 +158,11 @@ class RecoveryFile {
|
||||||
return timestamp;
|
return timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Close the version file.
|
|
||||||
*/
|
|
||||||
void close() throws IOException {
|
void close() throws IOException {
|
||||||
|
|
||||||
if (recoveryFile == null)
|
if (recoveryFile == null) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!readOnly && modified && !recoveryFile.isReadOnly()) {
|
if (!readOnly && modified && !recoveryFile.isReadOnly()) {
|
||||||
saveBufferMap();
|
saveBufferMap();
|
||||||
|
@ -171,8 +171,8 @@ class RecoveryFile {
|
||||||
recoveryFile.setFreeIndexes(vfIndexProvider.getFreeIndexes());
|
recoveryFile.setFreeIndexes(vfIndexProvider.getFreeIndexes());
|
||||||
|
|
||||||
long t = (new Date()).getTime();
|
long t = (new Date()).getTime();
|
||||||
recoveryFile.setParameter(TIMESTAMP_HI_PARM, (int)(t >>> 32));
|
recoveryFile.setParameter(TIMESTAMP_HI_PARM, (int) (t >>> 32));
|
||||||
recoveryFile.setParameter(TIMESTAMP_LOW_PARM, (int)(t & 0xffffffffL));
|
recoveryFile.setParameter(TIMESTAMP_LOW_PARM, (int) (t & 0xffffffffL));
|
||||||
|
|
||||||
recoveryFile.setParameter(IS_VALID_PARM, VALID); // mark as valid
|
recoveryFile.setParameter(IS_VALID_PARM, VALID); // mark as valid
|
||||||
}
|
}
|
||||||
|
@ -188,14 +188,15 @@ class RecoveryFile {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
timestamp = ((long)recoveryFile.getParameter(TIMESTAMP_HI_PARM) << 32) |
|
timestamp = ((long) recoveryFile.getParameter(TIMESTAMP_HI_PARM) << 32) |
|
||||||
(recoveryFile.getParameter(TIMESTAMP_LOW_PARM) & 0xffffffffL);
|
(recoveryFile.getParameter(TIMESTAMP_LOW_PARM) & 0xffffffffL);
|
||||||
} catch (NoSuchElementException e) {
|
}
|
||||||
|
catch (NoSuchElementException e) {
|
||||||
// Not as good - better than nothing
|
// Not as good - better than nothing
|
||||||
timestamp = recoveryFile.getFile().lastModified();
|
timestamp = recoveryFile.getFile().lastModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
srcFileId = ((long)recoveryFile.getParameter(SRC_FILE_ID_HI_PARM) << 32) |
|
srcFileId = ((long) recoveryFile.getParameter(SRC_FILE_ID_HI_PARM) << 32) |
|
||||||
(recoveryFile.getParameter(SRC_FILE_ID_LOW_PARM) & 0xffffffffL);
|
(recoveryFile.getParameter(SRC_FILE_ID_LOW_PARM) & 0xffffffffL);
|
||||||
|
|
||||||
indexCnt = recoveryFile.getParameter(INDEX_COUNT_PARM);
|
indexCnt = recoveryFile.getParameter(INDEX_COUNT_PARM);
|
||||||
|
@ -204,7 +205,8 @@ class RecoveryFile {
|
||||||
|
|
||||||
readFreeIndexList();
|
readFreeIndexList();
|
||||||
|
|
||||||
} catch (NoSuchElementException e) {
|
}
|
||||||
|
catch (NoSuchElementException e) {
|
||||||
throw new IOException("Corrupt recovery file");
|
throw new IOException("Corrupt recovery file");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,7 +266,8 @@ class RecoveryFile {
|
||||||
try {
|
try {
|
||||||
offset = buf.putInt(offset, realIndexes[i]);
|
offset = buf.putInt(offset, realIndexes[i]);
|
||||||
offset = buf.putInt(offset, bufferIndexMap.get(realIndexes[i]));
|
offset = buf.putInt(offset, bufferIndexMap.get(realIndexes[i]));
|
||||||
} catch (NoValueException e) {
|
}
|
||||||
|
catch (NoValueException e) {
|
||||||
throw new AssertException();
|
throw new AssertException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -414,18 +417,19 @@ class RecoveryFile {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the current index count for the file
|
* Set the current index count for the file
|
||||||
* @param newIndexCnt
|
* @param newIndexCount the count
|
||||||
*/
|
*/
|
||||||
void setIndexCount(int newIndexCnt) {
|
void setIndexCount(int newIndexCount) {
|
||||||
setModified();
|
setModified();
|
||||||
for (int index = indexCnt; index < newIndexCnt; index++) {
|
for (int index = indexCnt; index < newIndexCount; index++) {
|
||||||
removeBuffer(index);
|
removeBuffer(index);
|
||||||
}
|
}
|
||||||
indexCnt = newIndexCnt;
|
indexCnt = newIndexCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the index count for the file
|
* Returns the index count for the file
|
||||||
|
* @return the count
|
||||||
*/
|
*/
|
||||||
int getIndexCount() {
|
int getIndexCount() {
|
||||||
return indexCnt;
|
return indexCnt;
|
||||||
|
@ -433,20 +437,20 @@ class RecoveryFile {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the free index list
|
* Set the free index list
|
||||||
* @param freeIndexes
|
* @param freeIndexes the indexes
|
||||||
*/
|
*/
|
||||||
void setFreeIndexList(int[] freeIndexes) {
|
void setFreeIndexList(int[] freeIndexes) {
|
||||||
setModified();
|
setModified();
|
||||||
this.freeIndexes = freeIndexes.clone();
|
this.freeIndexes = freeIndexes.clone();
|
||||||
Arrays.sort(this.freeIndexes);
|
Arrays.sort(this.freeIndexes);
|
||||||
for (int i = 0; i < freeIndexes.length; i++) {
|
for (int index : freeIndexes) {
|
||||||
removeBuffer(freeIndexes[i]);
|
removeBuffer(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of free indexes associated with the original
|
* Returns the list of free indexes associated with the original buffer file.
|
||||||
* buffer file.
|
* @return the indexes
|
||||||
*/
|
*/
|
||||||
int[] getFreeIndexList() {
|
int[] getFreeIndexList() {
|
||||||
return freeIndexes;
|
return freeIndexes;
|
||||||
|
@ -455,7 +459,6 @@ class RecoveryFile {
|
||||||
/**
|
/**
|
||||||
* Store buffer which has been modified in the target.
|
* Store buffer which has been modified in the target.
|
||||||
* @param buf modified buffer
|
* @param buf modified buffer
|
||||||
* @param id buffer ID
|
|
||||||
* @throws IOException if an IO error occurs
|
* @throws IOException if an IO error occurs
|
||||||
*/
|
*/
|
||||||
void putBuffer(DataBuffer buf) throws IOException {
|
void putBuffer(DataBuffer buf) throws IOException {
|
||||||
|
@ -470,7 +473,8 @@ class RecoveryFile {
|
||||||
int id = buf.getId();
|
int id = buf.getId();
|
||||||
try {
|
try {
|
||||||
vfIndex = bufferIndexMap.get(id);
|
vfIndex = bufferIndexMap.get(id);
|
||||||
} catch (NoValueException e) {
|
}
|
||||||
|
catch (NoValueException e) {
|
||||||
vfIndex = vfIndexProvider.allocateIndex();
|
vfIndex = vfIndexProvider.allocateIndex();
|
||||||
bufferIndexMap.put(id, vfIndex);
|
bufferIndexMap.put(id, vfIndex);
|
||||||
}
|
}
|
||||||
|
@ -480,7 +484,7 @@ class RecoveryFile {
|
||||||
/**
|
/**
|
||||||
* Remove a buffer previously stored to the snapshot
|
* Remove a buffer previously stored to the snapshot
|
||||||
* by removing it from the map. It is OK to invoke
|
* by removing it from the map. It is OK to invoke
|
||||||
* this method for an index whoose buffer was never
|
* this method for an index whose buffer was never
|
||||||
* put into this file.
|
* put into this file.
|
||||||
* @param id buffer ID
|
* @param id buffer ID
|
||||||
*/
|
*/
|
||||||
|
@ -489,7 +493,9 @@ class RecoveryFile {
|
||||||
try {
|
try {
|
||||||
int vfIndex = bufferIndexMap.remove(id);
|
int vfIndex = bufferIndexMap.remove(id);
|
||||||
vfIndexProvider.freeIndex(vfIndex);
|
vfIndexProvider.freeIndex(vfIndex);
|
||||||
} catch (NoValueException e) {
|
}
|
||||||
|
catch (NoValueException e) {
|
||||||
|
// ignore?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,7 +514,8 @@ class RecoveryFile {
|
||||||
int vfIndex;
|
int vfIndex;
|
||||||
try {
|
try {
|
||||||
vfIndex = bufferIndexMap.get(id);
|
vfIndex = bufferIndexMap.get(id);
|
||||||
} catch (NoValueException e) {
|
}
|
||||||
|
catch (NoValueException e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
recoveryFile.get(buf, vfIndex);
|
recoveryFile.get(buf, vfIndex);
|
||||||
|
@ -518,6 +525,7 @@ class RecoveryFile {
|
||||||
/**
|
/**
|
||||||
* Returns list of buffer indexes stored within this file.
|
* Returns list of buffer indexes stored within this file.
|
||||||
* These indexes reflect those buffers which have been modified and stored.
|
* These indexes reflect those buffers which have been modified and stored.
|
||||||
|
* @return the indexes
|
||||||
*/
|
*/
|
||||||
int[] getBufferIndexes() {
|
int[] getBufferIndexes() {
|
||||||
return bufferIndexMap.getKeys();
|
return bufferIndexMap.getKeys();
|
||||||
|
@ -525,24 +533,26 @@ class RecoveryFile {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns file ID for original source buffer file which may be produced with this version file.
|
* Returns file ID for original source buffer file which may be produced with this version file.
|
||||||
|
* @return the id
|
||||||
*/
|
*/
|
||||||
long getSourceFileID() {
|
long getSourceFileID() {
|
||||||
return srcFileId;
|
return srcFileId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of parameters defined within the original beffer file.
|
* Returns a list of parameters defined within the original buffer file.
|
||||||
* @throws IOException
|
* @return the names
|
||||||
|
* @throws IOException if the recovery file is null
|
||||||
*/
|
*/
|
||||||
String[] getUserParameterNames() throws IOException {
|
String[] getUserParameterNames() throws IOException {
|
||||||
if (recoveryFile == null) {
|
if (recoveryFile == null) {
|
||||||
throw new IOException("Version file is closed");
|
throw new IOException("Version file is closed");
|
||||||
}
|
}
|
||||||
String[] allNames = recoveryFile.getParameterNames();
|
String[] allNames = recoveryFile.getParameterNames();
|
||||||
ArrayList<String> list = new ArrayList<String>();
|
ArrayList<String> list = new ArrayList<>();
|
||||||
for (int i = 0; i < allNames.length; i++) {
|
for (String name : allNames) {
|
||||||
if (!allNames[i].startsWith(RECOVERY_PARM_PREFIX)) {
|
if (!name.startsWith(RECOVERY_PARM_PREFIX)) {
|
||||||
list.add(allNames[i]);
|
list.add(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String[] names = new String[list.size()];
|
String[] names = new String[list.size()];
|
||||||
|
@ -554,7 +564,7 @@ class RecoveryFile {
|
||||||
* Get a parameter value associated with the original buffer file.
|
* Get a parameter value associated with the original buffer file.
|
||||||
* @param name parameter name
|
* @param name parameter name
|
||||||
* @return parameter value
|
* @return parameter value
|
||||||
* @throws IOException
|
* @throws IOException if the recovery file is null
|
||||||
*/
|
*/
|
||||||
int getParameter(String name) throws IOException {
|
int getParameter(String name) throws IOException {
|
||||||
if (recoveryFile == null) {
|
if (recoveryFile == null) {
|
||||||
|
@ -571,10 +581,10 @@ class RecoveryFile {
|
||||||
|
|
||||||
// Remember recovery parameters
|
// Remember recovery parameters
|
||||||
String[] allNames = recoveryFile.getParameterNames();
|
String[] allNames = recoveryFile.getParameterNames();
|
||||||
Hashtable<String,Integer> recoveryProps = new Hashtable<String,Integer>();
|
Hashtable<String, Integer> recoveryProps = new Hashtable<>();
|
||||||
for (int i = 0; i < allNames.length; i++) {
|
for (String name : allNames) {
|
||||||
if (allNames[i].startsWith(RECOVERY_PARM_PREFIX)) {
|
if (name.startsWith(RECOVERY_PARM_PREFIX)) {
|
||||||
recoveryProps.put(allNames[i], new Integer(recoveryFile.getParameter(allNames[i])));
|
recoveryProps.put(name, recoveryFile.getParameter(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,14 +596,14 @@ class RecoveryFile {
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
String name = iter.next();
|
String name = iter.next();
|
||||||
recoveryFile.setParameter(
|
recoveryFile.setParameter(
|
||||||
name, recoveryProps.get(name).intValue());
|
name, recoveryProps.get(name).intValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set user parameter
|
* Set user parameter
|
||||||
* @param name
|
* @param name the name
|
||||||
* @param value
|
* @param value the value
|
||||||
*/
|
*/
|
||||||
void setParameter(String name, int value) {
|
void setParameter(String name, int value) {
|
||||||
setModified();
|
setModified();
|
||||||
|
|
|
@ -287,7 +287,7 @@ public class VersionedDatabase extends Database {
|
||||||
/**
|
/**
|
||||||
* Open a specific version of this database for non-update use.
|
* Open a specific version of this database for non-update use.
|
||||||
* @param version database version or LATEST_VERSION for current version
|
* @param version database version or LATEST_VERSION for current version
|
||||||
* @param minChangeDataVer the minimum database version whoose change data
|
* @param minChangeDataVer the minimum database version whose change data
|
||||||
* should be associated with the returned buffer file. A value of -1 indicates that
|
* should be associated with the returned buffer file. A value of -1 indicates that
|
||||||
* change data is not required.
|
* change data is not required.
|
||||||
* @return buffer file for non-update use.
|
* @return buffer file for non-update use.
|
||||||
|
|
|
@ -256,7 +256,7 @@ abstract class CompositeDBAdapter {
|
||||||
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get composite record whoose sourceID and datatypeID match the specified Universal IDs.
|
* Get composite record whose sourceID and datatypeID match the specified Universal IDs.
|
||||||
* @param sourceID universal source archive ID
|
* @param sourceID universal source archive ID
|
||||||
* @param datatypeID universal datatype ID
|
* @param datatypeID universal datatype ID
|
||||||
* @return composite record found or null
|
* @return composite record found or null
|
||||||
|
|
|
@ -159,16 +159,17 @@ abstract class EnumDBAdapter {
|
||||||
/**
|
/**
|
||||||
* Updates the enumeration data type table with the provided record.
|
* Updates the enumeration data type table with the provided record.
|
||||||
* @param record the new record
|
* @param record the new record
|
||||||
* @param setLastChangedTime true means change the last change time in the record to the
|
* @param setLastChangeTime true means change the last change time in the record to the
|
||||||
* current time before putting the record in the database.
|
* current time before putting the record in the database.
|
||||||
* @throws IOException if the database can't be accessed.
|
* @throws IOException if the database can't be accessed.
|
||||||
*/
|
*/
|
||||||
abstract void updateRecord(DBRecord record, boolean setLastChangeTime) throws IOException;
|
abstract void updateRecord(DBRecord record, boolean setLastChangeTime) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the record for the given enumeration ID, and remove all of its
|
* Remove the record for the given enumeration ID, and remove all of its associated value
|
||||||
* associated value records.
|
* records.
|
||||||
* @param enumID ID of enumerated data type to delete
|
* @param enumID ID of enumerated data type to delete
|
||||||
|
* @return true if successful
|
||||||
* @throws IOException if there was a problem accessing the database
|
* @throws IOException if there was a problem accessing the database
|
||||||
*/
|
*/
|
||||||
abstract boolean removeRecord(long enumID) throws IOException;
|
abstract boolean removeRecord(long enumID) throws IOException;
|
||||||
|
@ -198,7 +199,7 @@ abstract class EnumDBAdapter {
|
||||||
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get enum record whoose sourceID and datatypeID match the specified Universal IDs.
|
* Get enum record whose sourceID and datatypeID match the specified Universal IDs.
|
||||||
* @param sourceID universal source archive ID
|
* @param sourceID universal source archive ID
|
||||||
* @param datatypeID universal datatype ID
|
* @param datatypeID universal datatype ID
|
||||||
* @return enum record found or null
|
* @return enum record found or null
|
||||||
|
|
|
@ -187,7 +187,7 @@ abstract class FunctionDefinitionDBAdapter {
|
||||||
/**
|
/**
|
||||||
* Updates the function definition data type table with the provided record.
|
* Updates the function definition data type table with the provided record.
|
||||||
* @param record the new record
|
* @param record the new record
|
||||||
* @param setLastChangedTime true means change the last change time in the record to the
|
* @param setLastChangeTime true means change the last change time in the record to the
|
||||||
* current time before putting the record in the database.
|
* current time before putting the record in the database.
|
||||||
* @throws IOException if the database can't be accessed.
|
* @throws IOException if the database can't be accessed.
|
||||||
*/
|
*/
|
||||||
|
@ -218,7 +218,7 @@ abstract class FunctionDefinitionDBAdapter {
|
||||||
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get function definition record whoose sourceID and datatypeID match the specified Universal IDs.
|
* Get function definition record whose sourceID and datatypeID match the specified Universal IDs.
|
||||||
* @param sourceID universal source archive ID
|
* @param sourceID universal source archive ID
|
||||||
* @param datatypeID universal datatype ID
|
* @param datatypeID universal datatype ID
|
||||||
* @return function definition record found or null
|
* @return function definition record found or null
|
||||||
|
|
|
@ -156,7 +156,7 @@ abstract class TypedefDBAdapter {
|
||||||
/**
|
/**
|
||||||
* Updates the type definition data type table with the provided record.
|
* Updates the type definition data type table with the provided record.
|
||||||
* @param record the new record
|
* @param record the new record
|
||||||
* @param setLastChangedTime true means change the last change time in the record to the
|
* @param setLastChangeTime true means change the last change time in the record to the
|
||||||
* current time before putting the record in the database.
|
* current time before putting the record in the database.
|
||||||
* @throws IOException if the database can't be accessed.
|
* @throws IOException if the database can't be accessed.
|
||||||
*/
|
*/
|
||||||
|
@ -187,7 +187,7 @@ abstract class TypedefDBAdapter {
|
||||||
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
abstract Field[] getRecordIdsForSourceArchive(long archiveID) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get typedef record whoose sourceID and datatypeID match the specified Universal IDs.
|
* Get typedef record whose sourceID and datatypeID match the specified Universal IDs.
|
||||||
* @param sourceID universal source archive ID
|
* @param sourceID universal source archive ID
|
||||||
* @param datatypeID universal datatype ID
|
* @param datatypeID universal datatype ID
|
||||||
* @return typedef record found or null
|
* @return typedef record found or null
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,13 +15,13 @@
|
||||||
*/
|
*/
|
||||||
package ghidra.program.database.oldfunction;
|
package ghidra.program.database.oldfunction;
|
||||||
|
|
||||||
|
import db.DBHandle;
|
||||||
import ghidra.program.database.map.AddressMap;
|
import ghidra.program.database.map.AddressMap;
|
||||||
import ghidra.program.database.util.SharedRangeMapDB;
|
import ghidra.program.database.util.SharedRangeMapDB;
|
||||||
import ghidra.program.model.address.AddressSet;
|
import ghidra.program.model.address.AddressSet;
|
||||||
import ghidra.program.model.address.AddressSetView;
|
import ghidra.program.model.address.AddressSetView;
|
||||||
import ghidra.util.datastruct.IndexRange;
|
import ghidra.util.datastruct.IndexRange;
|
||||||
import ghidra.util.datastruct.IndexRangeIterator;
|
import ghidra.util.datastruct.IndexRangeIterator;
|
||||||
import db.DBHandle;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -52,7 +51,8 @@ class OldFunctionMapDB {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the address set which makes up a function.
|
* Get the address set which makes up a function.
|
||||||
* @param functionKey
|
* @param functionKey the function key
|
||||||
|
* @return the addresses
|
||||||
*/
|
*/
|
||||||
synchronized AddressSetView getBody(long functionKey) {
|
synchronized AddressSetView getBody(long functionKey) {
|
||||||
AddressSet body = new AddressSet();
|
AddressSet body = new AddressSet();
|
||||||
|
@ -81,7 +81,7 @@ class OldFunctionMapDB {
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// /**
|
// /**
|
||||||
// * Get all function keys whoose body contains the specified address.
|
// * Get all function keys whose body contains the specified address.
|
||||||
// * @param addr
|
// * @param addr
|
||||||
// * @return a LongField function key iterator.
|
// * @return a LongField function key iterator.
|
||||||
// */
|
// */
|
||||||
|
@ -91,7 +91,7 @@ class OldFunctionMapDB {
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// /**
|
// /**
|
||||||
// * Get all function keys whoose body overlaps the specified address set.
|
// * Get all function keys whose body overlaps the specified address set.
|
||||||
// * @param set
|
// * @param set
|
||||||
// * @return a LongField function key iterator.
|
// * @return a LongField function key iterator.
|
||||||
// */
|
// */
|
||||||
|
|
|
@ -38,7 +38,7 @@ public interface CompositeInternal extends Composite {
|
||||||
public final static int DEFAULT_PACKING = 0;
|
public final static int DEFAULT_PACKING = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The stored packing value which corresponds to a composite whoose packing has been disabled.
|
* The stored packing value which corresponds to a composite whose packing has been disabled.
|
||||||
* In the case of structures this will permit explicit component placement by
|
* In the case of structures this will permit explicit component placement by
|
||||||
* offset within the structure and undefined filler components will be used.
|
* offset within the structure and undefined filler components will be used.
|
||||||
* This is the initial state of all newly instantiated structures.
|
* This is the initial state of all newly instantiated structures.
|
||||||
|
|
|
@ -102,7 +102,7 @@ public interface DataTypeManager {
|
||||||
* This method provides the added benefit of equivalence caching
|
* This method provides the added benefit of equivalence caching
|
||||||
* for improved performance.
|
* for improved performance.
|
||||||
* <br>
|
* <br>
|
||||||
* WARNING: This is an experimental method whoose use may cause the GUI and
|
* WARNING: This is an experimental method whose use may cause the GUI and
|
||||||
* task monitor to become unresponsive due to extended hold times on the manager lock.
|
* task monitor to become unresponsive due to extended hold times on the manager lock.
|
||||||
* @param dataTypes collection of datatypes
|
* @param dataTypes collection of datatypes
|
||||||
* @param handler conflict handler
|
* @param handler conflict handler
|
||||||
|
|
|
@ -194,7 +194,7 @@ public class VariableUtilities {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform variable storage checks using the specified datatype.
|
* Perform variable storage checks using the specified datatype.
|
||||||
* @param storage variable storage whoose size must match the specified data type size
|
* @param storage variable storage whose size must match the specified data type size
|
||||||
* @param dataType a datatype checked using {@link #checkDataType(DataType, boolean, int, Program)}
|
* @param dataType a datatype checked using {@link #checkDataType(DataType, boolean, int, Program)}
|
||||||
* @param allowSizeMismatch if true size mismatch will be ignore
|
* @param allowSizeMismatch if true size mismatch will be ignore
|
||||||
* @throws InvalidInputException
|
* @throws InvalidInputException
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -19,18 +18,20 @@ package ghidra.program.model.symbol;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>OffsetReference</code> is a memory reference whoose "to" address is
|
* <code>OffsetReference</code> is a memory reference whose "to" address is
|
||||||
* computed from a base address plus an offset.
|
* computed from a base address plus an offset.
|
||||||
*/
|
*/
|
||||||
public interface OffsetReference extends Reference {
|
public interface OffsetReference extends Reference {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the offset.
|
* Returns the offset.
|
||||||
|
* @return the offset
|
||||||
*/
|
*/
|
||||||
public long getOffset();
|
public long getOffset();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the base address.
|
* Returns the base address.
|
||||||
|
* @return the address
|
||||||
*/
|
*/
|
||||||
public Address getBaseAddress();
|
public Address getBaseAddress();
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -17,18 +16,20 @@
|
||||||
package ghidra.program.model.symbol;
|
package ghidra.program.model.symbol;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>ShiftedReference</code> is a memory reference whoose "to" address is
|
* <code>ShiftedReference</code> is a memory reference whose "to" address is
|
||||||
* computed from a base value left shifted by a shift amount.
|
* computed from a base value left shifted by a shift amount.
|
||||||
*/
|
*/
|
||||||
public interface ShiftedReference extends Reference {
|
public interface ShiftedReference extends Reference {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the left shift amount.
|
* Returns the left shift amount.
|
||||||
|
* @return the shift
|
||||||
*/
|
*/
|
||||||
public int getShift();
|
public int getShift();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the base value.
|
* Returns the base value.
|
||||||
|
* @return the value
|
||||||
*/
|
*/
|
||||||
public long getValue();
|
public long getValue();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue