shithub: lpa

ref: 785a9258b6f284d369b8e018e7f9dccf682a4479
dir: /dat.h/

View raw version
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;
};