From 0fb9f98a96f0d5516c5982bef758a34725219e21 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Fri, 20 Sep 2013 21:10:20 -0500 Subject: [PATCH] Add void and error types; rejigger pointer types - Added TypeVoid for statements, which produce no type. - Added TypeError for expressions whose arguments are incompatible. - Pointers now derive from PBasicType instead of PInt. Since they have their own register sets in the VM, this seems to make more sense than treating them as integers. --- src/dobjtype.cpp | 19 ++++++++++++------- src/dobjtype.h | 35 ++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/dobjtype.cpp b/src/dobjtype.cpp index 252b22fd3..210d2db2b 100644 --- a/src/dobjtype.cpp +++ b/src/dobjtype.cpp @@ -61,6 +61,8 @@ FTypeTable TypeTable; TArray PClass::AllClasses; bool PClass::bShutdown; +PErrorType *TypeError; +PVoidType *TypeVoid; PInt *TypeSInt8, *TypeUInt8; PInt *TypeSInt16, *TypeUInt16; PInt *TypeSInt32, *TypeUInt32; @@ -73,7 +75,6 @@ PStatePointer *TypeState; PFixed *TypeFixed; PAngle *TypeAngle; - // PRIVATE DATA DEFINITIONS ------------------------------------------------ // A harmless non-NULL FlatPointer for classes without pointers. @@ -81,6 +82,9 @@ static const size_t TheEnd = ~(size_t)0; // CODE -------------------------------------------------------------------- +IMPLEMENT_CLASS(PErrorType) +IMPLEMENT_CLASS(PVoidType) + void DumpTypeTable() { int used = 0; @@ -300,6 +304,8 @@ void PType::GetTypeIDs(intptr_t &id1, intptr_t &id2) const void PType::StaticInit() { + RUNTIME_CLASS(PErrorType)->TypeTableType = RUNTIME_CLASS(PErrorType); + RUNTIME_CLASS(PVoidType)->TypeTableType = RUNTIME_CLASS(PVoidType); RUNTIME_CLASS(PInt)->TypeTableType = RUNTIME_CLASS(PInt); RUNTIME_CLASS(PFloat)->TypeTableType = RUNTIME_CLASS(PFloat); RUNTIME_CLASS(PString)->TypeTableType = RUNTIME_CLASS(PString); @@ -320,6 +326,8 @@ void PType::StaticInit() RUNTIME_CLASS(PFixed)->TypeTableType = RUNTIME_CLASS(PFixed); RUNTIME_CLASS(PAngle)->TypeTableType = RUNTIME_CLASS(PAngle); + TypeTable.AddType(TypeError = new PErrorType); + TypeTable.AddType(TypeVoid = new PVoidType); TypeTable.AddType(TypeSInt8 = new PInt(1, false)); TypeTable.AddType(TypeUInt8 = new PInt(1, true)); TypeTable.AddType(TypeSInt16 = new PInt(2, false)); @@ -877,9 +885,8 @@ IMPLEMENT_CLASS(PStatePointer) //========================================================================== PStatePointer::PStatePointer() -: PInt(sizeof(FState *), true) +: PBasicType(sizeof(FState *), __alignof(FState *)) { - Align = __alignof(FState *); } @@ -896,9 +903,8 @@ END_POINTERS //========================================================================== PPointer::PPointer() -: PInt(sizeof(void *), true), PointedType(NULL) +: PBasicType(sizeof(void *), __alignof(void *)), PointedType(NULL) { - Align = __alignof(void *); } //========================================================================== @@ -908,9 +914,8 @@ PPointer::PPointer() //========================================================================== PPointer::PPointer(PType *pointsat) -: PInt(sizeof(void *), true), PointedType(pointsat) +: PBasicType(sizeof(void *), __alignof(void *)), PointedType(pointsat) { - Align = __alignof(void *); } //========================================================================== diff --git a/src/dobjtype.h b/src/dobjtype.h index bfc3b966e..1e9cebf02 100644 --- a/src/dobjtype.h +++ b/src/dobjtype.h @@ -165,6 +165,22 @@ public: static void StaticInit(); }; +// Not-really-a-type types -------------------------------------------------- + +class PErrorType : public PType +{ + DECLARE_CLASS(PErrorType, PType); +public: + PErrorType() : PType(0, 1) {} +}; + +class PVoidType : public PType +{ + DECLARE_CLASS(PVoidType, PType); +public: + PVoidType() : PType(0, 1) {} +}; + // Some categorization typing ----------------------------------------------- class PBasicType : public PType @@ -290,16 +306,16 @@ public: // Pointers ----------------------------------------------------------------- -class PStatePointer : public PInt +class PStatePointer : public PBasicType { - DECLARE_CLASS(PStatePointer, PInt); + DECLARE_CLASS(PStatePointer, PBasicType); public: PStatePointer(); }; -class PPointer : public PInt +class PPointer : public PBasicType { - DECLARE_CLASS(PPointer, PInt); + DECLARE_CLASS(PPointer, PBasicType); HAS_OBJECT_POINTERS; public: PPointer(PType *pointsat); @@ -316,17 +332,14 @@ protected: PPointer(); }; -class PClass; class PClassPointer : public PPointer { DECLARE_CLASS(PClassPointer, PPointer); HAS_OBJECT_POINTERS; public: - PClassPointer(PClass *restrict); + PClassPointer(class PClass *restrict); - PClass *ClassRestriction; - - typedef PClass *Type2; + class PClass *ClassRestriction; virtual bool IsMatch(intptr_t id1, intptr_t id2) const; virtual void GetTypeIDs(intptr_t &id1, intptr_t &id2) const; @@ -625,6 +638,8 @@ PPrototype *NewPrototype(const TArray &rettypes, const TArray // Built-in types ----------------------------------------------------------- +extern PErrorType *TypeError; +extern PVoidType *TypeVoid; extern PInt *TypeSInt8, *TypeUInt8; extern PInt *TypeSInt16, *TypeUInt16; extern PInt *TypeSInt32, *TypeUInt32; @@ -662,6 +677,8 @@ public: }; PSymbolConstNumeric(FName name, PType *type=NULL) : PSymbolConst(name, type) {} + PSymbolConstNumeric(FName name, PType *type, int val) : PSymbolConst(name, type), Value(val) {} + PSymbolConstNumeric(FName name, PType *type, double val) : PSymbolConst(name, type), Float(val) {} PSymbolConstNumeric() {} };