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                                               .