# include "swap.h"
typedef struct _svalue_ svalue;
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 */
unsigned short nclassvars; /* i/o # class variable definitions */
dvardef *vardefs; /* i/o? variable definitions */
string **cvstrings; /* variable class strings */
char *classvars; /* variable classes */
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 _value_ {
char type; /* value type */
bool modified; /* dirty bit */
uindex oindex; /* index in object table */
union {
Int number; /* number */
Uint objcnt; /* object creation count */
string *string; /* string */
array *array; /* array or mapping */
value *lval; /* lvalue: variable */
} u;
};
typedef struct {
Uint time; /* time of call */
uindex nargs; /* number of arguments */
value val[4]; /* function name, 3 direct arguments */
} dcallout;
# define co_prev time
# define co_next nargs
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; /* swap list */
dataspace *gcprev, *gcnext; /* garbage collection list */
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 */
array alist; /* array linked list sentinel */
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 */
dcallout *callouts; /* callouts */
struct _scallout_ *scallouts; /* o scallouts */
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)
/* sdata.c */
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 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 void d_new_variables P((control*, value*));
extern value *d_get_variable P((dataspace*, unsigned int));
extern value *d_get_elts P((array*));
extern void d_get_callouts P((dataspace*));
extern sector d_swapout P((unsigned int));
extern void d_swapsync P((void));
extern void d_upgrade_mem P((object*, object*));
extern void d_conv_control P((unsigned int, int));
extern void d_conv_dataspace P((object*, Uint*, int));
extern void d_free_control P((control*));
extern void d_free_dataspace P((dataspace*));
/* data.c */
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_set_varmap P((control*, unsigned int,
unsigned short*));
extern void d_upgrade_data P((dataspace*, unsigned int,
unsigned short*, object*));
extern void d_upgrade_clone P((dataspace*));
extern object *d_upgrade_lwobj P((array*, object*));
extern void d_export P((void));
extern void d_del_control P((control*));
extern void d_del_dataspace P((dataspace*));
/* bit values for ctrl->flags */
# define CTRL_PROGCMP 0x03 /* program compressed */
# define CTRL_STRCMP 0x0c /* strings compressed */
# define CTRL_UNDEFINED 0x10 /* has undefined functions */
# define CTRL_COMPILED 0x20 /* precompiled control block */
# define CTRL_VARMAP 0x40 /* varmap updated */
/* bit values for dataspace->flags */
# define DATA_STRCMP 0x03 /* strings compressed */
/* bit values for dataspace->plane->flags */
# define MOD_ALL 0x3f
# define MOD_VARIABLE 0x01 /* variable changed */
# define MOD_ARRAY 0x02 /* array element changed */
# define MOD_ARRAYREF 0x04 /* array reference changed */
# define MOD_STRINGREF 0x08 /* string reference changed */
# define MOD_CALLOUT 0x10 /* callout changed */
# define MOD_NEWCALLOUT 0x20 /* new callout added */
# define PLANE_MERGE 0x40 /* merge planes on commit */
/* data compression */
# define CMP_TYPE 0x03
# define CMP_NONE 0x00 /* no compression */
# define CMP_PRED 0x01 /* predictor compression */
# define ARR_MOD 0x80000000L /* in arrref->ref */
# define AR_UNCHANGED 0 /* mapping unchanged */
# define AR_CHANGED 1 /* mapping changed */