mirror of https://git.wuffs.org/MWCC
238 lines
4.9 KiB
C
238 lines
4.9 KiB
C
|
#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
|