117 lines · 1.6 KB · C
RawDownload
#include "java.h" /* * 'desc' assembly directives. */ typedef struct	Desc	Desc; struct Desc{	int	id;	/* Dis type identifier */	int	ln;	/* length, in bytes, of mapped object */	uchar	*map;	/* bit map of pointers */	int	nmap;	/* number of bytes in map */	Desc	*next;}; static	Desc	*dlist = nil;static	Desc	*dtail = nil;static	int	id = 0; /* reserve id == 0 for Module Data type descriptor */ /* * Allocate a Desc structure. */ static Desc*newDesc(int id, int ln, int nmap, uchar *map){	Desc *d; 	d = Malloc(sizeof(Desc));	d->id = id;	d->ln = ln;	d->nmap = nmap;	d->map = map;	d->next = nil;	return d;} /* * Save a type descriptor; reuse existing descriptor if identical. */ intdescid(int ln, int nmap, uchar *map){	Desc *d; 	for(d = dlist; d; d = d->next) {		if(d->ln == ln && d->nmap == nmap		&& (memcmp(d->map, map, nmap) == 0)) {			return d->id;		}	} 	id += 1;	d = newDesc(id, ln, nmap, map);	if(dlist == nil)		dlist = d;	else		dtail->next = d;	dtail = d; 	return d->id;} /* * Save type descriptor for module data. */ voidmpdescid(int ln, int nmap, uchar *map){	Desc *d; 	d = newDesc(0, ln, nmap, map);	d->next = dlist;	dlist = d;} /* * Emit assembly 'desc' directives. */ voidasmdesc(void){	Desc *d;	uchar *m, *e; 	for(d = dlist; d; d = d->next) {		Bprint(bout, "\tdesc\t$%d,%d,\"", d->id, d->ln);		e = d->map + d->nmap;		for(m = d->map; m < e; m++)			Bprint(bout, "%.2x", *m);		Bprint(bout, "\"\n");	}} voiddisndesc(void){	discon(id+1);} voiddisdesc(void){	Desc *d; 	for(d = dlist; d; d = d->next) {		discon(d->id);		discon(d->ln);		discon(d->nmap);		Bwrite(bout, d->map, d->nmap);	}}