--- gforth/libffi.fs 2005/12/03 15:15:20 1.5 +++ gforth/libffi.fs 2005/12/11 20:10:01 1.9 @@ -104,7 +104,7 @@ Create argptr maxargs 0 [DO] argbuf [I] \ "forward" when revarg is on \ : >c+ ( char buf -- buf' ) tuck c! cell+ cell+ ; -: >i+ ( n buf -- buf' ) tuck ! cell+ cell+ ; +: >i+ ( n buf -- buf' ) tuck l! cell+ cell+ ; : >p+ ( addr buf -- buf' ) tuck ! cell+ cell+ ; : >d+ ( d buf -- buf' ) dup >r ffi-2! r> cell+ cell+ ; : >sf+ ( r buf -- buf' ) dup sf! cell+ cell+ ; @@ -112,7 +112,7 @@ Create argptr maxargs 0 [DO] argbuf [I] \ "backward" when revarg is off -: >i- ( n buf -- buf' ) 2 cells - tuck t! ; +: >i- ( n buf -- buf' ) 2 cells - tuck l! ; : >p- ( addr buf -- buf' ) 2 cells - tuck ! ; : >d- ( d buf -- buf' ) 2 cells - dup >r ffi-2! r> ; : >sf- ( r buf -- buf' ) 2 cells - dup sf! ; @@ -120,7 +120,8 @@ Create argptr maxargs 0 [DO] argbuf [I] \ return value -: i>x ( -- n ) retbuf t@ ; +: i>x ( -- n ) retbuf l@ ; +: is>x ( -- n ) retbuf sl@ ; : p>x ( -- addr ) retbuf @ ; : d>x ( -- d ) retbuf ffi-2@ ; : sf>x ( -- r ) retbuf sf@ ; @@ -147,6 +148,10 @@ Variable args args off revarg @ IF drop 0 ELSE 2* cells THEN argbuf + postpone Literal ; +Variable ind-call ind-call off +: fptr: ind-call on Create here thisproc ! + 0 , 0 , 0 , 0 also c-decl DOES> cell+ dup cell+ cell+ >r ! ; + : ffi-call, ( -- lit-cif ) postpone drop postpone argptr postpone retbuf thisproc @ cell+ postpone literal postpone @ @@ -159,15 +164,17 @@ Variable args args off : cif@ ( -- addr u ) cifbuf cell+ cifbuf @ over - ; -: make-cif ( rtype -- addr ) cif, +: create-cif ( rtype -- addr ) cif, cif@ cifs search-wordlist IF execute EXIT THEN get-current >r cifs set-current cif@ nextname Create here >r - cif@ 1- bounds ?DO I c@ ffi-type , LOOP - r> cif@ 1- tuck + c@ ffi-type here dup >r 0 ffi-size allot - ffi-prep-cif throw - r> r> set-current ; + cif@ 1- bounds ?DO I c@ ffi-type , LOOP r> + r> set-current ; + +: make-cif ( rtype -- addr ) create-cif + cif@ 1- tuck + c@ ffi-type here 0 ffi-size allot + dup >r ffi-prep-cif throw r> ; : decl, ( 0 arg1 .. argn call rtype start -- ) start, { retxt rtype } cifreset @@ -184,7 +191,8 @@ Variable args args off : rettype ( endxt n "name" -- ) Create 2, - DOES> 2@ args @ decl, symbol, previous revarg off args off ; + DOES> 2@ args @ decl, ind-call @ 0= IF symbol, THEN + previous revarg off args off ind-call off ; also c-decl definitions @@ -197,7 +205,8 @@ also c-decl definitions ' >df+ ' >df- &10 argtype df ' noop 0 rettype (void) -' i>x 6 rettype (int) +' is>x 6 rettype (int) +' i>x 6 rettype (uint) ' p>x &12 rettype (ptr) ' d>x 8 rettype (llong) ' sf>x 9 rettype (sf) @@ -234,20 +243,17 @@ Variable callbacks Variable rtype -: alloc-callback ( -- addr ) - rtype @ cif, - here >r - cif@ 1- bounds ?DO I c@ ffi-type , LOOP - r> cif@ 1- tuck + c@ ffi-type here dup >r 1 ffi-size allot - ffi-prep-closure throw r> ; +: alloc-callback ( ip -- addr ) + rtype @ make-cif here 1 ffi-size allot + dup >r ffi-prep-closure throw r> ; : callback ( -- ) Create 0 ] postpone >r also cb-decl cifreset DOES> - Create here >r 0 , callbacks @ A, r@ callbacks ! + 0 Value -1 cells allot + here >r 0 , callbacks @ A, r@ callbacks ! swap postpone Literal postpone call , postpone EXIT - r> dup cell+ cell+ alloc-callback swap ! - DOES> @ ; + r@ cell+ cell+ alloc-callback r> ! ; : callback; ( 0 arg1 .. argn -- ) BEGIN over WHILE compile, REPEAT