| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #ifndef TYPE_H
- #define TYPE_H
- #include "scope.h"
- #include "declseq.h"
- struct Val;
- /*
- Runtime type Encoding:
- b=byte
- s=short
- i=int
- f=float
- d=double
- z=cstring
- $=string
- []<type>=array
- ^<ident>.<ident>=class
- :<ident>.<ident>=object
- (<type>,...)<type>=function
- *<type>=pointer
- */
- struct NumericType;
- struct IntType;
- struct FloatType;
- struct StringType;
- struct CStringType;
- struct WStringType;
- struct ArrayType;
- struct ClassType;
- struct ObjectType;
- struct FunType;
- struct PtrType;
- struct VarType;
- struct RefType;
- struct NullType;
- struct ModuleType;
- struct Type : public Scope{
- virtual ~Type();
-
- virtual NumericType*numericType();
- virtual IntType* intType();
- virtual FloatType* floatType();
- virtual StringType* stringType();
- virtual CStringType*cstringType();
- virtual WStringType*wstringType();
- virtual ClassType* classType();
- virtual ObjectType* objectType();
- virtual ObjectType* exObjectType();
- virtual ArrayType* arrayType();
- virtual FunType* funType();
- virtual PtrType* ptrType();
- virtual VarType* varType();
- virtual RefType* refType();
- virtual NullType* nullType();
- virtual ModuleType* moduleType();
-
- virtual string encoding();
- virtual string toString();
- virtual bool equals( Type *ty );
- virtual bool extends( Type *ty );
- int size();
- int cgType();
- PtrType* ptrType( string valEncoding );
- static void createTypes();
- static void resolveTypes();
- static IntType *int8,*int16,*int32,*int64;
- static FloatType *float32,*float64;
- static CStringType *c_string;
- static WStringType *w_string;
- static PtrType *bytePtr;
- static NullType *null;
- static ModuleType *blitzModule;
- static ObjectType *objectObject;
- static StringType *stringObject;
- static Val *objectClass,*stringClass,*arrayClass;
- };
- struct NumericType : public Type{
- string _encoding;
- NumericType( int sz,bool fp );
- NumericType *numericType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- };
- struct IntType : public NumericType{
- IntType( int sz ):NumericType( sz,false ){}
- IntType *intType();
- };
- struct FloatType : public NumericType{
- FloatType( int sz ):NumericType( sz,true ){}
- FloatType *floatType();
- };
- struct CStringType : public Type{
- CStringType *cstringType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- };
- struct WStringType : public Type{
- WStringType *wstringType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- };
- struct ClassType : public Type{
- enum{
- ABSTRACT=1,FINAL=2,EXTERN=4,PRIVATE=8
- };
-
- string super_name;
- Scope* scope;
- DeclSeq decls,fields,methods;
- int attrs,sizeof_fields,sizeof_vtable;
-
- ClassType( string supername,Scope *sc,int attrs=0 );
- ClassType*classType();
-
- string encoding();
- string toString();
- bool equals( Type *ty );
- bool extends( Type *ty );
- Val* find( string id );
- Val* findMethod( string id );
- Val* findSuperMethod( string id );
-
- void resolve();
-
- Val* superVal();
-
- ClassType*superClass();
-
- private:
- int resolved;
- Val* super_val;
- ClassType*super_class;
- string sourceinfo;
- };
- struct ObjectType : public Type{
- string ident;
- Scope *scope;
- Val *class_val;
- string sourceinfo;
- ObjectType( Val *clas );
- ObjectType( string id,Scope *sc );
- ObjectType *objectType();
- ObjectType *exObjectType();
- void resolve();
- string encoding();
- string toString();
- bool equals( Type *ty );
- bool extends( Type *ty );
- Val* find( string id );
- Val* classVal();
- ClassType *objectClass();
- };
- struct StringType : public ObjectType{
- StringType( Val *clas );
-
- StringType *stringType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- };
- struct ArrayType : public ObjectType{
- Type *element_type;
- int dims;
- ArrayType( Type *ty,int n );
- ArrayType *arrayType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- bool extends( Type *ty );
- };
- struct FunType : public Type{
- enum{
- ABSTRACT=1,FINAL=2,METHOD=4,VOIDFUN=8
- };
- DeclSeq args;
- Type *return_type;
- int attrs,call_conv;
- FunType( Type *ty,int at=0 );
-
- FunType *funType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- bool extends( Type *ty );
- bool method();
- };
- struct PtrType : public Type{
- Type *val_type;
- string sourceinfo;
- PtrType( Type *ty );
- PtrType *ptrType();
- void resolve();
- string encoding();
- string toString();
- bool equals( Type *ty );
- };
- struct VarType : public Type{
- Type *val_type;
- VarType( Type *ty ):val_type(ty){}
- VarType *varType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- };
- struct AliasType : public Type{
- Type *val_type;
- AliasType( Type *ty );
- NumericType*numericType();
- IntType* intType();
- FloatType* floatType();
- StringType* stringType();
- ClassType* classType();
- ObjectType* objectType();
- ObjectType* exObjectType();
- ArrayType* arrayType();
- FunType* funType();
- PtrType* ptrType();
- ModuleType* moduleType();
- string encoding();
- string toString();
- bool equals( Type *ty );
- bool extends( Type *ty );
- Val* find( string id );
- };
- struct RefType : public AliasType{
- enum{
- VARPARAM=1
- };
- int attrs;
- RefType( Type *ty,int at=0 ):AliasType(ty),attrs(at){}
- RefType* refType();
- };
- struct NullType : public Type{
- NullType *nullType();
- string toString();
- bool equals( Type *ty );
- };
- struct ModuleType : public Type{
- DeclSeq decls;
-
- ModuleType* moduleType();
- string toString();
- bool equals( Type *ty );
- Val* find( string id );
- };
- #endif
|