Skip to content

Commit

Permalink
stricter typing in FlatPointers/ArrayPointers/MapPointers
Browse files Browse the repository at this point in the history
  • Loading branch information
RicardoLuis0 committed Mar 13, 2024
1 parent a80e2e4 commit 422a903
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 64 deletions.
72 changes: 37 additions & 35 deletions src/common/objects/dobjtype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -768,13 +768,15 @@ PSymbol *PClass::FindSymbol(FName symname, bool searchparents) const

void PClass::BuildFlatPointers() const
{
using pairType = std::pair<size_t, PObjectPointer *>;

if (FlatPointers != nullptr)
{ // Already built: Do nothing.
return;
}
else
{
TArray<std::pair<size_t,PType *>> NativePointers;
TArray<pairType> NativePointers;
if (Pointers != nullptr)
{
for (size_t i = 0; Pointers[i] != ~(size_t)0; i++)
Expand All @@ -787,13 +789,13 @@ void PClass::BuildFlatPointers() const
{ // No parent (i.e. DObject): FlatPointers is the same as Pointers.
if (NativePointers.Size() == 0)
{ // No pointers: Make FlatPointers a harmless non-nullptr.
FlatPointers = &TheEnd;
FlatPointers = (pairType*)(&TheEnd);
FlatPointersSize = 0;
}
else
{
std::pair<size_t,PType *> *flat = (std::pair<size_t,PType *>*)ClassDataAllocator.Alloc(sizeof(std::pair<size_t,PType *>) * NativePointers.Size());
memcpy(flat, NativePointers.Data(), sizeof(std::pair<size_t,PType *>) * NativePointers.Size());
pairType *flat = (pairType*)ClassDataAllocator.Alloc(sizeof(pairType) * NativePointers.Size());
memcpy(flat, NativePointers.Data(), sizeof(pairType) * NativePointers.Size());

FlatPointers = flat;
FlatPointersSize = NativePointers.Size();
Expand All @@ -803,7 +805,7 @@ void PClass::BuildFlatPointers() const
{
ParentClass->BuildFlatPointers();

TArray<std::pair<size_t,PType *>> ScriptPointers;
TArray<pairType> ScriptPointers;

// Collect all pointers in scripted fields. These are not part of the Pointers list.
for (auto field : Fields)
Expand All @@ -820,25 +822,24 @@ void PClass::BuildFlatPointers() const
FlatPointersSize = ParentClass->FlatPointersSize;
}
else
{ // New pointers: Create a new FlatPointers array and add them.
int numSuperPointers = ParentClass->FlatPointersSize;

{ // New pointers: Create a new FlatPointers array and add them.
// Concatenate them into a new array
std::pair<size_t,PType *> *flat = (std::pair<size_t,PType *>*)ClassDataAllocator.Alloc(sizeof(std::pair<size_t,PType *>) * (numSuperPointers + NativePointers.Size() + ScriptPointers.Size()));
if (numSuperPointers > 0)
pairType *flat = (pairType*)ClassDataAllocator.Alloc(sizeof(pairType) * (ParentClass->FlatPointersSize + NativePointers.Size() + ScriptPointers.Size()));

if (ParentClass->FlatPointersSize > 0)
{
memcpy (flat, ParentClass->FlatPointers, sizeof(std::pair<size_t,PType *>) * numSuperPointers);
memcpy (flat, ParentClass->FlatPointers, sizeof(pairType) * ParentClass->FlatPointersSize);
}
if (NativePointers.Size() > 0)
{
memcpy(flat + numSuperPointers, NativePointers.Data(), sizeof(std::pair<size_t,PType *>) * NativePointers.Size());
memcpy(flat + ParentClass->FlatPointersSize, NativePointers.Data(), sizeof(pairType) * NativePointers.Size());
}
if (ScriptPointers.Size() > 0)
{
memcpy(flat + numSuperPointers + NativePointers.Size(), &ScriptPointers[0], sizeof(std::pair<size_t,PType *>) * ScriptPointers.Size());
memcpy(flat + ParentClass->FlatPointersSize + NativePointers.Size(), &ScriptPointers[0], sizeof(pairType) * ScriptPointers.Size());
}
FlatPointers = flat;
FlatPointersSize = numSuperPointers + NativePointers.Size() + ScriptPointers.Size();
FlatPointersSize = ParentClass->FlatPointersSize + NativePointers.Size() + ScriptPointers.Size();
}
}
}
Expand All @@ -854,20 +855,22 @@ void PClass::BuildFlatPointers() const

void PClass::BuildArrayPointers() const
{
using pairType = std::pair<size_t, PDynArray *>;

if (ArrayPointers != nullptr)
{ // Already built: Do nothing.
return;
}
else if (ParentClass == nullptr)
{ // No parent (i.e. DObject): Make ArrayPointers a harmless non-nullptr.
ArrayPointers = &TheEnd;
ArrayPointersSize = 0;;
ArrayPointers = (pairType*)(&TheEnd);
ArrayPointersSize = 0;
}
else
{
ParentClass->BuildArrayPointers();

TArray<std::pair<size_t,PType *>> ScriptPointers;
TArray<pairType> ScriptPointers;

// Collect all arrays to pointers in scripted fields.
for (auto field : Fields)
Expand All @@ -881,25 +884,24 @@ void PClass::BuildArrayPointers() const
if (ScriptPointers.Size() == 0)
{ // No new pointers: Just use the same ArrayPointers as the parent.
ArrayPointers = ParentClass->ArrayPointers;
ArrayPointersSize = ParentClass->ArrayPointersSize;
}
else
{ // New pointers: Create a new ArrayPointers array and add them.
int numSuperPointers = ParentClass->ArrayPointersSize;

{ // New pointers: Create a new ArrayPointers array and add them.
// Concatenate them into a new array
std::pair<size_t,PType *> *flat = (std::pair<size_t,PType *>*)ClassDataAllocator.Alloc(sizeof(std::pair<size_t,PType *>) * (numSuperPointers + ScriptPointers.Size()));
if (numSuperPointers > 0)
pairType *flat = (pairType*)ClassDataAllocator.Alloc(sizeof(pairType) * (ParentClass->ArrayPointersSize + ScriptPointers.Size()));
if (ParentClass->ArrayPointersSize > 0)
{
memcpy(flat, ParentClass->ArrayPointers, sizeof(std::pair<size_t,PType *>) * numSuperPointers);
memcpy(flat, ParentClass->ArrayPointers, sizeof(pairType) * ParentClass->ArrayPointersSize);
}

if (ScriptPointers.Size() > 0)
{
memcpy(flat + numSuperPointers, ScriptPointers.Data(), sizeof(std::pair<size_t,PType *>) * ScriptPointers.Size());
memcpy(flat + ParentClass->ArrayPointersSize, ScriptPointers.Data(), sizeof(pairType) * ScriptPointers.Size());
}

ArrayPointers = flat;
ArrayPointersSize = numSuperPointers + ScriptPointers.Size();
ArrayPointersSize = ParentClass->ArrayPointersSize + ScriptPointers.Size();
}
}
}
Expand All @@ -914,20 +916,22 @@ void PClass::BuildArrayPointers() const

void PClass::BuildMapPointers() const
{
using pairType = std::pair<size_t, PMap *>;

if (MapPointers != nullptr)
{ // Already built: Do nothing.
return;
}
else if (ParentClass == nullptr)
{ // No parent (i.e. DObject): Make MapPointers a harmless non-nullptr.
MapPointers = &TheEnd;
MapPointers = (pairType*)(&TheEnd);
MapPointersSize = 0;
}
else
{
ParentClass->BuildMapPointers();

TArray<std::pair<size_t,PType *>> ScriptPointers;
TArray<pairType> ScriptPointers;

// Collect all arrays to pointers in scripted fields.
for (auto field : Fields)
Expand All @@ -944,22 +948,20 @@ void PClass::BuildMapPointers() const
MapPointersSize = ParentClass->MapPointersSize;
}
else
{ // New pointers: Create a new FlatPointers array and add them.
int numSuperPointers = ParentClass->MapPointersSize;

{ // New pointers: Create a new FlatPointers array and add them.
// Concatenate them into a new array
std::pair<size_t,PType *> *flat = (std::pair<size_t,PType *>*)ClassDataAllocator.Alloc(sizeof(std::pair<size_t,PType *>) * (numSuperPointers + ScriptPointers.Size()));
if (numSuperPointers > 0)
pairType *flat = (pairType*)ClassDataAllocator.Alloc(sizeof(pairType) * (ParentClass->MapPointersSize + ScriptPointers.Size()));
if (ParentClass->MapPointersSize > 0)
{
memcpy(flat, ParentClass->MapPointers, sizeof(std::pair<size_t,PType *>) * numSuperPointers);
memcpy(flat, ParentClass->MapPointers, sizeof(pairType) * ParentClass->MapPointersSize);
}

if (ScriptPointers.Size() > 0)
{
memcpy(flat + numSuperPointers, ScriptPointers.Data(), sizeof(std::pair<size_t,PType *>) * ScriptPointers.Size());
memcpy(flat + ParentClass->MapPointersSize, ScriptPointers.Data(), sizeof(pairType) * ScriptPointers.Size());
}
MapPointers = flat;
MapPointersSize = numSuperPointers + ScriptPointers.Size();
MapPointersSize = ParentClass->MapPointersSize + ScriptPointers.Size();
}
}
}
Expand Down
9 changes: 6 additions & 3 deletions src/common/objects/dobjtype.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ class PClassType;
struct FNamespaceManager;
class PSymbol;
class PField;
class PObjectPointer;
class PDynArray;
class PMap;

enum
{
Expand Down Expand Up @@ -56,11 +59,11 @@ class PClass
const size_t * Pointers = nullptr; // native object pointers defined by this class *only*

mutable size_t FlatPointersSize = 0;
mutable const std::pair<size_t,PType *> * FlatPointers = nullptr; // object pointers defined by this class and all its superclasses; not initialized by default. PType is PObjectPointer
mutable const std::pair<size_t, PObjectPointer*> * FlatPointers = nullptr; // object pointers defined by this class and all its superclasses; not initialized by default.
mutable size_t ArrayPointersSize = 0;
mutable const std::pair<size_t,PType *> * ArrayPointers = nullptr; // dynamic arrays containing object pointers. PType is PDynArray
mutable const std::pair<size_t, PDynArray *> * ArrayPointers = nullptr; // dynamic arrays containing object pointers.
mutable size_t MapPointersSize = 0;
mutable const std::pair<size_t,PType *> * MapPointers = nullptr; // maps containing object pointers. PType is PMap
mutable const std::pair<size_t, PMap *> * MapPointers = nullptr; // maps containing object pointers.

uint8_t *Defaults = nullptr;
uint8_t *Meta = nullptr; // Per-class static script data
Expand Down
26 changes: 13 additions & 13 deletions src/common/scripting/core/types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,15 +196,15 @@ void PType::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset>
//
//==========================================================================

void PType::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *stroffs)
void PType::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *stroffs)
{
}

void PType::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *stroffs)
void PType::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *stroffs)
{
}

void PType::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *ptrofs)
void PType::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *ptrofs)
{
}

