Artifact
49499e759b52ca3ce1edfaa2074d2030d205ef48:
0000: 2e 54 48 20 54 52 41 4d 50 4f 4c 49 4e 45 20 33 .TH TRAMPOLINE 3
0010: 20 22 32 32 20 4f 63 74 6f 62 65 72 20 31 39 39 "22 October 199
0020: 37 22 0a 2e 53 48 20 4e 41 4d 45 0a 74 72 61 6d 7"..SH NAME.tram
0030: 70 6f 6c 69 6e 65 20 5c 2d 20 63 6c 6f 73 75 72 poline \- closur
0040: 65 73 20 61 73 20 66 69 72 73 74 2d 63 6c 61 73 es as first-clas
0050: 73 20 43 20 66 75 6e 63 74 69 6f 6e 73 0a 2e 53 s C functions..S
0060: 48 20 53 59 4e 4f 50 53 49 53 0a 2e 42 20 23 69 H SYNOPSIS..B #i
0070: 6e 63 6c 75 64 65 20 3c 74 72 61 6d 70 6f 6c 69 nclude <trampoli
0080: 6e 65 5f 72 2e 68 3e 0a 2e 4c 50 0a 2e 42 20 66 ne_r.h>..LP..B f
0090: 75 6e 63 74 69 6f 6e 20 3d 20 61 6c 6c 6f 63 5f unction = alloc_
00a0: 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 28 61 64 64 trampoline_r(add
00b0: 72 65 73 73 2c 20 64 61 74 61 30 2c 20 64 61 74 ress, data0, dat
00c0: 61 31 29 3b 0a 2e 4c 50 0a 2e 42 20 66 72 65 65 a1);..LP..B free
00d0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 28 66 75 _trampoline_r(fu
00e0: 6e 63 74 69 6f 6e 29 3b 0a 2e 4c 50 0a 2e 6e 66 nction);..LP..nf
00f0: 0a 2e 42 20 69 73 5f 74 72 61 6d 70 6f 6c 69 6e ..B is_trampolin
0100: 65 5f 72 28 66 75 6e 63 74 69 6f 6e 29 0a 2e 42 e_r(function)..B
0110: 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f 61 64 trampoline_r_ad
0120: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 0a dress(function).
0130: 2e 42 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f .B trampoline_r_
0140: 64 61 74 61 30 28 66 75 6e 63 74 69 6f 6e 29 0a data0(function).
0150: 2e 42 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f .B trampoline_r_
0160: 64 61 74 61 31 28 66 75 6e 63 74 69 6f 6e 29 0a data1(function).
0170: 2e 66 69 0a 2e 53 48 20 44 45 53 43 52 49 50 54 .fi..SH DESCRIPT
0180: 49 4f 4e 0a 2e 4c 50 0a 54 68 65 73 65 20 66 75 ION..LP.These fu
0190: 6e 63 74 69 6f 6e 73 20 69 6d 70 6c 65 6d 65 6e nctions implemen
01a0: 74 0a 2e 49 20 63 6c 6f 73 75 72 65 73 0a 61 73 t..I closures.as
01b0: 20 66 69 72 73 74 2d 63 6c 61 73 73 20 43 20 66 first-class C f
01c0: 75 6e 63 74 69 6f 6e 73 2e 0a 41 20 63 6c 6f 73 unctions..A clos
01d0: 75 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 ure consists of
01e0: 61 20 72 65 67 75 6c 61 72 20 43 20 66 75 6e 63 a regular C func
01f0: 74 69 6f 6e 20 61 6e 64 20 61 20 70 69 65 63 65 tion and a piece
0200: 20 6f 66 20 64 61 74 61 0a 77 68 69 63 68 20 67 of data.which g
0210: 65 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 ets passed to th
0220: 65 20 43 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 e C function whe
0230: 6e 20 74 68 65 20 63 6c 6f 73 75 72 65 20 69 73 n the closure is
0240: 20 63 61 6c 6c 65 64 2e 0a 0a 43 6c 6f 73 75 72 called...Closur
0250: 65 73 20 61 73 0a 2e 49 20 66 69 72 73 74 2d 63 es as..I first-c
0260: 6c 61 73 73 20 43 20 66 75 6e 63 74 69 6f 6e 73 lass C functions
0270: 0a 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 79 .means that they
0280: 20 66 69 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 fit into a func
0290: 74 69 6f 6e 0a 70 6f 69 6e 74 65 72 20 61 6e 64 tion.pointer and
02a0: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 65 can be called e
02b0: 78 61 63 74 6c 79 20 6c 69 6b 65 20 61 6e 79 20 xactly like any
02c0: 6f 74 68 65 72 20 43 20 66 75 6e 63 74 69 6f 6e other C function
02d0: 2e 0a 2e 49 42 20 66 75 6e 63 74 69 6f 6e 20 22 ...IB function "
02e0: 20 3d 20 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c = alloc_trampol
02f0: 69 6e 65 5f 72 28 22 20 61 64 64 72 65 73 73 20 ine_r(" address
0300: 22 2c 20 22 20 64 61 74 61 30 20 22 2c 20 22 20 ", " data0 ", "
0310: 64 61 74 61 31 20 22 29 22 0a 61 6c 6c 6f 63 61 data1 ")".alloca
0320: 74 65 73 20 61 20 63 6c 6f 73 75 72 65 2e 20 57 tes a closure. W
0330: 68 65 6e 0a 2e 49 20 66 75 6e 63 74 69 6f 6e 0a hen..I function.
0340: 67 65 74 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 gets called, it
0350: 73 74 6f 72 65 73 20 69 6e 20 61 20 73 70 65 63 stores in a spec
0360: 69 61 6c 20 22 6c 65 78 69 63 61 6c 20 63 68 61 ial "lexical cha
0370: 69 6e 20 72 65 67 69 73 74 65 72 22 20 61 20 70 in register" a p
0380: 6f 69 6e 74 65 72 20 74 6f 20 61 0a 73 74 6f 72 ointer to a.stor
0390: 61 67 65 20 61 72 65 61 20 63 6f 6e 74 61 69 6e age area contain
03a0: 69 6e 67 0a 2e 49 20 64 61 74 61 30 0a 69 6e 20 ing..I data0.in
03b0: 69 74 73 20 66 69 72 73 74 20 77 6f 72 64 20 61 its first word a
03c0: 6e 64 0a 2e 49 20 64 61 74 61 31 0a 69 6e 20 69 nd..I data1.in i
03d0: 74 73 20 73 65 63 6f 6e 64 20 77 6f 72 64 20 61 ts second word a
03e0: 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 43 20 66 nd calls the C f
03f0: 75 6e 63 74 69 6f 6e 20 61 74 0a 2e 49 52 20 61 unction at..IR a
0400: 64 64 72 65 73 73 20 2e 0a 54 68 65 20 66 75 6e ddress ..The fun
0410: 63 74 69 6f 6e 20 61 74 0a 2e 49 20 61 64 64 72 ction at..I addr
0420: 65 73 73 0a 69 73 20 72 65 73 70 6f 6e 73 69 62 ess.is responsib
0430: 6c 65 20 66 6f 72 20 66 65 74 63 68 69 6e 67 0a le for fetching.
0440: 2e 49 20 64 61 74 61 30 0a 61 6e 64 0a 2e 49 20 .I data0.and..I
0450: 64 61 74 61 31 0a 6f 66 66 20 74 68 65 20 70 6f data1.off the po
0460: 69 6e 74 65 72 2e 20 4e 6f 74 65 20 74 68 61 74 inter. Note that
0470: 20 74 68 65 20 22 6c 65 78 69 63 61 6c 20 63 68 the "lexical ch
0480: 61 69 6e 20 72 65 67 69 73 74 65 72 22 20 69 73 ain register" is
0490: 20 61 20 63 61 6c 6c 2d 75 73 65 64 0a 72 65 67 a call-used.reg
04a0: 69 73 74 65 72 2c 20 69 2e 65 2e 20 69 73 20 63 ister, i.e. is c
04b0: 6c 6f 62 62 65 72 65 64 20 62 79 20 66 75 6e 63 lobbered by func
04c0: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 0a 54 68 69 tion calls...Thi
04d0: 73 20 69 73 20 6d 75 63 68 20 6c 69 6b 65 0a 2e s is much like..
04e0: 42 52 20 67 63 63 20 22 27 73 22 0a 6c 6f 63 61 BR gcc "'s".loca
04f0: 6c 20 66 75 6e 63 74 69 6f 6e 73 2c 20 65 78 63 l functions, exc
0500: 65 70 74 20 74 68 61 74 20 74 68 65 20 47 4e 55 ept that the GNU
0510: 20 43 20 6c 6f 63 61 6c 20 66 75 6e 63 74 69 6f C local functio
0520: 6e 73 20 68 61 76 65 20 64 79 6e 61 6d 69 63 20 ns have dynamic
0530: 65 78 74 65 6e 74 0a 28 69 2e 65 2e 20 61 72 65 extent.(i.e. are
0540: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 77 68 65 deallocated whe
0550: 6e 20 74 68 65 20 63 72 65 61 74 69 6e 67 20 66 n the creating f
0560: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 29 unction returns)
0570: 2c 20 77 68 69 6c 65 0a 2e 49 20 74 72 61 6d 70 , while..I tramp
0580: 6f 6c 69 6e 65 0a 70 72 6f 76 69 64 65 73 20 66 oline.provides f
0590: 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 69 6e unctions with in
05a0: 64 65 66 69 6e 69 74 65 20 65 78 74 65 6e 74 3a definite extent:
05b0: 0a 2e 49 20 66 75 6e 63 74 69 6f 6e 0a 69 73 20 ..I function.is
05c0: 6f 6e 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 only deallocated
05d0: 20 77 68 65 6e 0a 2e 42 49 20 66 72 65 65 5f 74 when..BI free_t
05e0: 72 61 6d 70 6f 6c 69 6e 65 5f 72 28 20 66 75 6e rampoline_r( fun
05f0: 63 74 69 6f 6e 20 29 0a 69 73 20 63 61 6c 6c 65 ction ).is calle
0600: 64 2e 0a 0a 2e 42 49 20 22 69 73 5f 74 72 61 6d d....BI "is_tram
0610: 70 6f 6c 69 6e 65 5f 72 28 22 20 66 75 6e 63 74 poline_r(" funct
0620: 69 6f 6e 20 22 29 22 0a 63 68 65 63 6b 73 20 77 ion ")".checks w
0630: 68 65 74 68 65 72 20 74 68 65 20 43 20 66 75 6e hether the C fun
0640: 63 74 69 6f 6e 0a 2e 49 20 66 75 6e 63 74 69 6f ction..I functio
0650: 6e 0a 77 61 73 20 70 72 6f 64 75 63 65 64 20 62 n.was produced b
0660: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2e 49 52 20 y a call to..IR
0670: 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69 6e 65 alloc_trampoline
0680: 5f 72 20 2e 0a 49 66 20 74 68 69 73 20 72 65 74 _r ..If this ret
0690: 75 72 6e 73 20 74 72 75 65 2c 20 74 68 65 20 61 urns true, the a
06a0: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 74 rguments given t
06b0: 6f 0a 2e 49 20 61 6c 6c 6f 63 5f 74 72 61 6d 70 o..I alloc_tramp
06c0: 6f 6c 69 6e 65 5f 72 0a 63 61 6e 20 62 65 20 72 oline_r.can be r
06d0: 65 74 72 69 65 76 65 64 3a 0a 2e 52 53 20 34 0a etrieved:..RS 4.
06e0: 2e 4c 50 0a 2e 42 49 20 22 74 72 61 6d 70 6f 6c .LP..BI "trampol
06f0: 69 6e 65 5f 72 5f 61 64 64 72 65 73 73 28 22 20 ine_r_address("
0700: 66 75 6e 63 74 69 6f 6e 20 22 29 22 0a 72 65 74 function ")".ret
0710: 75 72 6e 73 0a 2e 49 52 20 61 64 64 72 65 73 73 urns..IR address
0720: 20 2c 0a 2e 4c 50 0a 2e 42 49 20 22 74 72 61 6d ,..LP..BI "tram
0730: 70 6f 6c 69 6e 65 5f 72 5f 64 61 74 61 30 28 22 poline_r_data0("
0740: 20 66 75 6e 63 74 69 6f 6e 20 22 29 22 0a 72 65 function ")".re
0750: 74 75 72 6e 73 0a 2e 49 52 20 64 61 74 61 30 20 turns..IR data0
0760: 2c 0a 2e 4c 50 0a 2e 42 49 20 22 74 72 61 6d 70 ,..LP..BI "tramp
0770: 6f 6c 69 6e 65 5f 72 5f 64 61 74 61 31 28 22 20 oline_r_data1("
0780: 66 75 6e 63 74 69 6f 6e 20 22 29 22 0a 72 65 74 function ")".ret
0790: 75 72 6e 73 0a 2e 49 52 20 64 61 74 61 31 20 2e urns..IR data1 .
07a0: 0a 2e 52 45 0a 0a 2e 53 48 20 53 45 45 20 41 4c ..RE...SH SEE AL
07b0: 53 4f 0a 2e 42 52 20 74 72 61 6d 70 6f 6c 69 6e SO..BR trampolin
07c0: 65 20 28 33 29 2c 0a 2e 42 52 20 67 63 63 20 28 e (3),..BR gcc (
07d0: 31 29 2c 0a 2e 42 52 20 76 61 72 61 72 67 73 20 1),..BR varargs
07e0: 28 33 29 0a 0a 2e 53 48 20 50 4f 52 54 49 4e 47 (3)...SH PORTING
07f0: 0a 54 68 65 20 77 61 79 0a 2e 42 20 67 63 63 0a .The way..B gcc.
0800: 62 75 69 6c 64 73 20 6c 6f 63 61 6c 20 66 75 6e builds local fun
0810: 63 74 69 6f 6e 73 20 69 73 20 64 65 73 63 72 69 ctions is descri
0820: 62 65 64 20 69 6e 20 74 68 65 20 67 63 63 20 73 bed in the gcc s
0830: 6f 75 72 63 65 2c 20 66 69 6c 65 0a 2e 52 49 20 ource, file..RI
0840: 67 63 63 2d 32 2e 36 2e 33 2f 63 6f 6e 66 69 67 gcc-2.6.3/config
0850: 2f 20 63 70 75 20 2f 20 63 70 75 20 2e 68 2e 0a / cpu / cpu .h..
0860: 0a 2e 53 48 20 41 55 54 48 4f 52 0a 0a 42 72 75 ..SH AUTHOR..Bru
0870: 6e 6f 20 48 61 69 62 6c 65 20 3c 62 72 75 6e 6f no Haible <bruno
0880: 40 63 6c 69 73 70 2e 6f 72 67 3e 0a 0a 2e 53 48 @clisp.org>...SH
0890: 20 41 43 4b 4e 4f 57 4c 45 44 47 45 4d 45 4e 54 ACKNOWLEDGEMENT
08a0: 53 0a 0a 4d 61 6e 79 20 69 64 65 61 73 20 77 65 S..Many ideas we
08b0: 72 65 20 63 72 69 62 62 65 64 20 66 72 6f 6d 20 re cribbed from
08c0: 74 68 65 20 67 63 63 20 73 6f 75 72 63 65 2e 0a the gcc source..
08d0: 0a .