File ffcall/callback/trampoline_r/trampoline_r.man artifact e40d41bfa9 part of check-in e2dfc3d3c2





TRAMPOLINE(3)                                       TRAMPOLINE(3)


NNAAMMEE
       trampoline - closures as first-class C functions

SSYYNNOOPPSSIISS
       ##iinncclluuddee <<ttrraammppoolliinnee__rr..hh>>

       ffuunnccttiioonn == aalllloocc__ttrraammppoolliinnee__rr((aaddddrreessss,, ddaattaa00,, ddaattaa11));;

       ffrreeee__ttrraammppoolliinnee__rr((ffuunnccttiioonn));;

       iiss__ttrraammppoolliinnee__rr((ffuunnccttiioonn))
       ttrraammppoolliinnee__rr__aaddddrreessss((ffuunnccttiioonn))
       ttrraammppoolliinnee__rr__ddaattaa00((ffuunnccttiioonn))
       ttrraammppoolliinnee__rr__ddaattaa11((ffuunnccttiioonn))

DDEESSCCRRIIPPTTIIOONN
       These  functions implement _c_l_o_s_u_r_e_s as first-class C func-
       tions.  A closure consists of a regular C function  and  a
       piece of data which gets passed to the C function when the
       closure is called.

       Closures as _f_i_r_s_t_-_c_l_a_s_s _C _f_u_n_c_t_i_o_n_s means  that  they  fit
       into a function pointer and can be called exactly like any
       other C function.  _f_u_n_c_t_i_o_n ==  aalllloocc__ttrraammppoolliinnee__rr((_a_d_d_r_e_s_s,,
       _d_a_t_a_0,,  _d_a_t_a_1))  allocates  a  closure.  When _f_u_n_c_t_i_o_n gets
       called, it stores in a special "lexical chain register"  a
       pointer  to  a  storage area containing _d_a_t_a_0 in its first
       word and _d_a_t_a_1 in its second word and calls the C function
       at  _a_d_d_r_e_s_s.   The  function at _a_d_d_r_e_s_s is responsible for
       fetching _d_a_t_a_0 and _d_a_t_a_1 off the pointer.  Note  that  the
       "lexical  chain register" is a call-used register, i.e. is
       clobbered by function calls.

       This is much like ggcccc's local functions, except  that  the
       GNU  C local functions have dynamic extent (i.e. are deal-
       located when the creating function returns), while _t_r_a_m_p_o_-
       _l_i_n_e  provides  functions with indefinite extent: _f_u_n_c_t_i_o_n
       is only deallocated  when  ffrreeee__ttrraammppoolliinnee__rr((_f_u_n_c_t_i_o_n))  is
       called.

       iiss__ttrraammppoolliinnee__rr((_f_u_n_c_t_i_o_n))  checks  whether  the C function
       _f_u_n_c_t_i_o_n was produced by a call to _a_l_l_o_c___t_r_a_m_p_o_l_i_n_e___r.  If
       this  returns  true,  the arguments given to _a_l_l_o_c___t_r_a_m_p_o_-
       _l_i_n_e___r can be retrieved:

           ttrraammppoolliinnee__rr__aaddddrreessss((_f_u_n_c_t_i_o_n)) returns _a_d_d_r_e_s_s,

           ttrraammppoolliinnee__rr__ddaattaa00((_f_u_n_c_t_i_o_n)) returns _d_a_t_a_0,

           ttrraammppoolliinnee__rr__ddaattaa11((_f_u_n_c_t_i_o_n)) returns _d_a_t_a_1.


SSEEEE AALLSSOO
       ttrraammppoolliinnee(3), ggcccc(1), vvaarraarrggss(3)



                         22 October 1997                        1





TRAMPOLINE(3)                                       TRAMPOLINE(3)


PPOORRTTIINNGG
       The way ggcccc builds local functions is described in the gcc
       source, file gcc-2.6.3/config/_c_p_u/_c_p_u.h.


AAUUTTHHOORR
       Bruno Haible <bruno@clisp.org>


AACCKKNNOOWWLLEEDDGGEEMMEENNTTSS
       Many ideas were cribbed from the gcc source.














































                         22 October 1997                        2