# include "swap.h" typedef struct { uindex oindex; /* inherited object */ uindex funcoffset; /* function call offset */ unsigned short varoffset; /* variable offset */ bool priv; /* privately inherited? */ } dinherit; typedef struct { Uint index; /* index in control block */ ssizet len; /* string length */ } dstrconst; # define DSTR_LAYOUT "it" typedef struct _dfuncdef_ { char class; /* function class */ char inherit; /* function name inherit index */ unsigned short index; /* function name index */ Uint offset; /* offset in program text */ } dfuncdef; # define DF_LAYOUT "ccsi" typedef struct { char class; /* variable class */ char inherit; /* variable name inherit index */ unsigned short index; /* variable name index */ unsigned short type; /* variable type */ } dvardef; # define DV_LAYOUT "ccss" typedef struct { char inherit; /* function object index */ char index; /* function index */ unsigned short next; /* next in hash table */ } dsymbol; # define DSYM_LAYOUT "ccs" struct _control_ { control *prev, *next; uindex ndata; /* # of data blocks using this control block */ sector nsectors; /* o # of sectors */ sector *sectors; /* o vector with sectors */ uindex oindex; /* i object */ short flags; /* various bitflags */ short ninherits; /* i/o # inherited objects */ dinherit *inherits; /* i/o inherit objects */ Uint compiled; /* time of compilation */ char *prog; /* i program text */ Uint progsize; /* i/o program text size */ Uint progoffset; /* o program text offset */ unsigned short nstrings; /* i/o # strings */ string **strings; /* i/o? string table */ dstrconst *sstrings; /* o sstrings */ char *stext; /* o sstrings text */ Uint strsize; /* o sstrings text size */ Uint stroffset; /* o offset of string index table */ unsigned short nfuncdefs; /* i/o # function definitions */ dfuncdef *funcdefs; /* i/o? function definition table */ Uint funcdoffset; /* o offset of function definition table */ unsigned short nvardefs; /* i/o # variable definitions */ dvardef *vardefs; /* i/o? variable definitions */ Uint vardoffset; /* o offset of variable definition table */ uindex nfuncalls; /* i/o # function calls */ char *funcalls; /* i/o? function calls */ Uint funccoffset; /* o offset of function call table */ unsigned short nsymbols; /* i/o # symbols */ dsymbol *symbols; /* i/o? symbol table */ Uint symboffset; /* o offset of symbol table */ unsigned short nvariables; /* i/o # variables */ unsigned short nifdefs; /* i/o # int/float definitions */ unsigned short nvinit; /* i/o # variables requiring initialization */ unsigned short vmapsize; /* i/o size of variable mapping */ unsigned short *vmap; /* variable mapping */ }; # define NEW_INT ((unsigned short) -1) # define NEW_FLOAT ((unsigned short) -2) # define NEW_POINTER ((unsigned short) -3) # define NEW_VAR(x) ((x) >= NEW_POINTER) typedef struct _strref_ { string *str; /* string value */ dataspace *data; /* dataspace this string is in */ Uint ref; /* # of refs */ } strref; typedef struct _arrref_ { array *arr; /* array value */ dataplane *plane; /* value plane this array is in */ dataspace *data; /* dataspace this array is in */ short state; /* state of mapping */ Uint ref; /* # of refs */ } arrref; struct _dataplane_ { Int level; /* dataplane level */ short flags; /* modification flags */ long schange; /* # string changes */ long achange; /* # array changes */ long imports; /* # array imports */ value *original; /* original variables */ arrref alocal; /* primary of new local arrays */ arrref *arrays; /* i/o? arrays */ abchunk *achunk; /* chunk of array backup info */ strref *strings; /* i/o? string constant table */ struct _coptable_ *coptab; /* callout patch table */ dataplane *prev; /* previous in per-dataspace linked list */ dataplane *plist; /* next in per-level linked list */ }; struct _dataspace_ { dataspace *prev, *next; dataspace *iprev; /* previous in import list */ dataspace *inext; /* next in import list */ sector *sectors; /* o vector of sectors */ sector nsectors; /* o # sectors */ short flags; /* various bitflags */ control *ctrl; /* control block */ uindex oindex; /* object this dataspace belongs to */ unsigned short nvariables; /* o # variables */ value *variables; /* i/o variables */ struct _svalue_ *svariables;/* o svariables */ Uint varoffset; /* o offset of variables in data space */ Uint narrays; /* i/o # arrays */ Uint eltsize; /* o total size of array elements */ struct _sarray_ *sarrays; /* o sarrays */ struct _svalue_ *selts; /* o sarray elements */ Uint arroffset; /* o offset of array table in data space */ Uint nstrings; /* i/o # strings */ Uint strsize; /* o total size of string text */ struct _sstring_ *sstrings; /* o sstrings */ char *stext; /* o sstrings text */ Uint stroffset; /* o offset of string table */ uindex ncallouts; /* # callouts */ uindex fcallouts; /* free callout list */ struct _dcallout_ *callouts;/* callouts */ Uint cooffset; /* offset of callout table */ dataplane base; /* basic value plane */ dataplane *plane; /* current value plane */ struct _parser_ *parser; /* parse_string data */ }; # define THISPLANE(a) ((a)->plane == (a)->data->plane) # define SAMEPLANE(d1, d2) ((d1)->plane->level == (d2)->plane->level) extern void d_init P((int)); extern control *d_new_control P((void)); extern dataspace *d_new_dataspace P((object*)); extern control *d_load_control P((object*)); extern dataspace *d_load_dataspace P((object*)); extern void d_ref_control P((control*)); extern void d_ref_dataspace P((dataspace*)); extern void d_varmap P((control*, unsigned int, unsigned short*)); extern char *d_get_prog P((control*)); extern string *d_get_strconst P((control*, int, unsigned int)); extern dfuncdef *d_get_funcdefs P((control*)); extern dvardef *d_get_vardefs P((control*)); extern char *d_get_funcalls P((control*)); extern dsymbol *d_get_symbols P((control*)); extern Uint d_get_progsize P((control*)); extern value *d_get_variable P((dataspace*, unsigned int)); extern value *d_get_elts P((array*)); extern void d_new_plane P((dataspace*, Int)); extern void d_commit_plane P((Int, value*)); extern void d_discard_plane P((Int)); extern abchunk **d_commit_arr P((array*, dataplane*, dataplane*)); extern void d_discard_arr P((array*, dataplane*)); extern void d_ref_imports P((array*)); extern void d_assign_var P((dataspace*, value*, value*)); extern value *d_get_extravar P((dataspace*)); extern void d_set_extravar P((dataspace*, value*)); extern void d_wipe_extravar P((dataspace*)); extern void d_assign_elt P((dataspace*, array*, value*, value*)); extern void d_change_map P((array*)); extern uindex d_new_call_out P((dataspace*, string*, Int, unsigned int, frame*, int)); extern Int d_del_call_out P((dataspace*, Uint)); extern string *d_get_call_out P((dataspace*, unsigned int, frame*, int*)); extern array *d_list_callouts P((dataspace*, dataspace*)); extern void d_export P((void)); extern void d_upgrade_all P((object*, object*)); extern sector d_swapout P((unsigned int)); extern void d_swapsync P((void)); extern void d_conv_control P((unsigned int)); extern void d_conv_dataspace P((object*, Uint*)); extern void d_del_control P((control*)); extern void d_del_dataspace P((dataspace*));