File: trampoline.html

package info (click to toggle)
ffcall 2.5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,024 kB
  • sloc: asm: 100,607; ansic: 50,932; sh: 5,630; makefile: 1,588; cpp: 2
file content (144 lines) | stat: -rw-r--r-- 4,752 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<HTML>
<HEAD>
<!--
Copyright (C) 1995-2017 Bruno Haible

This manual is free documentation.  It is dually licensed under the
GNU FDL and the GNU GPL.  This means that you can redistribute this
manual under either of these two licenses, at your choice.

This manual is covered by the GNU FDL.  Permission is granted to copy,
distribute and/or modify this document under the terms of the
GNU Free Documentation License (FDL), either version 1.2 of the
License, or (at your option) any later version published by the
Free Software Foundation (FSF); with no Invariant Sections, with no
Front-Cover Text, and with no Back-Cover Texts.
A copy of the license is at <https://www.gnu.org/licenses/old-licenses/fdl-1.2>.

This manual is covered by the GNU GPL.  You can redistribute it and/or
modify it under the terms of the GNU General Public License (GPL), either
version 2 of the License, or (at your option) any later version published
by the Free Software Foundation (FSF).
A copy of the license is at <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
-->
<TITLE> TRAMPOLINE manual page </TITLE>
</HEAD>
<BODY>
<H1>TRAMPOLINE manual page</H1>

<UL>
<LI> <A HREF="#Name">Name</A>
<LI> <A HREF="#Synopsis">Synopsis</A>
<LI> <A HREF="#Description">Description</A>
<LI> <A HREF="#See also">See also</A>
<LI> <A HREF="#Bugs">Bugs</A>
<LI> <A HREF="#Porting">Porting</A>
<LI> <A HREF="#Author">Author</A>
<LI> <A HREF="#Acknowledgements">Acknowledgements</A>
</UL>
<P>

<HR>

<A NAME="Name">
<H2>Name</H2>
</A>

trampoline -  closures as first-class C functions

<A NAME="Synopsis">
<H2>Synopsis</H2>
</A>

<PRE>
<CODE>#include &lt;trampoline.h&gt;</CODE>
<CODE><VAR>function</VAR> = alloc_trampoline(<VAR>address</VAR>, <VAR>variable</VAR>, <VAR>data</VAR>);</CODE>
<CODE>free_trampoline(<VAR>function</VAR>);</CODE>
<CODE>is_trampoline(<VAR>function</VAR>)</CODE>
<CODE>trampoline_address(<VAR>function</VAR>)</CODE>
<CODE>trampoline_variable(<VAR>function</VAR>)</CODE>
<CODE>trampoline_data(<VAR>function</VAR>)</CODE>
</PRE>

<A NAME="Description">
<H2>Description</H2>
</A>

These  functions implement <EM>closures</EM>  as first-class
C functions.  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.
<P>
Closures as <EM>first-class C functions</EM> means  that  they  fit
into  a  function  pointer  and can be called exactly like any
other C function.
<CODE><VAR>function</VAR> = alloc_trampoline(<VAR>address</VAR>, <VAR>variable</VAR>, <VAR>data</VAR>)</CODE>
allocates  a closure.
When <VAR>function</VAR>  gets  called,  it  stores
<VAR>data</VAR>  in the variable <VAR>variable</VAR>
 and calls the C function at <VAR>address</VAR>.
The  function  at <VAR>address</VAR>  is  responsible  for
fetching <VAR>data</VAR>  out of <VAR>variable</VAR>
 immediately, before execution of any other function call.
<P>
This is much like gcc's local functions, except  that  the
GNU  C local functions have dynamic extent (i.e. are
deallocated when the creating function returns), while <EM>trampoline</EM>
  provides  functions with indefinite extent: <CODE><VAR>function</VAR></CODE>
is  only  deallocated  when  <CODE>free_trampoline(<VAR>function</VAR>)</CODE>  is
called.
<P>
<CODE>is_trampoline(<VAR>function</VAR>)</CODE>
checks  whether  the  C  function <CODE><VAR>function</VAR></CODE>
was  produced by a call to <CODE>alloc_trampoline</CODE>.
If this returns true, the arguments given to <CODE>alloc_trampoline</CODE>
can  be  retrieved:
<UL>
<LI> <CODE>trampoline_address(<VAR>function</VAR>)</CODE> returns <VAR>address</VAR>,
<LI> <CODE>trampoline_variable(<VAR>function</VAR>)</CODE> returns <VAR>variable</VAR>,
<LI> <CODE>trampoline_data(<VAR>function</VAR>)</CODE> returns <VAR>data</VAR>.
</UL>

<A NAME="See also">
<H2>See also</H2>
</A>
<A HREF="gcc(1)"><CODE><B>gcc</B></CODE></A>(1), <A HREF="stdarg(3)"><CODE><B>stdarg</B></CODE></A>(3), <A HREF="callback(3)"><CODE><B>callback</B></CODE></A>(3)

<A NAME="Bugs">
<H2>Bugs</H2>
</A>

Passing  the  data  through a global variable is not reentrant. Don't
call trampoline functions from within  signal
handlers. This is fixed in the <A HREF="callback(3)"><CODE><B>callback</B></CODE></A>(3) package.

<A NAME="Porting">
<H2>Porting</H2>
</A>

The way gcc builds local functions is described in the gcc
source, file <SAMP>gcc-2.6.3/config/<VAR>cpu</VAR>/<VAR>cpu</VAR>.h</SAMP>.

<A NAME="Author">
<H2>Author</H2>
</A>

Bruno Haible &lt;bruno@clisp.org&gt;

<A NAME="Acknowledgements">
<H2>Acknowledgements</H2>
</A>

Many ideas were cribbed from the gcc source.
<P>

<HR>

<ADDRESS>TRAMPOLINE manual page<BR>
Bruno Haible &lt;bruno@clisp.org&gt;
</ADDRESS>
<P>
Last modified: 1 January 2017.

</BODY>
</HTML>