Exemplo n.º 1
0
void
compile(Node *n)	/* called from parser only */
{
	extern long autooffset;
	Errjmp x;
	n=constants(n);
	if(cflag){
		fprint(2, "%z:constants:\n");
		dump(n, 0);
	}
	errsave(x);
	if(errmark()){
		autooffset=0;
		resultloc=0;
		breakloc=-1;
		continueloc=-1;
		didbecome=0;
		freenode(n);
		errrest(x);
		errjmp();
	}
	istart();
	gen(n, 0);
	freenode(n);
	errrest(x);
}
Exemplo n.º 2
0
void
execute(void)
{
	extern int xflag;
	Errjmp s;
	interpreter.fp=0;
	interpreter.sp=interpreter.stack;
	interpreter.pc=prog+1;
	phead=&interpreter;
	ptail=&interpreter;
	interpreter.next=0;
	errsave(s);
	if(errmark()){
		istart();
		errrest(s);
		libgflush();
		errjmp();
	}
    loop:
	if(xflag)
		xxec();
	else
		xec();
	phead=0;
	while(moreio()){
		schedio(1);
		if(phead)
			goto loop;
	}

	if(interpreter.pc[-1]!=idone)
		error("interpreter process blocked");
	errrest(s);
	istart();
	libgflush();
}
Exemplo n.º 3
0
void
proggen(Node *t, Node *n)
{
	int or;
	Node *of;
	Errjmp s;
	Store *p;
	long len, loc;
	long nauto, oao;
	int osp, odb;
	extern int (**prog)(Proc*);
	extern int storeprog;
	odb=didbecome;
	oao=autooffset;
	or=returnloc;
	of=formals;
	osp=storeprog;
	autooffset=0;
	returnloc=0;
	formals=t->l;
	errsave(s);
	if(errmark()){
		didbecome=odb;
		returnloc=or;
		formals=of;
		autooffset=oao;
		storeprog=osp;
		errrest(s);
		errjmp();
	}
	loc=here();
	emitconst(0);	/* space for locals pointer */
	pushscope();
	dclformals(t->l);
	autooffset=0;
	emit(Ipushfp);
	nauto=here();
	storeprog=here();
	emitconst(0L);
	gen(n, 0);
	trlrgen();
	patch((int)nauto, autooffset);
	popscope();
	errrest(s);
	if(!didbecome && n && t->r->o.t!=TUnit)
		lerror(n, "prog has no become");
	didbecome=odb;
	autooffset=oao;
	returnloc=or;
	formals=of;
	storeprog=osp;
	len=here()-loc+1;
	p=emalloc(SHSZ+len*WS);
	memcpy(p->data, prog+loc, len*WS);
	p->ref=1;
	p->len=len;
	p->type=Sprog;
	setprog(loc);
	emit(Ipushdata);
	emitconst((long)p);
	emitstore(p);
}
Exemplo n.º 4
0
int
main(int argc, char *argv[])
{
	int i;
	char *s;
	while(argc>1 && argv[1][0]=='-'){
		s=argv[1]+1;
		while(*s)
			switch(*s++){
			case 'b':	/* suppress become flattening */
				bflag=1;
				break;
			case 'c':	/* print constants */
				cflag=1;
				break;
			case 'C':	/* suppress constant compilation */
				Cflag=1;
				break;
			case 'e':	/* dump core on errors */
				eflag=1;
				break;
			case 'i':	/* print compiled instructions */
				iflag=1;
				break;
			case 'm':	/* trace message passing */
				mflag=1;
				break;
			case 'P':	/* set number of procs */
				if(*s==0){
					--argc, argv++;
					s=argv[1];
					if(s==0)
						goto Usage;
				}
				Nproc=atol(s);
				if(Nproc<=0)
					goto Usage;
				goto Out;
			case 'p':	/* trace process creation */
				pflag++;
				break;
			case 't':	/* dump parse trees */
				tflag=1;
				break;
			case 'x':	/* trace execution */
				xflag=1;
				break;
			default:
			Usage:
				fprint(2, "usage: squint [-ixpb -PNPROC] <files>\n");
				return 1;
			}
		Out:
		--argc; argv++;
	}
	interactive=argc==1;
	procinit();
	fmtinstall('b', bconv);
	fmtinstall('e', econv);
	fmtinstall('m', mconv);
	fmtinstall('n', nconv);
	fmtinstall('t', tconv);
	fmtinstall('i', iconv);
	fmtinstall('A', Aconv);
	fmtinstall('C', Cconv);
	fmtinstall('U', Uconv);
	fmtinstall('z', zconv);
	fmtinstall('Z', zconv);
	lexinit();
	typeinit();
	initializing=1;
	if(errmark()){
		fprint(2, "squint: error during initialization; exiting\n");
		exits("initialization error");
	}
	if(argc==1)
		newfile("<stdin>", 1);
	for(i=argc-1; i>0; --i)
		newfile(argv[i], 0);
	initializing=0;
	errmark();
/*	Fflush(1); */
	do; while(yyparse());
	return 0;
}