diff --git a/src/common/objects/dobjtype.cpp b/src/common/objects/dobjtype.cpp index 549a9b101..b39c930f8 100644 --- a/src/common/objects/dobjtype.cpp +++ b/src/common/objects/dobjtype.cpp @@ -591,13 +591,13 @@ PClass *PClass::CreateDerivedClass(FName name, unsigned int size, bool *newlycre // //========================================================================== -PField *PClass::AddField(FName name, PType *type, uint32_t flags) +PField *PClass::AddField(FName name, PType *type, uint32_t flags, int fileno) { PField *field; if (!(flags & VARF_Meta)) { unsigned oldsize = Size; - field = VMType->Symbols.AddField(name, type, flags, Size); + field = VMType->Symbols.AddField(name, type, flags, Size, nullptr, fileno); // Only initialize the defaults if they have already been created. // For ZScript this is not the case, it will first define all fields before @@ -612,7 +612,7 @@ PField *PClass::AddField(FName name, PType *type, uint32_t flags) { // Same as above, but a different data storage. unsigned oldsize = MetaSize; - field = VMType->Symbols.AddField(name, type, flags, MetaSize); + field = VMType->Symbols.AddField(name, type, flags, MetaSize, nullptr, fileno); if (field != nullptr && !(flags & VARF_Native) && Meta != nullptr) { diff --git a/src/common/objects/dobjtype.h b/src/common/objects/dobjtype.h index db3e5b974..c8464a030 100644 --- a/src/common/objects/dobjtype.h +++ b/src/common/objects/dobjtype.h @@ -45,7 +45,7 @@ public: bool ReadAllFields(FSerializer &ar, void *addr) const; int FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction *parentfunc, bool exactReturnType); PSymbol *FindSymbol(FName symname, bool searchparents) const; - PField *AddField(FName name, PType *type, uint32_t flags); + PField *AddField(FName name, PType *type, uint32_t flags, int fileno = 0); void InitializeDefaults(); static void StaticInit(); diff --git a/src/common/scripting/core/symbols.cpp b/src/common/scripting/core/symbols.cpp index be0b11e18..d293cbbee 100644 --- a/src/common/scripting/core/symbols.cpp +++ b/src/common/scripting/core/symbols.cpp @@ -137,7 +137,6 @@ PField::PField() { } - PField::PField(FName name, PType *type, uint32_t flags, size_t offset, int bitvalue) : PSymbol(name), Offset(offset), Type(type), Flags(flags) { @@ -331,10 +330,12 @@ PSymbol *PSymbolTable::AddSymbol (PSymbol *sym) // //========================================================================== -PField *PSymbolTable::AddField(FName name, PType *type, uint32_t flags, unsigned &Size, unsigned *Align) +PField *PSymbolTable::AddField(FName name, PType *type, uint32_t flags, unsigned &Size, unsigned *Align, int fileno) { PField *field = Create(name, type, flags); + field->mDefFileNo = fileno; + // The new field is added to the end of this struct, alignment permitting. field->Offset = (Size + (type->Align - 1)) & ~(type->Align - 1); @@ -365,10 +366,12 @@ PField *PSymbolTable::AddField(FName name, PType *type, uint32_t flags, unsigned // //========================================================================== -PField *PSymbolTable::AddNativeField(FName name, PType *type, size_t address, uint32_t flags, int bitvalue) +PField *PSymbolTable::AddNativeField(FName name, PType *type, size_t address, uint32_t flags, int bitvalue, int fileno) { PField *field = Create(name, type, flags | VARF_Native | VARF_Transient, address, bitvalue); + field->mDefFileNo = fileno; + if (AddSymbol(field) == nullptr) { // name is already in use field->Destroy(); diff --git a/src/common/scripting/core/symbols.h b/src/common/scripting/core/symbols.h index b7d685339..de5caaae9 100644 --- a/src/common/scripting/core/symbols.h +++ b/src/common/scripting/core/symbols.h @@ -78,6 +78,7 @@ public: uint32_t Flags; int BitValue; FString DeprecationMessage; + int mDefFileNo = 0; protected: PField(); }; @@ -212,8 +213,8 @@ struct PSymbolTable // a symbol with the same name is already in the table. This symbol is // not copied and will be freed when the symbol table is destroyed. PSymbol *AddSymbol (PSymbol *sym); - PField *AddField(FName name, PType *type, uint32_t flags, unsigned &Size, unsigned *Align = nullptr); - PField *AddNativeField(FName name, PType *type, size_t address, uint32_t flags, int bitvalue); + PField *AddField(FName name, PType *type, uint32_t flags, unsigned &Size, unsigned *Align = nullptr, int fileno = 0); + PField *AddNativeField(FName name, PType *type, size_t address, uint32_t flags, int bitvalue, int fileno = 0); bool ReadFields(FSerializer &ar, void *addr, const char *TypeName) const; void WriteFields(FSerializer &ar, const void *addr, const void *def = nullptr) const; diff --git a/src/common/scripting/core/types.cpp b/src/common/scripting/core/types.cpp index 41671a98f..6c40aa5f0 100644 --- a/src/common/scripting/core/types.cpp +++ b/src/common/scripting/core/types.cpp @@ -3156,7 +3156,7 @@ PField *PStruct::AddField(FName name, PType *type, uint32_t flags) PField *PStruct::AddNativeField(FName name, PType *type, size_t address, uint32_t flags, int bitvalue) { - return Symbols.AddNativeField(name, type, address, flags, bitvalue); + return Symbols.AddNativeField(name, type, address, flags, bitvalue, mDefFileNo); } //========================================================================== @@ -3297,7 +3297,7 @@ PClassType::PClassType(PClass *cls, int fileno) PField *PClassType::AddField(FName name, PType *type, uint32_t flags) { - return Descriptor->AddField(name, type, flags); + return Descriptor->AddField(name, type, flags, mDefFileNo); } //========================================================================== @@ -3308,7 +3308,7 @@ PField *PClassType::AddField(FName name, PType *type, uint32_t flags) PField *PClassType::AddNativeField(FName name, PType *type, size_t address, uint32_t flags, int bitvalue) { - auto field = Symbols.AddNativeField(name, type, address, flags, bitvalue); + auto field = Symbols.AddNativeField(name, type, address, flags, bitvalue, mDefFileNo); if (field != nullptr) Descriptor->Fields.Push(field); return field; }