Diff for /gforth/prim between versions 1.88 and 1.96

version 1.88, 2002/01/04 20:31:53 version 1.96, 2002/08/19 07:38:15
Line 53 Line 53
 \ your code does not fall through, the results are not stored into the  \ your code does not fall through, the results are not stored into the
 \ stack. Use different names on both sides of the '--', if you change a  \ stack. Use different names on both sides of the '--', if you change a
 \ value (some stores to the stack are optimized away).  \ value (some stores to the stack are optimized away).
 \   \
 \   \ For superinstructions the syntax is:
   \
   \ forth-name [/ c-name] = forth-name forth-name ...
   \
 \   \ 
 \ The stack variables have the following types:  \ The stack variables have the following types:
 \   \ 
 \ name matches  type  \ name matches  type
 \ f.*           Bool  \ f.*           Bool
 \ c.*           Char  \ c.*           Char
 \ [nw].*                Cell  \ [nw].*        Cell
 \ u.*           UCell  \ u.*           UCell
 \ d.*           DCell  \ d.*           DCell
 \ ud.*          UDCell  \ ud.*          UDCell
Line 179  SET_IP((Xt *)(((Cell)(IP-1))+ndisp)); Line 182  SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
 define(condbranch,  define(condbranch,
 $1 ( `#'ndisp $2 ) $3  $1 ( `#'ndisp $2 ) $3
 $4      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));  $4      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
 TAIL;  INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
 $5  $5
Line 189  $5 Line 192  $5
 $1-lp+!`#' ( `#'ndisp `#'nlocals $2 ) $3_lp_plus_store_number  $1-lp+!`#' ( `#'ndisp `#'nlocals $2 ) $3_lp_plus_store_number
 $4    lp += nlocals;  $4    lp += nlocals;
 SET_IP((Xt *)(((Cell)(IP-2))+ndisp));  SET_IP((Xt *)(((Cell)(IP-2))+ndisp));
 TAIL;  INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
   
Line 216  if (f==0) { Line 219  if (f==0) {
   sp++;    sp++;
   IF_spTOS(spTOS = sp[0]);    IF_spTOS(spTOS = sp[0]);
   SET_IP((Xt *)(((Cell)(IP-1))+ndisp));    SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
   TAIL;    INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
   
Line 311  nlimit=0; Line 314  nlimit=0;
 (?do)   ( #ndisp nlimit nstart -- R:nlimit R:nstart )   gforth  paren_question_do  (?do)   ( #ndisp nlimit nstart -- R:nlimit R:nstart )   gforth  paren_question_do
 if (nstart == nlimit) {  if (nstart == nlimit) {
     SET_IP((Xt *)(((Cell)(IP-1))+ndisp));      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
     TAIL;      INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
 :  :
Line 327  SUPER_CONTINUE; Line 330  SUPER_CONTINUE;
 (+do)   ( #ndisp nlimit nstart -- R:nlimit R:nstart )   gforth  paren_plus_do  (+do)   ( #ndisp nlimit nstart -- R:nlimit R:nstart )   gforth  paren_plus_do
 if (nstart >= nlimit) {  if (nstart >= nlimit) {
     SET_IP((Xt *)(((Cell)(IP-1))+ndisp));      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
     TAIL;      INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
 :  :
Line 343  SUPER_CONTINUE; Line 346  SUPER_CONTINUE;
 (u+do)  ( #ndisp ulimit ustart -- R:ulimit R:ustart )   gforth  paren_u_plus_do  (u+do)  ( #ndisp ulimit ustart -- R:ulimit R:ustart )   gforth  paren_u_plus_do
 if (ustart >= ulimit) {  if (ustart >= ulimit) {
     SET_IP((Xt *)(((Cell)(IP-1))+ndisp));      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
     TAIL;      INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
 :  :
Line 359  SUPER_CONTINUE; Line 362  SUPER_CONTINUE;
 (-do)   ( #ndisp nlimit nstart -- R:nlimit R:nstart )   gforth  paren_minus_do  (-do)   ( #ndisp nlimit nstart -- R:nlimit R:nstart )   gforth  paren_minus_do
 if (nstart <= nlimit) {  if (nstart <= nlimit) {
     SET_IP((Xt *)(((Cell)(IP-1))+ndisp));      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
     TAIL;      INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
 :  :
Line 375  SUPER_CONTINUE; Line 378  SUPER_CONTINUE;
 (u-do)  ( #ndisp ulimit ustart -- R:ulimit R:ustart )   gforth  paren_u_minus_do  (u-do)  ( #ndisp ulimit ustart -- R:ulimit R:ustart )   gforth  paren_u_minus_do
 if (ustart <= ulimit) {  if (ustart <= ulimit) {
     SET_IP((Xt *)(((Cell)(IP-1))+ndisp));      SET_IP((Xt *)(((Cell)(IP-1))+ndisp));
     TAIL;      INST_TAIL;
 }  }
 SUPER_CONTINUE;  SUPER_CONTINUE;
 :  :
Line 1356  a_addr = (Cell *)DOES_CODE(xt); Line 1359  a_addr = (Cell *)DOES_CODE(xt);
 code-address!   ( c_addr xt -- )                gforth  code_address_store  code-address!   ( c_addr xt -- )                gforth  code_address_store
 ""Create a code field with code address @i{c-addr} at @i{xt}.""  ""Create a code field with code address @i{c-addr} at @i{xt}.""
 MAKE_CF(xt, c_addr);  MAKE_CF(xt, c_addr);
 CACHE_FLUSH(xt,(size_t)PFA(0));  
 :  :
     ! ;      ! ;
   
Line 1364  does-code! ( a_addr xt -- )  gforth does Line 1366  does-code! ( a_addr xt -- )  gforth does
 ""Create a code field at @i{xt} for a child of a @code{DOES>}-word;  ""Create a code field at @i{xt} for a child of a @code{DOES>}-word;
 @i{a-addr} is the start of the Forth code after @code{DOES>}.""  @i{a-addr} is the start of the Forth code after @code{DOES>}.""
 MAKE_DOES_CF(xt, a_addr);  MAKE_DOES_CF(xt, a_addr);
 CACHE_FLUSH(xt,(size_t)PFA(0));  
 :  :
     dodoes: over ! cell+ ! ;      dodoes: over ! cell+ ! ;
   
Line 1372  does-handler! ( a_addr -- ) gforth does_ Line 1373  does-handler! ( a_addr -- ) gforth does_
 ""Create a @code{DOES>}-handler at address @i{a-addr}. Normally,  ""Create a @code{DOES>}-handler at address @i{a-addr}. Normally,
 @i{a-addr} points just behind a @code{DOES>}.""  @i{a-addr} points just behind a @code{DOES>}.""
 MAKE_DOES_HANDLER(a_addr);  MAKE_DOES_HANDLER(a_addr);
 CACHE_FLUSH((caddr_t)a_addr,DOES_HANDLER_SIZE);  
 :  :
     drop ;      drop ;
   
Line 2166  Variable UP Line 2166  Variable UP
 wcall   ( u -- )        gforth  wcall   ( u -- )        gforth
 IF_fpTOS(fp[0]=fpTOS);  IF_fpTOS(fp[0]=fpTOS);
 FP=fp;  FP=fp;
 sp=(Cell*)(SYSCALL(Cell(*)(Cell *, void *))u)(sp, &FP);  sp=(Cell*)(SYSCALL(Cell*(*)(Cell *, void *))u)(sp, &FP);
 fp=FP;  fp=FP;
 IF_spTOS(spTOS=sp[0];)  IF_spTOS(spTOS=sp[0];)
 IF_fpTOS(fpTOS=fp[0]);  IF_fpTOS(fpTOS=fp[0]);
Line 2174  IF_fpTOS(fpTOS=fp[0]); Line 2174  IF_fpTOS(fpTOS=fp[0]);
 \+file  \+file
   
 open-dir        ( c_addr u -- wdirid wior )     gforth  open_dir  open-dir        ( c_addr u -- wdirid wior )     gforth  open_dir
   ""Open the directory specified by @i{c-addr, u}
   and return @i{dir-id} for futher access to it.""
 wdirid = (Cell)opendir(tilde_cstr(c_addr, u, 1));  wdirid = (Cell)opendir(tilde_cstr(c_addr, u, 1));
 wior =  IOR(wdirid == 0);  wior =  IOR(wdirid == 0);
   
 read-dir        ( c_addr u1 wdirid -- u2 flag wior )    gforth  read_dir  read-dir        ( c_addr u1 wdirid -- u2 flag wior )    gforth  read_dir
   ""Attempt to read the next entry from the directory specified
   by @i{dir-id} to the buffer of length @i{u1} at address @i{c-addr}. 
   If the attempt fails because there is no more entries,
   @i{ior}=0, @i{flag}=0, @i{u2}=0, and the buffer is unmodified.
   If the attempt to read the next entry fails because of any other reason, 
   return @i{ior}<>0.
   If the attempt succeeds, store file name to the buffer at @i{c-addr}
   and return @i{ior}=0, @i{flag}=true and @i{u2} equal to the size of the file name.
   If the length of the file name is greater than @i{u1}, 
   store first @i{u1} characters from file name into the buffer and
   indicate "name too long" with @i{ior}, @i{flag}=true, and @i{u2}=@i{u1}.""
 struct dirent * dent;  struct dirent * dent;
 dent = readdir((DIR *)wdirid);  dent = readdir((DIR *)wdirid);
 wior = 0;  wior = 0;
Line 2195  if(dent == NULL) { Line 2208  if(dent == NULL) {
 }  }
   
 close-dir       ( wdirid -- wior )      gforth  close_dir  close-dir       ( wdirid -- wior )      gforth  close_dir
   ""Close the directory specified by @i{dir-id}.""
 wior = IOR(closedir((DIR *)wdirid));  wior = IOR(closedir((DIR *)wdirid));
   
 filename-match  ( c_addr1 u1 c_addr2 u2 -- flag )       gforth  match_file  filename-match  ( c_addr1 u1 c_addr2 u2 -- flag )       gforth  match_file
Line 2412  a_addr = (Cell *)(up+u); Line 2426  a_addr = (Cell *)(up+u);
 compile-prim ( xt1 -- xt2 )     new     compile_prim  compile-prim ( xt1 -- xt2 )     new     compile_prim
 xt2 = (Xt)compile_prim((Label)xt1);  xt2 = (Xt)compile_prim((Label)xt1);
   
   lit@ / lit_fetch = lit @
   
   lit-perform     ( #a_addr -- )  new     lit_perform
   ip=IP;
   SUPER_END;
   EXEC(*(Xt *)a_addr);
   
   lit+ / lit_plus = lit +
   
   does-exec ( #a_cfa -- R:nest a_pfa )    new     does_exec
   a_pfa = PFA(a_cfa);
   nest = (Cell)ip;
   IF_spTOS(spTOS = sp[0]);
   #ifdef DEBUG
       {
         CFA_TO_NAME(a_cfa);
         fprintf(stderr,"%08lx: does %08lx %.*s\n",
                 (Cell)ip,(Cell)a_cfa,len,name);
       }
   #endif
   SET_IP(DOES_CODE1(a_cfa));
   
 include(peeprules.vmg)  include(peeprules.vmg)
   
 \+  \+

Removed from v.1.88  
changed lines
  Added in v.1.96


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>