ref: 785a9258b6f284d369b8e018e7f9dccf682a4479
dir: /dat.h/
enum DataTag { DataAux, DataSession, DataSessionList, DataModule, DataModuleList, DataSymtab, DataSymbol, DataEnumeration, DataTokenList, DataArray, DataAst, DataByteCode, DataValueStack, DataCallStack, DataFunction, DataLocalList, DataMax, }; typedef struct DataSpec DataSpec; struct DataSpec { usize size; }; extern DataSpec dataspecs[DataMax]; /* memory.c */ typedef struct Symbol Symbol; typedef struct Symtab Symtab; struct Symbol { char *name; void *value; Qid qsymbol; Symtab *table; uvlong id; }; struct Symtab { RWLock lock; uvlong count; Symbol **symbols; }; typedef struct Module Module; struct Module { uvlong id; char *name; Symtab *symtab; Qid qsession; Qid qmodule; }; typedef struct ModuleList ModuleList; struct ModuleList { RWLock lock; uvlong count; Module **modules; }; typedef struct Session Session; struct Session { uvlong id; char *name; int active; /* is the session alive? */ ModuleList *modules; /* file server stuff */ Qid qsession; Qid qctl; Qid qcons; Qid qlog; Qid qmodules; Qid qthreads; QLock loglock; Rendez logwait; uvlong logsize; char *log; Channel *input; }; typedef struct Enumeration Enumeration; struct Enumeration { uvlong count; void **items; }; enum TokenTag { TokNumber, TokName, TokLparen, TokRparen, TokLbrack, TokRbrack, TokLbrace, TokRbrace, TokNewline, TokDiamond, TokPrimitive, TokDel, TokLarrow, TokSemi, TokEnd, }; typedef struct Token Token; struct Token { int tag; int nameclass; union { vlong num; /* TokNumber */ char *name; /* TokName: UTF-8 encoded name */ int prim; /* TokPrimitive */ }; }; typedef struct TokenList TokenList; struct TokenList { uvlong count; Token *tokens; uvlong offset; jmp_buf errbuf; char *err; }; enum ArrayType { TypeNumber, TypeChar, TypeArray, }; typedef struct Array Array; #pragma incomplete Array enum AstTag { AstProg, AstFunc, AstName, AstLocals, AstAssign, AstMonadic, AstDyadic, AstConst, AstPrim, AstStrand, AstLater, /* parse at runtime */ }; typedef struct ByteCode ByteCode; typedef struct Ast Ast; struct Ast { int tag; char *name; int nameclass; int prim; Ast *funcname; Ast *funcresult; Ast *funcleftarg; Ast *funcrightarg; Ast *funclocals; Ast *func; Ast *left; Ast *right; Array *val; TokenList *tokens; /* for AstLater */ uvlong childcount; Ast **children; }; enum Nameclass { NameclassUndef, /* Unknown name */ NameclassLocal, /* Local variable, but no value yet */ NameclassArray, /* Array value */ NameclassFunc, /* Function value */ }; struct ByteCode { uvlong count; u8int *instrs; }; enum Instr { IPushConst, IPushPrim, ILookup, IStrand, IMonadic, IDyadic, ICall, IClear, IParse, IDone, IReturn, IAssign, ILocal, }; typedef struct ValueStack ValueStack; struct ValueStack { uvlong count; void **values; }; typedef struct Local Local; struct Local { uvlong id; void *value; }; typedef struct LocalList LocalList; struct LocalList { uvlong count; Local *list; }; typedef struct CallFrame CallFrame; struct CallFrame { /* Values stored when the frame is pushed */ ByteCode *code; uvlong offset; /* Old values of symbols before they were localised */ LocalList *locals; }; typedef struct CallStack CallStack; struct CallStack { uvlong count; CallFrame *frames; }; typedef struct Function Function; struct Function { Ast *ast; uvlong symbol; ByteCode *code; int prim; };