- added bookkeeping info to types for allowing data on the stack that requires construction and destruction.

- removed unused PVector type.
This commit is contained in:
Christoph Oelckers 2016-11-17 11:16:00 +01:00
parent 21a1d5ffc8
commit 30e6e8e25f
2 changed files with 170 additions and 64 deletions

View file

@ -541,7 +541,6 @@ void PType::StaticInit()
RUNTIME_CLASS(PEnum)->TypeTableType = RUNTIME_CLASS(PEnum); RUNTIME_CLASS(PEnum)->TypeTableType = RUNTIME_CLASS(PEnum);
RUNTIME_CLASS(PArray)->TypeTableType = RUNTIME_CLASS(PArray); RUNTIME_CLASS(PArray)->TypeTableType = RUNTIME_CLASS(PArray);
RUNTIME_CLASS(PDynArray)->TypeTableType = RUNTIME_CLASS(PDynArray); RUNTIME_CLASS(PDynArray)->TypeTableType = RUNTIME_CLASS(PDynArray);
RUNTIME_CLASS(PVector)->TypeTableType = RUNTIME_CLASS(PVector);
RUNTIME_CLASS(PMap)->TypeTableType = RUNTIME_CLASS(PMap); RUNTIME_CLASS(PMap)->TypeTableType = RUNTIME_CLASS(PMap);
RUNTIME_CLASS(PStruct)->TypeTableType = RUNTIME_CLASS(PStruct); RUNTIME_CLASS(PStruct)->TypeTableType = RUNTIME_CLASS(PStruct);
RUNTIME_CLASS(PPrototype)->TypeTableType = RUNTIME_CLASS(PPrototype); RUNTIME_CLASS(PPrototype)->TypeTableType = RUNTIME_CLASS(PPrototype);
@ -1870,6 +1869,39 @@ void PArray::SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset>
} }
} }
//==========================================================================
//
// PArray :: InitializeValue
// This is needed for local array variables
//
//==========================================================================
void PArray::InitializeValue(void *addr, const void *def) const
{
char *caddr = (char*)addr;
char *cdef = (char*)def;
for (unsigned i = 0; i < ElementCount; ++i)
{
ElementType->InitializeValue(caddr + i * ElementSize, cdef + i * ElementSize);
}
}
//==========================================================================
//
// PArray :: DestroyValue
// This is needed for local array variables
//
//==========================================================================
void PArray::DestroyValue(void *addr) const
{
char *caddr = (char*)addr;
for (unsigned i = 0; i < ElementCount; ++i)
{
ElementType->DestroyValue(caddr + i * ElementSize);
}
}
//========================================================================== //==========================================================================
// //
// NewArray // NewArray
@ -1891,56 +1923,6 @@ PArray *NewArray(PType *type, unsigned int count)
return (PArray *)atype; return (PArray *)atype;
} }
/* PVector ****************************************************************/
IMPLEMENT_CLASS(PVector, false, false, false, false)
//==========================================================================
//
// PVector - Default Constructor
//
//==========================================================================
PVector::PVector()
: PArray(TypeFloat32, 3)
{
mDescriptiveName = "Vector";
}
//==========================================================================
//
// PVector - Parameterized Constructor
//
//==========================================================================
PVector::PVector(unsigned int size)
: PArray(TypeFloat32, size)
{
mDescriptiveName.Format("Vector<%d>", size);
assert(size >= 2 && size <= 4);
}
//==========================================================================
//
// NewVector
//
// Returns a PVector with the given dimension, making sure not to create
// duplicates.
//
//==========================================================================
PVector *NewVector(unsigned int size)
{
size_t bucket;
PType *type = TypeTable.FindType(RUNTIME_CLASS(PVector), (intptr_t)TypeFloat32, size, &bucket);
if (type == NULL)
{
type = new PVector(size);
TypeTable.AddType(type, RUNTIME_CLASS(PVector), (intptr_t)TypeFloat32, size, bucket);
}
return (PVector *)type;
}
/* PDynArray **************************************************************/ /* PDynArray **************************************************************/
IMPLEMENT_CLASS(PDynArray, false, true, false, false) IMPLEMENT_CLASS(PDynArray, false, true, false, false)
@ -2003,6 +1985,28 @@ void PDynArray::GetTypeIDs(intptr_t &id1, intptr_t &id2) const
id2 = 0; id2 = 0;
} }
//==========================================================================
//
// PDynArray :: InitializeValue
//
//==========================================================================
void PDynArray::InitializeValue(void *addr, const void *def) const
{
// DynArrays are not implemented yet.
}
//==========================================================================
//
// PDynArray :: DestroyValue
//
//==========================================================================
void PDynArray::DestroyValue(void *addr) const
{
// DynArrays are not implemented yet.
}
//========================================================================== //==========================================================================
// //
// NewDynArray // NewDynArray
@ -2087,6 +2091,28 @@ void PMap::GetTypeIDs(intptr_t &id1, intptr_t &id2) const
id2 = (intptr_t)ValueType; id2 = (intptr_t)ValueType;
} }
//==========================================================================
//
// PMap :: InitializeValue
//
//==========================================================================
void PMap::InitializeValue(void *addr, const void *def) const
{
// Maps are not implemented yet.
}
//==========================================================================
//
// PMap :: DestroyValue
//
//==========================================================================
void PMap::DestroyValue(void *addr) const
{
// Maps are not implemented yet.
}
//========================================================================== //==========================================================================
// //
// NewMap // NewMap
@ -2309,6 +2335,76 @@ size_t PStruct::PropagateMark()
return Fields.Size() * sizeof(void*) + Super::PropagateMark(); return Fields.Size() * sizeof(void*) + Super::PropagateMark();
} }
//==========================================================================
//
// PStruct :: InitializeValue
// This is needed for local array variables
//
//==========================================================================
void PStruct::InitializeValue(void *addr, const void *def) const
{
char *caddr = (char*)addr;
char *cdef = (char*)def;
for (auto tao : SpecialInits)
{
tao.first->InitializeValue(caddr + tao.second, cdef + tao.second);
}
}
//==========================================================================
//
// PStruct :: DestroyValue
// This is needed for local array variables
//
//==========================================================================
void PStruct::DestroyValue(void *addr) const
{
char *caddr = (char*)addr;
for (auto tao : SpecialInits)
{
tao.first->DestroyValue(caddr + tao.second);
}
}
//==========================================================================
//
// PStruct :: InitializeSpecialInits
//
// Initialize special field list.
//
//==========================================================================
void PStruct::InitializeSpecialInits()
{
// and initialize our own special values.
auto it = Symbols.GetIterator();
PSymbolTable::MapType::Pair *pair;
while (it.NextPair(pair))
{
auto field = dyn_cast<PField>(pair->Value);
if (field != nullptr && !(field->Flags & VARF_Native))
{
field->Type->SetDefaultValue(nullptr, unsigned(field->Offset), &SpecialInits);
}
}
}
//==========================================================================
//
// PStruct :: RequireConstruction
//
//==========================================================================
bool PStruct::RequireConstruction() const
{
return SpecialInits.Size() > 0;
}
//========================================================================== //==========================================================================
// //
// NewStruct // NewStruct

