--- gforth/prim 2007/06/01 18:40:20 1.213 +++ gforth/prim 2007/12/31 18:40:24 1.222 @@ -1,12 +1,12 @@ \ Gforth primitives -\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007 Free Software Foundation, Inc. \ This file is part of Gforth. \ Gforth is free software; you can redistribute it and/or \ modify it under the terms of the GNU General Public License -\ as published by the Free Software Foundation; either version 2 +\ as published by the Free Software Foundation, either version 3 \ of the License, or (at your option) any later version. \ This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ \ GNU General Public License for more details. \ You should have received a copy of the GNU General Public License -\ along with this program; if not, write to the Free Software -\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. +\ along with this program. If not, see http://www.gnu.org/licenses/. \ WARNING: This file is processed by m4. Make sure your identifiers @@ -109,9 +108,9 @@ \E store-optimization on \E ' noop tail-nextp2 ! \ now INST_TAIL just stores, but does not jump \E -\E include-skipped-insts on \ static superinsts include cells for components -\E \ useful for dynamic programming and -\E \ superinsts across entry points +\E `include-skipped-insts' on \ static superinsts include cells for components +\E \ useful for dynamic programming and +\E \ superinsts across entry points \ \ @@ -203,6 +202,14 @@ INST_TAIL; goto *next_code; #endif /* defined(NO_IP) */ +(dovalue) ( -- w ) gforth-internal paren_doval +""run-time routine for constants"" +w = *(Cell *)PFA(CFA); +#ifdef NO_IP +INST_TAIL; +goto *next_code; +#endif /* defined(NO_IP) */ + (dodoes) ( -- a_body R:a_retaddr ) gforth-internal paren_dodoes ""run-time routine for @code{does>}-defined words"" #ifdef NO_IP @@ -338,8 +345,6 @@ SET_IP((Xt *)a_target); \ condbranch(forthname,stackeffect,restline,code1,code2,forthcode) \ this is non-syntactical: code must open a brace that is closed by the macro -\ condbranch(forthname,stackeffect,restline,code1,code2,forthcode) -\ this is non-syntactical: code must open a brace that is closed by the macro define(condbranch, $1 ( `#'a_target $2 ) $3 $4 #ifdef NO_IP @@ -349,8 +354,10 @@ $5 #ifdef NO_IP JUMP(a_target); #else SET_IP((Xt *)a_target); +ifelse(condbranch_opt,`1',`INST_TAIL; NEXT_P2;',`/* condbranch_opt=0 */') #endif } +ifelse(condbranch_opt,`1',`SUPER_CONTINUE;',`/* condbranch_opt=0 */') $6 \+glocals @@ -364,43 +371,10 @@ $5 lp += nlocals; JUMP(a_target); #else SET_IP((Xt *)a_target); +ifelse(condbranch_opt,`1',`INST_TAIL; NEXT_P2;',`/* condbranch_opt=0 */') #endif } - -\+ -) - -\ version that generates two jumps (not good for PR 15242 workaround) -define(condbranch_twojump, -$1 ( `#'a_target $2 ) $3 -$4 #ifdef NO_IP -INST_TAIL; -#endif -$5 #ifdef NO_IP -JUMP(a_target); -#else -SET_IP((Xt *)a_target); -INST_TAIL; NEXT_P2; -#endif -} -SUPER_CONTINUE; -$6 - -\+glocals - -$1-lp+!`#' ( `#'a_target `#'nlocals $2 ) $3_lp_plus_store_number -$4 #ifdef NO_IP -INST_TAIL; -#endif -$5 lp += nlocals; -#ifdef NO_IP -JUMP(a_target); -#else -SET_IP((Xt *)a_target); -INST_TAIL; NEXT_P2; -#endif -} -SUPER_CONTINUE; +ifelse(condbranch_opt,`1',`SUPER_CONTINUE;',`/* condbranch_opt=0 */') \+ ) @@ -635,13 +609,13 @@ i' ( R:w R:w2 -- R:w R:w2 w ) gforth i r> r> r> dup itmp ! >r >r >r itmp @ ; variable itmp -j ( R:n R:d1 -- n R:n R:d1 ) core +j ( R:w R:w1 R:w2 -- w R:w R:w1 R:w2 ) core : \ rp@ cell+ cell+ cell+ @ ; r> r> r> r> dup itmp ! >r >r >r >r itmp @ ; [IFUNDEF] itmp variable itmp [THEN] -k ( R:n R:d1 R:d2 -- n R:n R:d1 R:d2 ) gforth +k ( R:w R:w1 R:w2 R:w3 R:w4 -- w R:w R:w1 R:w2 R:w3 R:w4 ) gforth : \ rp@ [ 5 cells ] Literal + @ ; r> r> r> r> r> r> dup itmp ! >r >r >r >r >r >r itmp @ ; @@ -1816,19 +1790,10 @@ close-file ( wfileid -- wior ) file clo wior = IOR(fclose((FILE *)wfileid)==EOF); open-file ( c_addr u wfam -- wfileid wior ) file open_file -wfileid = (Cell)fopen(tilde_cstr(c_addr, u, 1), fileattr[wfam]); -wior = IOR(wfileid == 0); +wfileid = opencreate_file(tilde_cstr(c_addr,u,1), wfam, 0, &wior); create-file ( c_addr u wfam -- wfileid wior ) file create_file -Cell fd; -fd = open(tilde_cstr(c_addr, u, 1), O_CREAT|O_TRUNC|ufileattr[wfam], 0666); -if (fd != -1) { - wfileid = (Cell)fdopen(fd, fileattr[wfam]); - wior = IOR(wfileid == 0); -} else { - wfileid = 0; - wior = IOR(1); -} +wfileid = opencreate_file(tilde_cstr(c_addr,u,1), wfam, O_CREAT|O_TRUNC, &wior); delete-file ( c_addr u -- wior ) file delete_file wior = IOR(unlink(tilde_cstr(c_addr, u, 1))==-1); @@ -2143,7 +2108,7 @@ floor ( r1 -- r2 ) float /* !! unclear wording */ r2 = floor(r1); -fround ( r1 -- r2 ) gforth f_round +fround ( r1 -- r2 ) float f_round ""Round to the nearest integral value."" r2 = rint(r1); @@ -2428,7 +2393,9 @@ r = fp[u]; \g syslib open-lib ( c_addr1 u1 -- u2 ) gforth open_lib -#if defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) +#if 1 +u2 = (UCell)lt_dlopen(cstr(c_addr1, u1, 1)); +#elif defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 #endif @@ -2443,7 +2410,9 @@ u2 = 0; #endif lib-sym ( c_addr1 u1 u2 -- u3 ) gforth lib_sym -#if defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) +#if 1 +u3 = (UCell) lt_dlsym((lt_dlhandle)u2, cstr(c_addr1, u1, 1)); +#elif defined(HAVE_LIBDL) || defined(HAVE_DLOPEN) u3 = (UCell) dlsym((void*)u2,cstr(c_addr1, u1, 1)); #else # ifdef _WIN32 @@ -2815,6 +2784,10 @@ fcall(20) \+ \+ +lib-error ( -- c_addr u ) gforth lib_error +c_addr = lt_dlerror(); +u = (c_addr == NULL) ? 0 : strlen(c_addr); + \g peephole \+peephole