Diff for /gforth/libcc.fs between versions 1.11 and 1.12

version 1.11, 2007/04/25 17:59:36 version 1.12, 2007/04/25 22:11:29
Line 82 Line 82
 \ first-time word, then to the run-time word; the run-time word calls  \ first-time word, then to the run-time word; the run-time word calls
 \ the c function.  \ the c function.
   
   
   require struct.fs
   
       \ counted-string
       
 \ c-function-ft word body:  \ c-function-ft word body:
 \  cell xt of c-function-rt word  struct
 \  cell xt of c-function deferred word       cell% field cff-cfr \ xt of c-function-rt word
 \  char return type index      cell% field cff-deferred \ xt of c-function deferred word
 \  char parameter count n      cell% field cff-lha \ address of the lib-handle for the lib that
 \  char*n parameters (type indices)                          \ contains the wrapper function of the word
 \  counted string: c-name      char% field cff-rtype  \ return type
       char% field cff-np     \ number of parameters
       1 0   field cff-ptypes \ #npar parameter types
       \  counted string: c-name
   end-struct cff%
   
   
 : .nb ( n -- )  : .nb ( n -- )
     0 .r ;      0 .r ;
Line 114 Line 124
   
 hex  hex
   
 require struct.fs  
   
 struct  struct
     cell% field list-next      cell% field list-next
     1 0   field list-payload      1 0   field list-payload
Line 165  variable c-prefix-lines-end c-prefix-lin Line 173  variable c-prefix-lines-end c-prefix-lin
   
 \c #include "engine/libcc.h"  \c #include "engine/libcc.h"
   
 print-c-prefix-lines  
   
 \ Types (for parsing)  \ Types (for parsing)
   
 wordlist constant libcc-types  wordlist constant libcc-types
Line 340  create gen-wrapped-types Line 346  create gen-wrapped-types
     endif      endif
     .\" }\n" ;      .\" }\n" ;
   
 variable c-source-file-id  variable c-source-file-id \ contains the source file id of the current batch
 0 c-source-file-id !  0 c-source-file-id !
   variable lib-handle-addr \ points to the library handle of the current batch.
                            \ the library handle is 0 if the current
                            \ batch is not yet compiled.
   
   : init-c-source-file ( -- )
       c-source-file-id @ 0= if
           s" xxx.c" w/o create-file throw dup c-source-file-id !
           ['] print-c-prefix-lines swap outfile-execute
           here 0 , lib-handle-addr !
       endif ;
   
 : c-source-file ( -- file-id )  : c-source-file ( -- file-id )
     c-source-file-id @ ?dup-if      c-source-file-id @ assert( dup ) ;
         exit  
     endif  
     s" xxx.c" w/o create-file throw dup c-source-file-id !  
     ['] print-c-prefix-lines over outfile-execute ;  
   
 : compile-wrapper-function ( -- )  : compile-wrapper-function ( -- )
     c-source-file-id @ assert( dup )      c-source-file close-file throw
     close-file throw 0 c-source-file-id !      0 c-source-file-id !
     s" gcc -fPIC -shared -Wl,-soname,xxx.so.1 -Wl,-export_dynamic -o xxx.so.1 -O xxx.c" system      s" gcc -fPIC -shared -Wl,-soname,xxx.so.1 -Wl,-export_dynamic -o xxx.so.1 -O xxx.c" system
     $? abort" compiler generated error" ;      $? abort" compiler generated error"
       s" /home/anton/gforth/xxx.so.1" open-lib dup 0= abort" open-lib failed"
       ( lib-handle ) lib-handle-addr @ ! ;
 \    s" ar rcs xxx.a xxx.o" system  \    s" ar rcs xxx.a xxx.o" system
 \    $? abort" ar generated error" ;  \    $? abort" ar generated error" ;
   
 : link-wrapper-function ( addr -- sym )  : link-wrapper-function { cff -- sym }
     wrapper-function-name { d: wrapper-name }      cff cff-rtype wrapper-function-name { d: wrapper-name }
     s" /home/anton/gforth/xxx.so.1" open-lib ( lib-handle )      wrapper-name cff cff-lha @ @ assert( dup ) lib-sym dup 0= -&32 and throw
     wrapper-name rot lib-sym dup 0= -&32 and throw  
     wrapper-name drop free throw ;      wrapper-name drop free throw ;
   
 : c-function-ft ( xt-defer xt-cfr "c-name" "{libcc-type}" "--" "libcc-type" -- )  : c-function-ft ( xt-defr xt-cfr "c-name" "{libcc-type}" "--" "libcc-type" -- )
     \ build time/first time action for c-function      \ build time/first time action for c-function
     noname create 2,      init-c-source-file
       noname create 2, lib-handle-addr @ ,
     parse-name { d: c-name }      parse-name { d: c-name }
     here parse-function-types c-name string,      here parse-function-types c-name string,
     ['] gen-wrapper-function c-source-file outfile-execute      ['] gen-wrapper-function c-source-file outfile-execute
   does> ( ... -- ... )    does> ( ... -- ... )
     dup 2@ { xt-defer xt-cfr }      dup 2@ { xt-defer xt-cfr }
     compile-wrapper-function      dup cff-lha @ @ 0= if
     2 cells + link-wrapper-function xt-cfr >body !          compile-wrapper-function
       endif
       link-wrapper-function xt-cfr >body !
     xt-cfr xt-defer defer!      xt-cfr xt-defer defer!
     xt-cfr execute ;      xt-cfr execute ;
   
Line 424  s" Library not found" exception constant Line 440  s" Library not found" exception constant
 \c #include <string.h>  \c #include <string.h>
 \c #include <stdlib.h>  \c #include <stdlib.h>
   
 cr here hex.  
   
 c-function strlen strlen a -- n  c-function strlen strlen a -- n
 c-function labs labs n -- n  c-function labs labs n -- n
   
 cr s\" fooo\0" 2dup dump drop .s strlen cr .s drop cr   cr s\" fooo\0" 2dup dump drop .s strlen cr .s drop cr 
 \ -5 labs .s drop cr  -5 labs .s drop cr

Removed from v.1.11  
changed lines
  Added in v.1.12


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