=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/eval.c,v retrieving revision 1.18 retrieving revision 1.24 diff -u -p -r1.18 -r1.24 --- OpenXM_contrib2/asir2000/parse/eval.c 2001/12/25 02:39:06 1.18 +++ OpenXM_contrib2/asir2000/parse/eval.c 2003/05/16 07:56:16 1.24 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.17 2001/12/21 08:23:15 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.23 2003/05/14 09:18:38 noro Exp $ */ #include #include "ca.h" @@ -54,7 +54,7 @@ #include "parse.h" #include #include -#if PARI +#if defined(PARI) #include "genpari.h" #endif @@ -63,6 +63,7 @@ extern JMP_BUF timer_env; int f_break,f_return,f_continue; int evalstatline; int recv_intr; +int show_crossref; pointer eval(FNODE f) { @@ -73,7 +74,8 @@ pointer eval(FNODE f) NODE tn,ind; R u; DP dp; - int pv,c; + unsigned int pv; + int c; FNODE f1; UP2 up2; UP up; @@ -195,7 +197,7 @@ pointer eval(FNODE f) case I_PRESELF: f1 = (FNODE)FA1(f); if ( ID(f1) == I_PVAR ) { - pv = (int)FA0(f1); ind = (NODE)FA1(f1); GETPV(pv,a); + pv = (unsigned int)FA0(f1); ind = (NODE)FA1(f1); GETPV(pv,a); if ( !ind ) { (*((ARF)FA0(f))->fp)(CO,a,ONE,&val); ASSPV(pv,val); } else if ( a ) { @@ -208,7 +210,7 @@ pointer eval(FNODE f) case I_POSTSELF: f1 = (FNODE)FA1(f); if ( ID(f1) == I_PVAR ) { - pv = (int)FA0(f1); ind = (NODE)FA1(f1); GETPV(pv,val); + pv = (unsigned int)FA0(f1); ind = (NODE)FA1(f1); GETPV(pv,val); if ( !ind ) { (*((ARF)FA0(f))->fp)(CO,val,ONE,&u); ASSPV(pv,u); } else if ( val ) { @@ -220,7 +222,7 @@ pointer eval(FNODE f) error("-- : not implemented yet"); break; case I_PVAR: - pv = (int)FA0(f); ind = (NODE)FA1(f); GETPV(pv,a); + pv = (unsigned int)FA0(f); ind = (NODE)FA1(f); GETPV(pv,a); if ( !ind ) val = a; else { @@ -230,7 +232,7 @@ pointer eval(FNODE f) case I_ASSPVAR: f1 = (FNODE)FA0(f); if ( ID(f1) == I_PVAR ) { - pv = (int)FA0(f1); ind = (NODE)FA1(f1); + pv = (unsigned int)FA0(f1); ind = (NODE)FA1(f1); if ( !ind ) { val = eval((FNODE)FA1(f)); ASSPV(pv,val); } else { @@ -350,13 +352,13 @@ pointer evalstat(SNODE f) case S_BP: if ( !nextbp && (!FA1(f) || eval((FNODE)FA1(f))) ) { if ( (FNODE)FA2(f) ) { -#if PARI +#if defined(PARI) pari_outfile = stderr; #endif asir_out = stderr; printexpr(CO,eval((FNODE)FA2(f))); putc('\n',asir_out); fflush(asir_out); -#if PARI +#if defined(PARI) pari_outfile = stdout; #endif asir_out = stdout; @@ -454,9 +456,9 @@ pointer evalf(FUNC f,FNODE a,FNODE opt) pointer val; int i,n,level; NODE tn,sn,opts,opt1; - VS pvs; + VS pvs,prev_mpvs; char errbuf[BUFSIZ]; - static int stack_size; + static unsigned int stack_size; static void *stack_base; if ( f->id == A_UNDEF ) { @@ -537,7 +539,13 @@ pointer evalf(FUNC f,FNODE a,FNODE opt) for ( tn = f->f.usrf->args, sn = BDY(args); sn; tn = NEXT(tn), sn = NEXT(sn) ) ASSPV((int)FA0((FNODE)BDY(tn)),BDY(sn)); - val = evalstat((SNODE)BDY(f->f.usrf)); + if ( f->f.usrf->module ) { + prev_mpvs = MPVS; + MPVS = f->f.usrf->module->pvs; + val = evalstat((SNODE)BDY(f->f.usrf)); + MPVS = prev_mpvs; + } else + val = evalstat((SNODE)BDY(f->f.usrf)); f_return = f_break = f_continue = 0; poppvs(); break; case A_PURE: @@ -784,19 +792,93 @@ void evalnodebody(NODE sn,NODE *dnp) NEXT(n) = 0; *dnp = n0; } +MODULE searchmodule(char *name) +{ + MODULE mod; + NODE m; + + for ( m = MODULE_LIST; m; m = NEXT(m) ) { + mod = (MODULE)BDY(m); + if ( !strcmp(mod->name,name) ) + return mod; + } + return 0; +} +/* + * xxx.yyy() is searched in the flist + * of the module xxx. + * yyy() is searched in the global flist. + */ + +void searchuf(char *name,FUNC *r) +{ + MODULE mod; + char *name0,*dot; + + if ( dot = strchr(name,'.') ) { + name0 = (char *)ALLOCA(strlen(name)+1); + strcpy(name0,name); + dot = strchr(name0,'.'); + *dot = 0; + mod = searchmodule(name0); + if ( mod ) + searchf(mod->usrf_list,dot+1,r); + } else + searchf(usrf,name,r); +} + +/* + * xxx.yyy() is searched in the flist + * of the module xxx. + * yyy() is searched in the current flist + * and proto list. + */ + +void searchuf_proto(char *name,FUNC *r) +{ + MODULE mod; + char *name0,*dot; + + if ( dot = strchr(name,'.') ) { + name0 = (char *)ALLOCA(strlen(name)+1); + strcpy(name0,name); + dot = strchr(name0,'.'); + *dot = 0; + mod = searchmodule(name0); + if ( mod ) + searchf(mod->usrf_list,dot+1,r); + } else if ( CUR_MODULE ) + searchf(CUR_MODULE->proto_list,name,r); +} + void gen_searchf(char *name,FUNC *r) { - FUNC val; + FUNC val = 0; - searchf(sysf,name,&val); - if ( !val ) - searchf(ubinf,name,&val); - if ( !val ) - searchpf(name,&val); - if ( !val ) - searchf(usrf,name,&val); - if ( !val ) - appenduf(name,&val); + if ( CUR_MODULE ) { + searchf(CUR_MODULE->usrf_list,name,&val); + if ( !val ) + searchf(sysf,name,&val); + if ( !val ) + searchf(ubinf,name,&val); + if ( !val ) + searchpf(name,&val); + if ( !val ) + searchuf_proto(name,&val); + if ( !val ) + appenduf(name,&val); + } else { + if ( !val ) + searchf(sysf,name,&val); + if ( !val ) + searchf(ubinf,name,&val); + if ( !val ) + searchpf(name,&val); + if ( !val ) + searchuf(name,&val); + if ( !val ) + appenduf(name,&val); + } *r = val; } @@ -813,13 +895,47 @@ void searchf(NODE fn,char *name,FUNC *r) *r = 0; } +MODULE mkmodule(char *); + void appenduf(char *name,FUNC *r) { NODE tn; FUNC f; + int len; + MODULE mod; + char *modname,*fname,*dot; f=(FUNC)MALLOC(sizeof(struct oFUNC)); - f->name = name; f->id = A_UNDEF; f->argc = 0; f->f.binf = 0; + f->id = A_UNDEF; f->argc = 0; f->f.binf = 0; + if ( dot = strchr(name,'.') ) { + /* undefined function in undefined module */ + len = dot-name; + modname = (char *)MALLOC_ATOMIC(len+1); + strncpy(modname,name,len); modname[len] = 0; + mod = mkmodule(modname); + fname = (char *)MALLOC_ATOMIC(strlen(name)-len+1); + strcpy(fname,dot+1); + f->name = fname; + MKNODE(mod->usrf_list,f,0); + } else { + f->name = name; + if ( CUR_MODULE ) { + MKNODE(tn,f,CUR_MODULE->usrf_list); CUR_MODULE->usrf_list = tn; + } else { + MKNODE(tn,f,usrf); usrf = tn; + } + } + *r = f; +} + +void appenduf_global(char *name,FUNC *r) +{ + NODE tn; + FUNC f; + + f=(FUNC)MALLOC(sizeof(struct oFUNC)); + f->id = A_UNDEF; f->argc = 0; f->f.binf = 0; + f->name = name; MKNODE(tn,f,usrf); usrf = tn; *r = f; } @@ -832,18 +948,21 @@ void mkparif(char *name,FUNC *r) f->name = name; f->id = A_PARI; f->argc = 0; f->f.binf = 0; } -void mkuf(char *name,char *fname,NODE args,SNODE body,int startl,int endl,char *desc) +void mkuf(char *name,char *fname,NODE args,SNODE body,int startl,int endl,char *desc,MODULE module) { FUNC f; USRF t; - NODE sn,tn; + NODE usrf_list,sn,tn; FNODE fn; + char *longname; int argc; - searchf(sysf,name,&f); - if ( f ) { - fprintf(stderr,"def : builtin function %s() cannot be redefined.\n",name); - CPVS = GPVS; return; + if ( !module ) { + searchf(sysf,name,&f); + if ( f ) { + fprintf(stderr,"def : builtin function %s() cannot be redefined.\n",name); + CPVS = GPVS; return; + } } for ( argc = 0, sn = args; sn; argc++, sn = NEXT(sn) ) { fn = (FNODE)BDY(sn); @@ -852,24 +971,32 @@ void mkuf(char *name,char *fname,NODE args,SNODE body, CPVS = GPVS; return; } } - for ( sn = usrf; sn && strcmp(NAME((FUNC)BDY(sn)),name); sn = NEXT(sn) ); + usrf_list = module ? module->usrf_list : usrf; + for ( sn = usrf_list; sn && strcmp(NAME((FUNC)BDY(sn)),name); sn = NEXT(sn) ); if ( sn ) f = (FUNC)BDY(sn); else { f=(FUNC)MALLOC(sizeof(struct oFUNC)); f->name = name; - MKNODE(tn,f,usrf); usrf = tn; + MKNODE(tn,f,usrf_list); usrf_list = tn; + if ( module ) + module->usrf_list = usrf_list; + else + usrf = usrf_list; } - if ( Verbose && f->id != A_UNDEF ) - fprintf(stderr,"Warning : %s() redefined.\n",name); -/* else - fprintf(stderr,"%s() defined.\n",name); */ + if ( Verbose && f->id != A_UNDEF ) { + if ( module ) + fprintf(stderr,"Warning : %s.%s() redefined.\n",module->name,name); + else + fprintf(stderr,"Warning : %s() redefined.\n",name); + } t=(USRF)MALLOC(sizeof(struct oUSRF)); t->args=args; BDY(t)=body; t->pvs = CPVS; t->fname = fname; - t->startl = startl; t->endl = endl; t->vol = asir_infile->vol; + t->startl = startl; t->endl = endl; t->module = module; t->desc = desc; f->id = A_USR; f->argc = argc; f->f.usrf = t; CPVS = GPVS; + CUR_FUNC = 0; clearbp(f); } @@ -899,4 +1026,76 @@ Obj getopt_from_cpvs(char *key) return VOIDobj; } +} + +MODULE mkmodule(char *name) +{ + MODULE mod; + NODE m; + int len; + VS mpvs; + + for ( m = MODULE_LIST; m; m = NEXT(m) ) { + mod = (MODULE)m->body; + if ( !strcmp(mod->name,name) ) + break; + } + if ( m ) + return mod; + else { + mod = (MODULE)MALLOC(sizeof(struct oMODULE)); + len = strlen(name); + mod->name = (char *)MALLOC_ATOMIC(len+1); + strcpy(mod->name,name); + mod->pvs = mpvs = (VS)MALLOC(sizeof(struct oVS)); + reallocarray((char **)&mpvs->va,(int *)&mpvs->asize, + (int *)&mpvs->n,(int)sizeof(struct oPV)); + mod->usrf_list = 0; + MKNODE(m,mod,MODULE_LIST); + MODULE_LIST = m; + return mod; + } +} + +/* register function names to the proto list of a module */ + +void register_proto(NODE n) +{ + NODE tn,flist; + char *name; + FUNC val; + + if ( !CUR_MODULE ) + error("globalf : must be declared in a module."); + for ( tn = n; tn; tn = NEXT(tn) ) { + name = (char *)BDY(tn); + searchf(sysf,name,&val); + if ( val ) { + fprintf(stderr,"globalf : `%s' is a builtin function.",name); + error(""); + } + searchf(ubinf,name,&val); + if ( val ) { + fprintf(stderr, + "globalf : `%s' is a user-defined builtin function.",name); + error(""); + } + searchpf(name,&val); + if ( val ) { + fprintf(stderr,"globalf : `%s' is a pure function.",name); + error(""); + } + searchf(usrf,name,&val); + if ( !val ) + appenduf_global(name,&val); + MKNODE(flist,val,CUR_MODULE->proto_list); + CUR_MODULE->proto_list = flist; + } +} + +void print_crossref(FUNC f) +{ + if ( show_crossref && CUR_FUNC ) + fprintf(asir_out,"%s() at line %d in %s()\n", + f->name, asir_infile->ln, CUR_FUNC); }