MWCC/includes/compiler/templates.h

243 lines
5.0 KiB
C
Raw Normal View History

2022-10-25 19:30:28 +00:00
#ifndef COMPILER_TEMPLATES_H
#define COMPILER_TEMPLATES_H
#include "compiler/common.h"
#include "compiler/types.h"
#include "compiler/tokens.h"
#ifdef __MWERKS__
#pragma options align=mac68k
#endif
typedef struct PackedDeclInfo { // ok
Type *thetype;
UInt32 qual;
NameSpace *nspace;
HashNameNode *name;
TemplArg *expltargs;
SInt16 storageclass;
Section section;
UInt8 exportflags;
Boolean has_expltargs;
} PackedDeclInfo;
struct Template {
Template *parent;
TemplInstance *parentinst;
TemplParam *params;
Boolean is_class;
};
struct TemplateFriend { // verified via CPrec
PackedDeclInfo decl;
FileOffsetInfo fileoffset;
TStream stream;
};
struct TemplateMember { // verified via CPrec
struct TemplateMember *next;
TemplParam *params;
Object *object;
FileOffsetInfo fileoffset;
TStream stream;
CPrepFileInfo *srcfile;
SInt32 startoffset;
SInt32 endoffset;
};
struct TemplInstance {
// Template *templ;
TemplInstance *parent;
TemplArg *args;
Boolean is_instantiated;
Boolean is_specialized;
Boolean is_extern;
Boolean static_instantiated;
};
/*
struct __attribute__((packed)) TemplInstance
{
Template *templ;
TemplInstance *parent;
TemplArg *args;
unsigned __int8 is_instantiated;
unsigned __int8 is_specialized;
unsigned __int8 is_extern;
unsigned __int8 static_instantiated;
};
*/
struct TemplParam { // verified via CPrec
TemplParam *next;
HashNameNode *name;
TemplParamID pid;
union {
struct {
Type *type;
UInt32 qual;
} typeparam;
struct {
Type *type;
UInt32 qual;
ENode *defaultarg;
} paramdecl;
struct {
TemplParam *plist;
Type *defaultarg;
} templparam;
} data;
};
struct TemplArg { // verified by CPrec
TemplArg *next;
TemplParamID pid;
union {
struct {
Type *type;
UInt32 qual;
} typeparam;
struct {
ENode *expr;
Boolean is_ref;
} paramdecl;
Type *ttargtype;
} data;
Boolean is_deduced;
};
struct TemplPartialSpec { // confirmed via CPrec (but templ might be a different type?)
TemplPartialSpec *next;
TemplClass *templ;
TemplArg *args;
};
struct TemplStack {
TemplStack *next;
union {
Object *func;
TypeClass *theclass;
} u;
Boolean is_func;
Boolean is_poi;
};
/***********/
/* Classes */
/***********/
struct TemplClass {
TypeClass theclass;
TemplClass *next;
TemplClass *templ__parent;
Type *x3A_maybe_parentinst;
TemplParam *templ__params;
TemplateMember *members;
TemplClassInst *instances;
TemplClass *pspec_owner;
TemplPartialSpec *pspecs;
TemplateAction *actions;
// not confirmed these last 3 fields yet but there is space for them
UInt16 lex_order_count;
SInt8 align;
UInt8 flags;
};
2022-11-07 03:06:21 +00:00
enum {
TEMPLCLASS_FLAGS_2 = 2
};
2022-10-25 19:30:28 +00:00
struct TemplClassInst {
TypeClass theclass;
TemplClassInst *next;
Type *x36; // not sure what this represents
TemplClass *templ;
TemplArg *inst_args;
TemplArg *oargs;
2022-11-07 03:06:21 +00:00
Boolean x46;
Boolean x47;
2022-10-25 19:30:28 +00:00
};
#define TEMPL_CLASS(ty) ( (TemplClass *) (ty) )
#define TEMPL_CLASS_INST(ty) ( (TemplClassInst *) (ty) )
/*************/
/* Functions */
/*************/
struct TemplateFunction { // verified via CPrec
TemplateFunction *next;
TemplateFunction *unk4; // parent?
HashNameNode *name;
TemplParam *params;
TStream stream;
TStreamElement deftoken;
Object *tfunc;
TemplFuncInstance *instances;
CPrepFileInfo *srcfile;
SInt32 startoffset;
SInt32 endoffset;
};
struct TemplFuncInstance { // verified via CPrec
TemplFuncInstance *next;
Object *object;
TemplArg *args;
Boolean is_instantiated;
Boolean is_specialized;
Boolean is_extern;
Boolean static_instantiated;
};
/***********/
/* Actions */
/***********/
typedef enum TemplateActionType {
TAT_NESTEDCLASS,
TAT_ENUMTYPE,
TAT_FRIEND,
TAT_ENUMERATOR, // in pro7 but not pro8
TAT_BASE,
TAT_OBJECTINIT,
TAT_USINGDECL,
TAT_OBJECTDEF,
TAT_ILLEGAL
} TemplateActionType;
struct TemplateAction { // verified via CPrec
TemplateAction *next;
TStreamElement source_ref;
union {
TemplClass *tclasstype;
TypeEnum *enumtype;
TemplateFriend *tfriend;
struct {
ObjEnumConst *objenumconst;
ENode *initexpr;
} enumerator;
struct {
Type *type;
ClassList *insert_after;
AccessType access;
Boolean is_virtual;
} base;
struct {
Object *object;
ENode *initexpr;
} objectinit;
struct {
TypeTemplDep *type;
AccessType access;
} usingdecl;
ObjBase *refobj;
} u;
TemplateActionType type;
};
#ifdef __MWERKS__
#pragma options align=reset
#endif
#endif