Expand Down Expand Up @@ -1575,7 +1575,7 @@ PObjectPointer::PObjectPointer(PClass *cls, bool isconst)
//
//==========================================================================

void PObjectPointer::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PObjectPointer::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
{
// Add to the list of pointers for this class.
special->Push({offset, this});
Expand Down Expand Up @@ -1706,7 +1706,7 @@ bool PClassPointer::isCompatible(PType *type)
//
//==========================================================================

void PClassPointer::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PClassPointer::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
{
}

Expand Down Expand Up @@ -1908,7 +1908,7 @@ void PArray::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset>
//
//==========================================================================

void PArray::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PArray::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
{
for (unsigned i = 0; i < ElementCount; ++i)
{
Expand All @@ -1922,7 +1922,7 @@ void PArray::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PTy
//
//==========================================================================

void PArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special)
{
if (ElementType->isStruct() || ElementType->isDynArray())
{
Expand All @@ -1939,7 +1939,7 @@ void PArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_
//
//==========================================================================

void PArray::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PArray::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *special)
{
if(ElementType->isStruct() || ElementType->isMap())
{
Expand Down Expand Up @@ -2254,7 +2254,7 @@ void PDynArray::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffs
//
//==========================================================================

void PDynArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PDynArray::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special)
{
if (ElementType->isObjectPointer())
{
Expand Down Expand Up @@ -2524,7 +2524,7 @@ void PMap::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *
//
//==========================================================================

void PMap::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PMap::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *special)
{
if (ValueType->isObjectPointer())
{
Expand Down Expand Up @@ -3264,7 +3264,7 @@ void PStruct::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset
//
//==========================================================================

void PStruct::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PStruct::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t, PObjectPointer *>> *special)
{
auto it = Symbols.GetIterator();
PSymbolTable::MapType::Pair *pair;
Expand All @@ -3284,7 +3284,7 @@ void PStruct::SetPointer(void *base, unsigned offset, TArray<std::pair<size_t,PT
//
//==========================================================================

void PStruct::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PStruct::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size_t, PDynArray *>> *special)
{
auto it = Symbols.GetIterator();
PSymbolTable::MapType::Pair *pair;
Expand All @@ -3304,7 +3304,7 @@ void PStruct::SetPointerArray(void *base, unsigned offset, TArray<std::pair<size
//
//==========================================================================

void PStruct::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t,PType *>> *special)
void PStruct::SetPointerMap(void *base, unsigned offset, TArray<std::pair<size_t, PMap *>> *special)
{
auto it = Symbols.GetIterator();
PSymbolTable::MapType::Pair *pair;
Expand Down
Loading

0 comments on commit 422a903

Please sign in to comment.