--- gforth/engine/engine.c 2000/11/10 10:04:21 1.24 +++ gforth/engine/engine.c 2001/12/09 19:12:46 1.33 @@ -20,6 +20,7 @@ */ #include "config.h" +#include "forth.h" #include #include #include @@ -27,7 +28,6 @@ #include #include #include -#include "forth.h" #include "io.h" #include "threaded.h" #ifndef STANDALONE @@ -72,10 +72,15 @@ struct F83Name { char name[0]; }; -/* are macros for setting necessary? */ #define F83NAME_COUNT(np) ((np)->countetc & 0x1f) -#define F83NAME_SMUDGE(np) (((np)->countetc & 0x40) != 0) -#define F83NAME_IMMEDIATE(np) (((np)->countetc & 0x20) != 0) + +struct Longname { + struct Longname *next; /* the link field for old hands */ + Cell countetc; + char name[0]; +}; + +#define LONGNAME_COUNT(np) ((np)->countetc & (((~((UCell)0))<<3)>>3)) Cell *SP; Float *FP; @@ -191,6 +196,7 @@ DCell timeval2us(struct timeval *tvp) #ifdef HAS_FILE static char* fileattr[6]={"rb","rb","r+b","r+b","wb","wb"}; +static char* pfileattr[6]={"r","r","r+","r+","w","w"}; #ifndef O_BINARY #define O_BINARY 0 @@ -205,6 +211,42 @@ static int ufileattr[6]= { O_WRONLY|O_BINARY, O_WRONLY|O_BINARY }; #endif +/* conversion on fetch */ + +#define vm_Cell2f(x) ((Bool)(x)) +#define vm_Cell2c(x) ((Char)(x)) +#define vm_Cell2n(x) ((Cell)x) +#define vm_Cell2w(x) ((Cell)x) +#define vm_Cell2u(x) ((UCell)(x)) +#define vm_Cell2a_(x) ((Cell *)(x)) +#define vm_Cell2c_(x) ((Char *)(x)) +#define vm_Cell2f_(x) ((Float *)(x)) +#define vm_Cell2df_(x) ((DFloat *)(x)) +#define vm_Cell2sf_(x) ((SFloat *)(x)) +#define vm_Cell2xt(x) ((Xt)(x)) +#define vm_Cell2f83name(x) ((struct F83Name *)(x)) +#define vm_Cell2longname(x) ((struct Longname *)(x)) +#define vm_Float2r(x) (x) + +/* conversion on store */ + +#define vm_f2Cell(x) ((Cell)(x)) +#define vm_c2Cell(x) ((Cell)(x)) +#define vm_n2Cell(x) ((Cell)(x)) +#define vm_w2Cell(x) ((Cell)(x)) +#define vm_u2Cell(x) ((Cell)(x)) +#define vm_a_2Cell(x) ((Cell)(x)) +#define vm_c_2Cell(x) ((Cell)(x)) +#define vm_f_2Cell(x) ((Cell)(x)) +#define vm_df_2Cell(x) ((Cell)(x)) +#define vm_sf_2Cell(x) ((Cell)(x)) +#define vm_xt2Cell(x) ((Cell)(x)) +#define vm_f83name2Cell(x) ((Cell)(x)) +#define vm_longname2Cell(x) ((Cell)(x)) +#define vm_r2Float(x) (x) + +#define vm_Cell2Cell(x) (x) + /* if machine.h has not defined explicit registers, define them as implicit */ #ifndef IPREG #define IPREG @@ -246,6 +288,19 @@ static int ufileattr[6]= { #define DOCFA Xt cfa; GETCFA(cfa) #endif +/* instructions containing these must be the last instruction of a + super-instruction (e.g., branches, EXECUTE, and other instructions + ending the basic block). Instructions containing SET_IP get this + automatically, so you usually don't have to write it. If you have + to write it, write it after IP points to the next instruction. + Used for profiling. Don't write it in a word containing SET_IP, or + the following block will be counted twice. */ +#ifdef VM_PROFILING +#define SUPER_END vm_count_block(IP) +#else +#define SUPER_END +#endif + #ifdef GFORTH_DEBUGGING /* define some VM registers as global variables, so they survive exceptions; global register variables are not up to the task (according to the @@ -254,6 +309,20 @@ Xt *ip; Cell *rp; #endif +Xt *primtable(Label symbols[], Cell size) +{ +#ifdef DIRECT_THREADED + return symbols; +#else /* !defined(DIRECT_THREADED) */ + Xt *xts = (Xt *)malloc(size*sizeof(Xt)); + Cell i; + + for (i=0; i