📄 array.c
字号:
/* array.c: Handle allocation and manipulation of arrays */#include "vt.h"#ifdef PROTOTYPESstatic Array *aralloc(void);static void mark_cframes(int, Cframe *);static void mark_estates(Estate *);static void mark_dframes(int, Dframe *);static void mark_dframe(Dframe *);#elsestatic Array *aralloc();static void mark_cframes(), mark_estates(), mark_dframes();static void mark_dframe();#endif#define INIT_INDEX_SIZE 128#define BLOCK_SIZE 64static Array **index, firstblock[BLOCK_SIZE], *unused;static int index_size, ipos = 1, bpos = 0, collecting = 0;#define PTSIZE 101typedef struct aentry Aentry;typedef struct asubelem Asubelem;struct aentry { char *name; Asubelem *sub; Aentry *left, *right; };struct asubelem { int *assoc; int num; Asubelem *next; };static Aentry *atbl[PTSIZE];extern Array *gvars;extern Dframe *dstack;extern Cframe *cstack;extern int dpos, cpos;extern Unode rmt_ring, win_ring;extern Estate *events, *gen_read, *gen_high, *gen_low;void init_array(){ index = Newarray(Array *, index_size = INIT_INDEX_SIZE); index[0] = firstblock;}static Array *aralloc(){ Array *temp; if (unused) { temp = unused; temp->used = 1; unused = unused->r.next; return temp; } if (bpos == BLOCK_SIZE) { if (ipos == index_size) Double(index, Array *, index_size); index[ipos++] = Newarray(Array, BLOCK_SIZE); bpos = 0; } index[ipos - 1][bpos].used = 1; return &index[ipos - 1][bpos++];}void arfree(ar) Array *ar;{ ar->used = 0; ar->r.next = unused; unused = ar;}Dframe *dfalloc(num) int num;{ Dframe *vals, *vp; vals = Newarray(Dframe, num); for (vp = vals; num--; vp++) vp->type = F_NULL; return vals;}Array *add_array(size, vals, intern, fixed, isp) int size, intern, fixed, isp; Dframe *vals;{ Array *new; new = aralloc(); new->alloc = size; new->vals = vals; new->intern = intern; new->fixed = fixed; new->isp = isp; return new;}void del_array(array) Array *array;{ deref_frames(array->alloc, array->vals); Discardarray(array->vals, Dframe, array->alloc); arfree(array);}void extend_array(ar, size) Array *ar; int size;{ Dframe *new; if (size <= ar->alloc) return; size *= 2; new = Newarray(Dframe, size); Copy(ar->vals, new, ar->alloc, Dframe); move_frames_refs(ar->alloc, ar->vals, new); Discardarray(ar->vals, Dframe, ar->alloc); ar->vals = new; for (new += ar->alloc; ar->alloc < size; ar->alloc++) new++->type = F_NULL;}void dec_ref_array(ar) Array *ar;{ if (!--ar->r.refs && !collecting) del_array(ar);}void dec_ref_plist(plist) Plist *plist;{ if (!--plist->refs && !collecting) { del_array(plist->array); Discard(plist, Plist); }}int lookup(assoc, str) int *assoc; char *str;{ Aentry **a; Asubelem **s; int val; a = &atbl[hash(str, PTSIZE)]; while (*a) { val = strcmp(str, (*a)->name); if (!val) break; a = (val > 0) ? &(*a)->right : &(*a)->left; } if (!*a) { *a = New(Aentry); (*a)->name = vtstrdup(str); (*a)->left = (*a)->right = NULL; (*a)->sub = NULL; } for (s = &(*a)->sub; *s && (*s)->assoc != assoc; s = &(*s)->next); if (!*s) { *s = New(Asubelem); (*s)->assoc = assoc; (*s)->next = NULL; (*s)->num = (*assoc)++; } return (*s)->num;}int garbage(){ int i, j, counter = 0, n; Unode *un; Array *ar; for (i = 0; i < ipos; i++) { n = (i == ipos - 1) ? bpos : BLOCK_SIZE; for (j = 0; j < n; j++) index[i][j].garbage = 0; } mark_dframes(gvars->alloc, gvars->vals); mark_dframes(dpos, dstack); mark_cframes(cpos, cstack); for (un = rmt_ring.next; !un->dummy; un = un->next) { if (un->Robj) mark_dframe(un->Robj); mark_estates(un->Rrstack); } for (un = win_ring.next; !un->dummy; un = un->next) { if (un->Wobj) mark_dframe(un->Wobj); mark_estates(un->Wghstack); mark_estates(un->Wglstack); mark_estates(un->Wrstack); } mark_estates(events); mark_estates(gen_read); mark_estates(gen_high); mark_estates(gen_low); collecting = 1; for (i = 0; i < ipos; i++) { n = (i == ipos - 1) ? bpos : BLOCK_SIZE; for (j = 0; j < n; j++) { ar = &index[i][j]; if (ar->used && !ar->intern && !ar->garbage) { if (ar->isp) Discard(ar->r.plist, Plist); del_array(ar); counter++; } } } collecting = 0; return counter;}static void mark_cframes(num, frames) int num; Cframe *frames;{ for (; num--; frames++) mark_dframes(frames->lvars->alloc, frames->lvars->vals);}static void mark_estates(es) Estate *es;{ for (; es; es = es->next) { mark_dframes(es->dframes, es->dimage); mark_cframes(es->cframes, es->cimage); }}static void mark_dframes(num, frames) int num; Dframe *frames;{ while (num--) mark_dframe(frames++);}static void mark_dframe(f) Dframe *f;{ Array *a = NULL; if (f->type == F_APTR && !f->Darray->intern) a = f->Darray; else if (f->type == F_PLIST) a = f->Dplist->array; if (a && !a->garbage) { a->garbage = 1; mark_dframes(a->alloc, a->vals); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -