--- gforth/engine/engine.c 2002/01/04 20:31:54 1.37 +++ gforth/engine/engine.c 2002/12/19 20:14:57 1.48 @@ -99,103 +99,8 @@ extern int gforth_memcmp(const char * s1 #define memcmp(s1,s2,n) gforth_memcmp(s1,s2,n) #endif -#ifdef HAS_FILE -char *cstr(Char *from, UCell size, int clear) -/* return a C-string corresponding to the Forth string ( FROM SIZE ). - the C-string lives until the next call of cstr with CLEAR being true */ -{ - static struct cstr_buffer { - char *buffer; - size_t size; - } *buffers=NULL; - static int nbuffers=0; - static int used=0; - struct cstr_buffer *b; - - if (buffers==NULL) - buffers=malloc(0); - if (clear) - used=0; - if (used>=nbuffers) { - buffers=realloc(buffers,sizeof(struct cstr_buffer)*(used+1)); - buffers[used]=(struct cstr_buffer){malloc(0),0}; - nbuffers=used+1; - } - b=&buffers[used]; - if (size+1 > b->size) { - b->buffer = realloc(b->buffer,size+1); - b->size = size+1; - } - memcpy(b->buffer,from,size); - b->buffer[size]='\0'; - used++; - return b->buffer; -} - -char *tilde_cstr(Char *from, UCell size, int clear) -/* like cstr(), but perform tilde expansion on the string */ -{ - char *s1,*s2; - int s1_len, s2_len; - struct passwd *getpwnam (), *user_entry; - - if (size<1 || from[0]!='~') - return cstr(from, size, clear); - if (size<2 || from[1]=='/') { - s1 = (char *)getenv ("HOME"); - if(s1 == NULL) - s1 = ""; - s2 = from+1; - s2_len = size-1; - } else { - UCell i; - for (i=1; ipw_dir; - s2 = from+i; - s2_len = size-i; - } - s1_len = strlen(s1); - if (s1_len>1 && s1[s1_len-1]=='/') - s1_len--; - { - char path[s1_len+s2_len]; - memcpy(path,s1,s1_len); - memcpy(path+s1_len,s2,s2_len); - return cstr(path,s1_len+s2_len,clear); - } -} -#endif - -DCell timeval2us(struct timeval *tvp) -{ -#ifndef BUGGY_LONG_LONG - return (tvp->tv_sec*(DCell)1000000)+tvp->tv_usec; -#else - DCell d2; - DCell d1=mmul(tvp->tv_sec,1000000); - d2.lo = d1.lo+tvp->tv_usec; - d2.hi = d1.hi + (d2.lo=MAX_SYMBOLS) { fprintf(stderr,"gforth-ditc: more than %d primitives\n",MAX_SYMBOLS); exit(1); } - symbols[i] = &routines[i]; + xts[i] = symbols[i] = &routines[i]; } #endif /* defined(DOUBLY_INDIRECT) */ return symbols; @@ -427,10 +324,13 @@ define(enginerest, IF_spTOS(spTOS = sp[0]); IF_fpTOS(fpTOS = fp[0]); /* prep_terminal(); */ +#ifdef NO_IP + goto *(*(Label *)ip0); +#else SET_IP(ip); SUPER_END; /* count the first block, too */ NEXT; - +#endif #ifdef CPU_DEP3 CPU_DEP3 @@ -438,7 +338,10 @@ define(enginerest, docol: { - DOCFA; +#ifdef NO_IP + *--rp = next_code; + goto **(Label *)PFA1(cfa); +#else #ifdef DEBUG { CFA_TO_NAME(cfa); @@ -464,11 +367,11 @@ define(enginerest, NEXT_P2; } #endif +#endif } docon: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: con: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa)); #endif @@ -479,12 +382,15 @@ define(enginerest, *--sp = *(Cell *)PFA1(cfa); #endif } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif dovar: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: var: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif @@ -495,12 +401,15 @@ define(enginerest, *--sp = (Cell)PFA1(cfa); #endif } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif douser: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: user: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif @@ -511,12 +420,15 @@ define(enginerest, *--sp = (Cell)(up+*(Cell*)PFA1(cfa)); #endif } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif dodefer: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: defer: %08lx\n",(Cell)ip,*(Cell*)PFA1(cfa)); #endif @@ -526,14 +438,17 @@ define(enginerest, dofield: { - DOCFA; #ifdef DEBUG fprintf(stderr,"%08lx: field: %08lx\n",(Cell)ip,(Cell)PFA1(cfa)); #endif spTOS += *(Cell*)PFA1(cfa); } +#ifdef NO_IP + goto *next_code; +#else NEXT_P0; NEXT; +#endif dodoes: /* this assumes the following structure: @@ -553,9 +468,14 @@ define(enginerest, pfa: */ +#ifdef NO_IP + *--rp = next_code; + IF_spTOS(spTOS = sp[0]); + sp--; + spTOS = (Cell)PFA(cfa); + goto **(Label *)DOES_CODE1(cfa); +#else { - DOCFA; - /* fprintf(stderr, "Got CFA %08lx at doescode %08lx/%08lx: does: %08lx\n",cfa,(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa));*/ #ifdef DEBUG fprintf(stderr,"%08lx/%08lx: does: %08lx\n",(Cell)ip,(Cell)PFA(cfa),(Cell)DOES_CODE1(cfa)); @@ -574,12 +494,14 @@ define(enginerest, /* fprintf(stderr,"TOS = %08lx, IP=%08lx\n", spTOS, IP);*/ } NEXT; +#endif #ifndef IN_ENGINE2 -#define LABEL(name) I_##name +#define LABEL(name) I_##name: #else -#define LABEL(name) J_##name: asm(".skip 16"); I_##name +#define LABEL(name) J_##name: asm(".skip 16"); I_##name: #endif +#define LABEL2(name) K_##name: #include "prim.i" #undef LABEL after_last: return (Label *)0; @@ -587,8 +509,25 @@ define(enginerest, }' ) +#define VARIANT(v) (v) +#define JUMP(target) goto I_noop + Label *engine enginerest +#ifndef NO_DYNAMIC + +#ifdef NO_IP +#undef VARIANT +#define VARIANT(v) ((v)^0xffffffff) +#undef JUMP +#define JUMP(target) goto K_lit +Label *engine3 enginerest +#endif + +#undef VARIANT +#define VARIANT(v) (v) +#undef JUMP +#define JUMP(target) goto I_noop #define IN_ENGINE2 Label *engine2 enginerest - +#endif