From 422a903df7d8fca52923eb2bfe7ea9883fe62c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 13 Mar 2024 14:47:29 -0300 Subject: [PATCH] stricter typing in FlatPointers/ArrayPointers/MapPointers --- src/common/objects/dobjtype.cpp | 72 +++++++++++++++-------------- src/common/objects/dobjtype.h | 9 ++-- src/common/scripting/core/types.cpp | 26 +++++------ src/common/scripting/core/types.h | 29 ++++++------ 4 files changed, 72 insertions(+), 64 deletions(-) diff --git a/src/common/objects/dobjtype.cpp b/src/common/objects/dobjtype.cpp index 17ebf663130..0d1bfdf9a87 100644 --- a/src/common/objects/dobjtype.cpp +++ b/src/common/objects/dobjtype.cpp @@ -768,13 +768,15 @@ PSymbol *PClass::FindSymbol(FName symname, bool searchparents) const void PClass::BuildFlatPointers() const { + using pairType = std::pair; + if (FlatPointers != nullptr) { // Already built: Do nothing. return; } else { - TArray> NativePointers; + TArray NativePointers; if (Pointers != nullptr) { for (size_t i = 0; Pointers[i] != ~(size_t)0; i++) @@ -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 *flat = (std::pair*)ClassDataAllocator.Alloc(sizeof(std::pair) * NativePointers.Size()); - memcpy(flat, NativePointers.Data(), sizeof(std::pair) * NativePointers.Size()); + pairType *flat = (pairType*)ClassDataAllocator.Alloc(sizeof(pairType) * NativePointers.Size()); + memcpy(flat, NativePointers.Data(), sizeof(pairType) * NativePointers.Size()); FlatPointers = flat; FlatPointersSize = NativePointers.Size(); @@ -803,7 +805,7 @@ void PClass::BuildFlatPointers() const { ParentClass->BuildFlatPointers(); - TArray> ScriptPointers; + TArray ScriptPointers; // Collect all pointers in scripted fields. These are not part of the Pointers list. for (auto field : Fields) @@ -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 *flat = (std::pair*)ClassDataAllocator.Alloc(sizeof(std::pair) * (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) * numSuperPointers); + memcpy (flat, ParentClass->FlatPointers, sizeof(pairType) * ParentClass->FlatPointersSize); } if (NativePointers.Size() > 0) { - memcpy(flat + numSuperPointers, NativePointers.Data(), sizeof(std::pair) * 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) * 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(); } } } @@ -854,20 +855,22 @@ void PClass::BuildFlatPointers() const void PClass::BuildArrayPointers() const { + using pairType = std::pair; + 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> ScriptPointers; + TArray ScriptPointers; // Collect all arrays to pointers in scripted fields. for (auto field : Fields) @@ -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 *flat = (std::pair*)ClassDataAllocator.Alloc(sizeof(std::pair) * (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) * numSuperPointers); + memcpy(flat, ParentClass->ArrayPointers, sizeof(pairType) * ParentClass->ArrayPointersSize); } if (ScriptPointers.Size() > 0) { - memcpy(flat + numSuperPointers, ScriptPointers.Data(), sizeof(std::pair) * ScriptPointers.Size()); + memcpy(flat + ParentClass->ArrayPointersSize, ScriptPointers.Data(), sizeof(pairType) * ScriptPointers.Size()); } ArrayPointers = flat; - ArrayPointersSize = numSuperPointers + ScriptPointers.Size(); + ArrayPointersSize = ParentClass->ArrayPointersSize + ScriptPointers.Size(); } } } @@ -914,20 +916,22 @@ void PClass::BuildArrayPointers() const void PClass::BuildMapPointers() const { + using pairType = std::pair; + 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> ScriptPointers; + TArray ScriptPointers; // Collect all arrays to pointers in scripted fields. for (auto field : Fields) @@ -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 *flat = (std::pair*)ClassDataAllocator.Alloc(sizeof(std::pair) * (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) * numSuperPointers); + memcpy(flat, ParentClass->MapPointers, sizeof(pairType) * ParentClass->MapPointersSize); } if (ScriptPointers.Size() > 0) { - memcpy(flat + numSuperPointers, ScriptPointers.Data(), sizeof(std::pair) * ScriptPointers.Size()); + memcpy(flat + ParentClass->MapPointersSize, ScriptPointers.Data(), sizeof(pairType) * ScriptPointers.Size()); } MapPointers = flat; - MapPointersSize = numSuperPointers + ScriptPointers.Size(); + MapPointersSize = ParentClass->MapPointersSize + ScriptPointers.Size(); } } } diff --git a/src/common/objects/dobjtype.h b/src/common/objects/dobjtype.h index 7d34eaabbdc..62e6f5ccc5d 100644 --- a/src/common/objects/dobjtype.h +++ b/src/common/objects/dobjtype.h @@ -27,6 +27,9 @@ class PClassType; struct FNamespaceManager; class PSymbol; class PField; +class PObjectPointer; +class PDynArray; +class PMap; enum { @@ -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 * FlatPointers = nullptr; // object pointers defined by this class and all its superclasses; not initialized by default. PType is PObjectPointer + mutable const std::pair * 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 * ArrayPointers = nullptr; // dynamic arrays containing object pointers. PType is PDynArray + mutable const std::pair * ArrayPointers = nullptr; // dynamic arrays containing object pointers. mutable size_t MapPointersSize = 0; - mutable const std::pair * MapPointers = nullptr; // maps containing object pointers. PType is PMap + mutable const std::pair * MapPointers = nullptr; // maps containing object pointers. uint8_t *Defaults = nullptr; uint8_t *Meta = nullptr; // Per-class static script data diff --git a/src/common/scripting/core/types.cpp b/src/common/scripting/core/types.cpp index aca41849e79..8e13dcc521b 100644 --- a/src/common/scripting/core/types.cpp +++ b/src/common/scripting/core/types.cpp @@ -196,15 +196,15 @@ void PType::SetDefaultValue(void *base, unsigned offset, TArray // //========================================================================== -void PType::SetPointer(void *base, unsigned offset, TArray> *stroffs) +void PType::SetPointer(void *base, unsigned offset, TArray> *stroffs) { } -void PType::SetPointerArray(void *base, unsigned offset, TArray> *stroffs) +void PType::SetPointerArray(void *base, unsigned offset, TArray> *stroffs) { } -void PType::SetPointerMap(void *base, unsigned offset, TArray> *ptrofs) +void PType::SetPointerMap(void *base, unsigned offset, TArray> *ptrofs) { } @@ -1575,7 +1575,7 @@ PObjectPointer::PObjectPointer(PClass *cls, bool isconst) // //========================================================================== -void PObjectPointer::SetPointer(void *base, unsigned offset, TArray> *special) +void PObjectPointer::SetPointer(void *base, unsigned offset, TArray> *special) { // Add to the list of pointers for this class. special->Push({offset, this}); @@ -1706,7 +1706,7 @@ bool PClassPointer::isCompatible(PType *type) // //========================================================================== -void PClassPointer::SetPointer(void *base, unsigned offset, TArray> *special) +void PClassPointer::SetPointer(void *base, unsigned offset, TArray> *special) { } @@ -1908,7 +1908,7 @@ void PArray::SetDefaultValue(void *base, unsigned offset, TArray // //========================================================================== -void PArray::SetPointer(void *base, unsigned offset, TArray> *special) +void PArray::SetPointer(void *base, unsigned offset, TArray> *special) { for (unsigned i = 0; i < ElementCount; ++i) { @@ -1922,7 +1922,7 @@ void PArray::SetPointer(void *base, unsigned offset, TArray> *special) +void PArray::SetPointerArray(void *base, unsigned offset, TArray> *special) { if (ElementType->isStruct() || ElementType->isDynArray()) { @@ -1939,7 +1939,7 @@ void PArray::SetPointerArray(void *base, unsigned offset, TArray> *special) +void PArray::SetPointerMap(void *base, unsigned offset, TArray> *special) { if(ElementType->isStruct() || ElementType->isMap()) { @@ -2254,7 +2254,7 @@ void PDynArray::SetDefaultValue(void *base, unsigned offset, TArray> *special) +void PDynArray::SetPointerArray(void *base, unsigned offset, TArray> *special) { if (ElementType->isObjectPointer()) { @@ -2524,7 +2524,7 @@ void PMap::SetDefaultValue(void *base, unsigned offset, TArray * // //========================================================================== -void PMap::SetPointerMap(void *base, unsigned offset, TArray> *special) +void PMap::SetPointerMap(void *base, unsigned offset, TArray> *special) { if (ValueType->isObjectPointer()) { @@ -3264,7 +3264,7 @@ void PStruct::SetDefaultValue(void *base, unsigned offset, TArray> *special) +void PStruct::SetPointer(void *base, unsigned offset, TArray> *special) { auto it = Symbols.GetIterator(); PSymbolTable::MapType::Pair *pair; @@ -3284,7 +3284,7 @@ void PStruct::SetPointer(void *base, unsigned offset, TArray> *special) +void PStruct::SetPointerArray(void *base, unsigned offset, TArray> *special) { auto it = Symbols.GetIterator(); PSymbolTable::MapType::Pair *pair; @@ -3304,7 +3304,7 @@ void PStruct::SetPointerArray(void *base, unsigned offset, TArray> *special) +void PStruct::SetPointerMap(void *base, unsigned offset, TArray> *special) { auto it = Symbols.GetIterator(); PSymbolTable::MapType::Pair *pair; diff --git a/src/common/scripting/core/types.h b/src/common/scripting/core/types.h index 1c871d72b7c..a092247dea3 100644 --- a/src/common/scripting/core/types.h +++ b/src/common/scripting/core/types.h @@ -68,8 +68,11 @@ class PPointer; class PClassPointer; class PFunctionPointer; class PArray; +class PDynArray; +class PMap; class PStruct; class PClassType; +class PObjectPointer; struct ZCC_ExprConstant; class PType : public PTypeBase @@ -129,9 +132,9 @@ class PType : public PTypeBase // initialization when the object is created and destruction when the // object is destroyed. virtual void SetDefaultValue(void *base, unsigned offset, TArray *special=NULL); - virtual void SetPointer(void *base, unsigned offset, TArray> *ptrofs = NULL); - virtual void SetPointerArray(void *base, unsigned offset, TArray> *ptrofs = NULL); - virtual void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs = NULL); + virtual void SetPointer(void *base, unsigned offset, TArray> *ptrofs = NULL); + virtual void SetPointerArray(void *base, unsigned offset, TArray> *ptrofs = NULL); + virtual void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs = NULL); // Initialize the value, if needed (e.g. strings) virtual void InitializeValue(void *addr, const void *def) const; @@ -455,7 +458,7 @@ class PObjectPointer : public PPointer void WriteValue(FSerializer &ar, const char *key, const void *addr) const override; bool ReadValue(FSerializer &ar, const char *key, void *addr) const override; - void SetPointer(void *base, unsigned offset, TArray> *special = NULL) override; + void SetPointer(void *base, unsigned offset, TArray> *special = NULL) override; PClass *PointedClass() const; }; @@ -471,7 +474,7 @@ class PClassPointer : public PPointer void WriteValue(FSerializer &ar, const char *key, const void *addr) const override; bool ReadValue(FSerializer &ar, const char *key, void *addr) const override; - void SetPointer(void *base, unsigned offset, TArray> *special = NULL) override; + void SetPointer(void *base, unsigned offset, TArray> *special = NULL) override; bool IsMatch(intptr_t id1, intptr_t id2) const override; void GetTypeIDs(intptr_t &id1, intptr_t &id2) const override; }; @@ -503,9 +506,9 @@ class PArray : public PCompoundType bool ReadValue(FSerializer &ar, const char *key,void *addr) const override; void SetDefaultValue(void *base, unsigned offset, TArray *special) override; - void SetPointer(void *base, unsigned offset, TArray> *special) override; - void SetPointerArray(void *base, unsigned offset, TArray> *ptrofs = NULL) override; - void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs = NULL) override; + void SetPointer(void *base, unsigned offset, TArray> *special) override; + void SetPointerArray(void *base, unsigned offset, TArray> *ptrofs = NULL) override; + void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs = NULL) override; }; class PStaticArray : public PArray @@ -535,7 +538,7 @@ class PDynArray : public PCompoundType void SetDefaultValue(void *base, unsigned offset, TArray *specials) override; void InitializeValue(void *addr, const void *def) const override; void DestroyValue(void *addr) const override; - void SetPointerArray(void *base, unsigned offset, TArray> *ptrofs = NULL) override; + void SetPointerArray(void *base, unsigned offset, TArray> *ptrofs = NULL) override; }; class PMap : public PCompoundType @@ -579,7 +582,7 @@ class PMap : public PCompoundType void SetDefaultValue(void *base, unsigned offset, TArray *specials) override; void InitializeValue(void *addr, const void *def) const override; void DestroyValue(void *addr) const override; - void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs) override; + void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs) override; }; @@ -653,9 +656,9 @@ class PStruct : public PContainerType void WriteValue(FSerializer &ar, const char *key,const void *addr) const override; bool ReadValue(FSerializer &ar, const char *key,void *addr) const override; void SetDefaultValue(void *base, unsigned offset, TArray *specials) override; - void SetPointer(void *base, unsigned offset, TArray> *specials) override; - void SetPointerArray(void *base, unsigned offset, TArray> *special) override; - void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs) override; + void SetPointer(void *base, unsigned offset, TArray> *specials) override; + void SetPointerArray(void *base, unsigned offset, TArray> *special) override; + void SetPointerMap(void *base, unsigned offset, TArray> *ptrofs) override; }; class PPrototype : public PCompoundType