View file

@ -256,6 +256,9 @@ public:
// Initialize the value, if needed (e.g. strings) // Initialize the value, if needed (e.g. strings)
virtual void InitializeValue(void *addr, const void *def) const; virtual void InitializeValue(void *addr, const void *def) const;
// This is for stack variables that may need construction/destruction at runtime
virtual bool RequireConstruction() const { return false; }
// Destroy the value, if needed (e.g. strings) // Destroy the value, if needed (e.g. strings)
virtual void DestroyValue(void *addr) const; virtual void DestroyValue(void *addr) const;
@ -489,6 +492,7 @@ public:
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special=NULL) const override; void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special=NULL) const override;
void InitializeValue(void *addr, const void *def) const override; void InitializeValue(void *addr, const void *def) const override;
void DestroyValue(void *addr) const override; void DestroyValue(void *addr) const override;
virtual bool RequireConstruction() const override { return true; }
}; };
// Variations of integer types ---------------------------------------------- // Variations of integer types ----------------------------------------------
@ -626,22 +630,14 @@ public:
bool ReadValue(FSerializer &ar, const char *key,void *addr) const override; bool ReadValue(FSerializer &ar, const char *key,void *addr) const override;
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special) const override; void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special) const override;
void InitializeValue(void *addr, const void *def) const override;
void DestroyValue(void *addr) const override;
bool RequireConstruction() const override { return ElementType->RequireConstruction(); }
protected: protected:
PArray(); PArray();
}; };
// A vector is an array with extra operations.
class PVector : public PArray
{
DECLARE_CLASS(PVector, PArray);
HAS_OBJECT_POINTERS;
public:
PVector(unsigned int size);
protected:
PVector();
};
class PDynArray : public PCompoundType class PDynArray : public PCompoundType
{ {
DECLARE_CLASS(PDynArray, PCompoundType); DECLARE_CLASS(PDynArray, PCompoundType);
@ -653,6 +649,9 @@ public:
virtual bool IsMatch(intptr_t id1, intptr_t id2) const; virtual bool IsMatch(intptr_t id1, intptr_t id2) const;
virtual void GetTypeIDs(intptr_t &id1, intptr_t &id2) const; virtual void GetTypeIDs(intptr_t &id1, intptr_t &id2) const;
void InitializeValue(void *addr, const void *def) const override;
void DestroyValue(void *addr) const override;
bool RequireConstruction() const override { return true; }
protected: protected:
PDynArray(); PDynArray();
}; };
@ -669,6 +668,9 @@ public:
virtual bool IsMatch(intptr_t id1, intptr_t id2) const; virtual bool IsMatch(intptr_t id1, intptr_t id2) const;
virtual void GetTypeIDs(intptr_t &id1, intptr_t &id2) const; virtual void GetTypeIDs(intptr_t &id1, intptr_t &id2) const;
void InitializeValue(void *addr, const void *def) const override;
void DestroyValue(void *addr) const override;
bool RequireConstruction() const override { return true; }
protected: protected:
PMap(); PMap();
}; };
@ -676,6 +678,10 @@ protected:
class PStruct : public PNamedType class PStruct : public PNamedType
{ {
DECLARE_CLASS(PStruct, PNamedType); DECLARE_CLASS(PStruct, PNamedType);
protected:
TArray<FTypeAndOffset> SpecialInits;
public: public:
PStruct(FName name, PTypeBase *outer); PStruct(FName name, PTypeBase *outer);
@ -693,6 +699,12 @@ public:
static void WriteFields(FSerializer &ar, const void *addr, const TArray<PField *> &fields); static void WriteFields(FSerializer &ar, const void *addr, const TArray<PField *> &fields);
bool ReadFields(FSerializer &ar, void *addr) const; bool ReadFields(FSerializer &ar, void *addr) const;
void InitializeValue(void *addr, const void *def) const override;
void DestroyValue(void *addr) const override;
bool RequireConstruction() const override;
void InitializeSpecialInits();
protected: protected:
PStruct(); PStruct();
}; };
@ -759,7 +771,6 @@ class PClass : public PStruct
protected: protected:
// We unravel _WITH_META here just as we did for PType. // We unravel _WITH_META here just as we did for PType.
enum { MetaClassNum = CLASSREG_PClassClass }; enum { MetaClassNum = CLASSREG_PClassClass };
TArray<FTypeAndOffset> SpecialInits;
void Derive(PClass *newclass, FName name); void Derive(PClass *newclass, FName name);
void InitializeSpecials(void *addr) const; void InitializeSpecials(void *addr) const;
void SetSuper(); void SetSuper();
@ -889,7 +900,6 @@ struct FTypeTable
extern FTypeTable TypeTable; extern FTypeTable TypeTable;
// Returns a type from the TypeTable. Will create one if it isn't present. // Returns a type from the TypeTable. Will create one if it isn't present.
PVector *NewVector(unsigned int size);
PMap *NewMap(PType *keytype, PType *valuetype); PMap *NewMap(PType *keytype, PType *valuetype);
PArray *NewArray(PType *type, unsigned int count); PArray *NewArray(PType *type, unsigned int count);
PDynArray *NewDynArray(PType *type); PDynArray *NewDynArray(PType *type);