--- gforth/libcc.fs 2007/01/14 22:19:35 1.6 +++ gforth/libcc.fs 2007/02/12 18:56:23 1.8 @@ -45,6 +45,29 @@ \ the function pointer of gforth_c_lseek_ndn_d on the stack and \ calls CALL-C. +\ ToDo: + +\ Batching, caching and lazy evaluation: + +\ Batching: + +\ New words are deferred, and the corresponding C functions are +\ collected in one file, until the first word is EXECUTEd; then the +\ file is compiled and linked into the system, and the word is +\ resolved. + +\ Caching: + +\ Instead of compiling all this stuff anew for every execution, we +\ keep the files around and have an index file containing the function +\ names and their corresponding .so files. If the needed wrapper name +\ is already present, it is just linked instead of generating the +\ wrapper again. This is all done by loading the index file(s?), +\ which define words for the wrappers in a separate wordlist. + +\ The files are built in .../lib/gforth/$VERSION/libcc/ or +\ ~/.gforth/libcc/$HOST/. + \ other things to do: \ c-variable forth-name c-name @@ -290,27 +313,36 @@ create gen-wrapped-types \ s" ar rcs xxx.a xxx.o" system \ $? abort" ar generated error" ; -: link-wrapper-function ( -- ) +: link-wrapper-function ( -- sym ) s" /home/anton/gforth/xxx.so.1" open-lib ( lib-handle ) - s" gforth_c_strlen_a_n" rot lib-sym dup 0= -32 and throw ; + s" gforth_c_strlen_a_n" rot lib-sym dup 0= -&32 and throw ; -: c-function ( "forth-name" "c-name" "{libcc-type}" "--" "libcc-type" -- ) - create here >r 0 , \ place for the wrapper function pointer + +: c-function-ft ( xt-defer xt-cfr "c-name" "{libcc-type}" "--" "libcc-type" -- ) + \ build time/first time action for c-function + noname create 2, parse-name { d: c-name } - parse-function-types c-name string, - r@ cell+ + here parse-function-types c-name string, s" xxx.c" w/o create-file throw ( file-id ) dup >r >outfile gen-wrapper-function outfile< r> close-file throw + does> ( ... -- ... ) + 2@ { xt-defer xt-cfr } compile-wrapper-function - link-wrapper-function - r> ! + link-wrapper-function xt-cfr >body ! + xt-cfr xt-defer defer! + xt-cfr execute ; + +: c-function-rt ( -- ) + \ run-time definition for c function; addr is the address where + \ the sym should be stored + noname create 0 , does> ( ... -- ... ) @ call-c ; - - - +: c-function ( "forth-name" "c-name" "{libcc-type}" "--" "libcc-type" -- ) + defer lastxt dup c-function-rt lastxt c-function-ft + lastxt swap defer! ; s" Library not found" exception constant err-nolib @@ -345,6 +377,8 @@ s" Library not found" exception constant \ c-function func test5 -- func \ c-function void test6 -- void +\c #include + c-function strlen strlen a -- n cr s\" fooo\0" 2dup dump drop .s strlen cr .s cr