summaryrefslogtreecommitdiff
path: root/includes/compiler/templates.h
diff options
context:
space:
mode:
Diffstat (limited to 'includes/compiler/templates.h')
-rw-r--r--includes/compiler/templates.h237
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