diff options
Diffstat (limited to 'includes/compiler/templates.h')
-rw-r--r-- | includes/compiler/templates.h | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/includes/compiler/templates.h b/includes/compiler/templates.h new file mode 100644 index 0000000..f188e0d --- /dev/null +++ b/includes/compiler/templates.h @@ -0,0 +1,237 @@ +#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; +}; + +struct TemplClassInst { + TypeClass theclass; + TemplClassInst *next; + Type *x36; // not sure what this represents + TemplClass *templ; + TemplArg *inst_args; + TemplArg *oargs; + void *x46; +}; + +#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 |