ext_ffi_api.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <title>ffi.* API Functions</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <meta name="Author" content="Mike Pall">
  7. <meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
  8. <meta name="Language" content="en">
  9. <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
  10. <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
  11. <style type="text/css">
  12. table.abitable { width: 30em; line-height: 1.2; }
  13. tr.abihead td { font-weight: bold; }
  14. td.abiparam { font-weight: bold; width: 6em; }
  15. </style>
  16. </head>
  17. <body>
  18. <div id="site">
  19. <a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
  20. </div>
  21. <div id="head">
  22. <h1><tt>ffi.*</tt> API Functions</h1>
  23. </div>
  24. <div id="nav">
  25. <ul><li>
  26. <a href="luajit.html">LuaJIT</a>
  27. <ul><li>
  28. <a href="install.html">Installation</a>
  29. </li><li>
  30. <a href="running.html">Running</a>
  31. </li></ul>
  32. </li><li>
  33. <a href="extensions.html">Extensions</a>
  34. <ul><li>
  35. <a href="ext_ffi.html">FFI Library</a>
  36. <ul><li>
  37. <a href="ext_ffi_tutorial.html">FFI Tutorial</a>
  38. </li><li>
  39. <a class="current" href="ext_ffi_api.html">ffi.* API</a>
  40. </li><li>
  41. <a href="ext_ffi_int64.html">64 bit Integers</a>
  42. </li><li>
  43. <a href="ext_ffi_semantics.html">FFI Semantics</a>
  44. </li></ul>
  45. </li><li>
  46. <a href="ext_jit.html">jit.* Library</a>
  47. </li><li>
  48. <a href="ext_c_api.html">Lua/C API</a>
  49. </li></ul>
  50. </li><li>
  51. <a href="status.html">Status</a>
  52. <ul><li>
  53. <a href="changes.html">Changes</a>
  54. </li></ul>
  55. </li><li>
  56. <a href="faq.html">FAQ</a>
  57. </li><li>
  58. <a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
  59. </li><li>
  60. <a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
  61. </li></ul>
  62. </div>
  63. <div id="main">
  64. <p>
  65. This page describes the API functions provided by the FFI library in
  66. detail. It's recommended to read through the
  67. <a href="ext_ffi.html">introduction</a> and the
  68. <a href="ext_ffi_tutorial.html">FFI tutorial</a> first.
  69. </p>
  70. <h2 id="glossary">Glossary</h2>
  71. <ul>
  72. <li><b>cdecl</b> &mdash; An abstract C&nbsp;type declaration (a Lua
  73. string).</li>
  74. <li><b>ctype</b> &mdash; A C&nbsp;type object. This is a special kind of
  75. <b>cdata</b> returned by <tt>ffi.typeof()</tt>. It serves as a
  76. <b>cdata</b> <a href="#ffi_new">constructor</a> when called.</li>
  77. <li><b>cdata</b> &mdash; A C&nbsp;data object. It holds a value of the
  78. corresponding <b>ctype</b>.</li>
  79. <li><b>ct</b> &mdash; A C&nbsp;type specification which can be used for
  80. most of the API functions. Either a <b>cdecl</b>, a <b>ctype</b> or a
  81. <b>cdata</b> serving as a template type.</li>
  82. <li><b>VLA</b> &mdash; A variable-length array is declared with a
  83. <tt>?</tt> instead of the number of elements, e.g. <tt>"int[?]"</tt>.
  84. The number of elements (<tt>nelem</tt>) must be given when it's
  85. <a href="#ffi_new">created</a>.</li>
  86. <li><b>VLS</b> &mdash; A variable-length struct is a <tt>struct</tt> C
  87. type where the last element is a <b>VLA</b>. The same rules for
  88. declaration and creation apply.</li>
  89. </ul>
  90. <h2 id="decl">Declaring and Accessing External Symbols</h2>
  91. <p>
  92. External symbols must be declared first and can then be accessed by
  93. indexing a <a href="ext_ffi_semantics.html#clib">C&nbsp;library
  94. namespace</a>, which automatically binds the symbol to a specific
  95. library.
  96. </p>
  97. <h3 id="ffi_cdef"><tt>ffi.cdef(def)</tt></h3>
  98. <p>
  99. Adds multiple C&nbsp;declarations for types or external symbols (named
  100. variables or functions). <tt>def</tt> must be a Lua string. It's
  101. recommended to use the syntactic sugar for string arguments as
  102. follows:
  103. </p>
  104. <pre class="code">
  105. ffi.cdef[[
  106. <span style="color:#00a000;font-weight:bold;">typedef struct foo { int a, b; } foo_t; // Declare a struct and typedef.
  107. int dofoo(foo_t *f, int n); /* Declare an external C function. */</span>
  108. ]]
  109. </pre>
  110. <p>
  111. The contents of the string (the part in green above) must be a
  112. sequence of
  113. <a href="ext_ffi_semantics.html#clang">C&nbsp;declarations</a>,
  114. separated by semicolons. The trailing semicolon for a single
  115. declaration may be omitted.
  116. </p>
  117. <p>
  118. Please note that external symbols are only <em>declared</em>, but they
  119. are <em>not bound</em> to any specific address, yet. Binding is
  120. achieved with C&nbsp;library namespaces (see below).
  121. </p>
  122. <p style="color: #c00000;">
  123. C&nbsp;declarations are not passed through a C&nbsp;pre-processor,
  124. yet. No pre-processor tokens are allowed, except for
  125. <tt>#pragma&nbsp;pack</tt>. Replace <tt>#define</tt> in existing
  126. C&nbsp;header files with <tt>enum</tt>, <tt>static&nbsp;const</tt>
  127. or <tt>typedef</tt> and/or pass the files through an external
  128. C&nbsp;pre-processor (once). Be careful not to include unneeded or
  129. redundant declarations from unrelated header files.
  130. </p>
  131. <h3 id="ffi_C"><tt>ffi.C</tt></h3>
  132. <p>
  133. This is the default C&nbsp;library namespace &mdash; note the
  134. uppercase <tt>'C'</tt>. It binds to the default set of symbols or
  135. libraries on the target system. These are more or less the same as a
  136. C&nbsp;compiler would offer by default, without specifying extra link
  137. libraries.
  138. </p>
  139. <p>
  140. On POSIX systems, this binds to symbols in the default or global
  141. namespace. This includes all exported symbols from the executable and
  142. any libraries loaded into the global namespace. This includes at least
  143. <tt>libc</tt>, <tt>libm</tt>, <tt>libdl</tt> (on Linux),
  144. <tt>libgcc</tt> (if compiled with GCC), as well as any exported
  145. symbols from the Lua/C&nbsp;API provided by LuaJIT itself.
  146. </p>
  147. <p>
  148. On Windows systems, this binds to symbols exported from the
  149. <tt>*.exe</tt>, the <tt>lua51.dll</tt> (i.e. the Lua/C&nbsp;API
  150. provided by LuaJIT itself), the C&nbsp;runtime library LuaJIT was linked
  151. with (<tt>msvcrt*.dll</tt>), <tt>kernel32.dll</tt>,
  152. <tt>user32.dll</tt> and <tt>gdi32.dll</tt>.
  153. </p>
  154. <h3 id="ffi_load"><tt>clib = ffi.load(name [,global])</tt></h3>
  155. <p>
  156. This loads the dynamic library given by <tt>name</tt> and returns
  157. a new C&nbsp;library namespace which binds to its symbols. On POSIX
  158. systems, if <tt>global</tt> is <tt>true</tt>, the library symbols are
  159. loaded into the global namespace, too.
  160. </p>
  161. <p>
  162. If <tt>name</tt> is a path, the library is loaded from this path.
  163. Otherwise <tt>name</tt> is canonicalized in a system-dependent way and
  164. searched in the default search path for dynamic libraries:
  165. </p>
  166. <p>
  167. On POSIX systems, if the name contains no dot, the extension
  168. <tt>.so</tt> is appended. Also, the <tt>lib</tt> prefix is prepended
  169. if necessary. So <tt>ffi.load("z")</tt> looks for <tt>"libz.so"</tt>
  170. in the default shared library search path.
  171. </p>
  172. <p>
  173. On Windows systems, if the name contains no dot, the extension
  174. <tt>.dll</tt> is appended. So <tt>ffi.load("ws2_32")</tt> looks for
  175. <tt>"ws2_32.dll"</tt> in the default DLL search path.
  176. </p>
  177. <h2 id="create">Creating cdata Objects</h2>
  178. <p>
  179. The following API functions create cdata objects (<tt>type()</tt>
  180. returns <tt>"cdata"</tt>). All created cdata objects are
  181. <a href="ext_ffi_semantics.html#gc">garbage collected</a>.
  182. </p>
  183. <h3 id="ffi_new"><tt>cdata = ffi.new(ct [,nelem] [,init...])<br>
  184. cdata = <em>ctype</em>([nelem,] [init...])</tt></h3>
  185. <p>
  186. Creates a cdata object for the given <tt>ct</tt>. VLA/VLS types
  187. require the <tt>nelem</tt> argument. The second syntax uses a ctype as
  188. a constructor and is otherwise fully equivalent.
  189. </p>
  190. <p>
  191. The cdata object is initialized according to the
  192. <a href="ext_ffi_semantics.html#init">rules for initializers</a>,
  193. using the optional <tt>init</tt> arguments. Excess initializers cause
  194. an error.
  195. </p>
  196. <p>
  197. Performance notice: if you want to create many objects of one kind,
  198. parse the cdecl only once and get its ctype with
  199. <tt>ffi.typeof()</tt>. Then use the ctype as a constructor repeatedly.
  200. </p>
  201. <p style="font-size: 8pt;">
  202. Please note that an anonymous <tt>struct</tt> declaration implicitly
  203. creates a new and distinguished ctype every time you use it for
  204. <tt>ffi.new()</tt>. This is probably <b>not</b> what you want,
  205. especially if you create more than one cdata object. Different anonymous
  206. <tt>structs</tt> are not considered assignment-compatible by the
  207. C&nbsp;standard, even though they may have the same fields! Also, they
  208. are considered different types by the JIT-compiler, which may cause an
  209. excessive number of traces. It's strongly suggested to either declare
  210. a named <tt>struct</tt> or <tt>typedef</tt> with <tt>ffi.cdef()</tt>
  211. or to create a single ctype object for an anonymous <tt>struct</tt>
  212. with <tt>ffi.typeof()</tt>.
  213. </p>
  214. <h3 id="ffi_typeof"><tt>ctype = ffi.typeof(ct)</tt></h3>
  215. <p>
  216. Creates a ctype object for the given <tt>ct</tt>.
  217. </p>
  218. <p>
  219. This function is especially useful to parse a cdecl only once and then
  220. use the resulting ctype object as a <a href="#ffi_new">constructor</a>.
  221. </p>
  222. <h3 id="ffi_cast"><tt>cdata = ffi.cast(ct, init)</tt></h3>
  223. <p>
  224. Creates a scalar cdata object for the given <tt>ct</tt>. The cdata
  225. object is initialized with <tt>init</tt> using the "cast" variant of
  226. the <a href="ext_ffi_semantics.html#convert">C&nbsp;type conversion
  227. rules</a>.
  228. </p>
  229. <p>
  230. This functions is mainly useful to override the pointer compatibility
  231. rules or to convert pointers to addresses or vice versa. For maximum
  232. portability you should convert a pointer to its address as follows:
  233. </p>
  234. <pre class="code">
  235. local addr = tonumber(ffi.cast("intptr_t", ptr))
  236. </pre>
  237. <h2 id="info">C&nbsp;Type Information</h2>
  238. <p>
  239. The following API functions return information about C&nbsp;types.
  240. They are most useful for inspecting cdata objects.
  241. </p>
  242. <h3 id="ffi_sizeof"><tt>size = ffi.sizeof(ct [,nelem])</tt></h3>
  243. <p>
  244. Returns the size of <tt>ct</tt> in bytes. Returns <tt>nil</tt> if
  245. the size is not known (e.g. for <tt>"void"</tt> or function types).
  246. Requires <tt>nelem</tt> for VLA/VLS types, except for cdata objects.
  247. </p>
  248. <h3 id="ffi_alignof"><tt>align = ffi.alignof(ct)</tt></h3>
  249. <p>
  250. Returns the minimum required alignment for <tt>ct</tt> in bytes.
  251. </p>
  252. <h3 id="ffi_offsetof"><tt>ofs [,bpos,bsize] = ffi.offsetof(ct, field)</tt></h3>
  253. <p>
  254. Returns the offset (in bytes) of <tt>field</tt> relative to the start
  255. of <tt>ct</tt>, which must be a <tt>struct</tt>. Additionally returns
  256. the position and the field size (in bits) for bit fields.
  257. </p>
  258. <h2 id="util">Utility Functions</h2>
  259. <h3 id="ffi_string"><tt>str = ffi.string(ptr [,len])</tt></h3>
  260. <p>
  261. Creates an interned Lua string from the data pointed to by
  262. <tt>ptr</tt>.
  263. </p>
  264. <p>
  265. If the optional argument <tt>len</tt> is missing, <tt>ptr</tt> is
  266. converted to a <tt>"char&nbsp;*"</tt> and the data is assumed to be
  267. zero-terminated. The length of the string is computed with
  268. <tt>strlen()</tt>.
  269. </p>
  270. <p>
  271. Otherwise <tt>ptr</tt> is converted to a <tt>"void&nbsp;*"</tt> and
  272. <tt>len</tt> gives the length of the data. The data may contain
  273. embedded zeros and need not be byte-oriented (though this may cause
  274. endianess issues).
  275. </p>
  276. <p>
  277. This function is mainly useful to convert (temporary)
  278. <tt>"const&nbsp;char&nbsp;*"</tt> pointers returned by
  279. C&nbsp;functions to Lua strings and store them or pass them to other
  280. functions expecting a Lua string. The Lua string is an (interned) copy
  281. of the data and bears no relation to the original data area anymore.
  282. Lua strings are 8&nbsp;bit clean and may be used to hold arbitrary,
  283. non-character data.
  284. </p>
  285. <p>
  286. Performance notice: it's faster to pass the length of the string, if
  287. it's known. E.g. when the length is returned by a C&nbsp;call like
  288. <tt>sprintf()</tt>.
  289. </p>
  290. <h3 id="ffi_copy"><tt>ffi.copy(dst, src, len)<br>
  291. ffi.copy(dst, str)</tt></h3>
  292. <p>
  293. Copies the data pointed to by <tt>src</tt> to <tt>dst</tt>.
  294. <tt>dst</tt> is converted to a <tt>"void&nbsp;*"</tt> and <tt>src</tt>
  295. is converted to a <tt>"const void&nbsp;*"</tt>.
  296. </p>
  297. <p>
  298. In the first syntax, <tt>len</tt> gives the number of bytes to copy.
  299. In case <tt>src</tt> is a Lua string, the maximum copy length is the
  300. number of bytes of the string plus a zero-terminator. Caveat: the
  301. copied data may not be zero-terminated if <tt>len&nbsp;&le;&nbsp;#src</tt>.
  302. </p>
  303. <p>
  304. In the second syntax, the source of the copy must be a Lua string. All
  305. bytes of the string plus a zero-terminator are copied to <tt>dst</tt>.
  306. </p>
  307. <p>
  308. Performance notice: <tt>ffi.copy()</tt> may be used as a faster
  309. (inlineable) replacement for the C&nbsp;library functions
  310. <tt>memcpy()</tt>, <tt>strcpy()</tt> and <tt>strncpy()</tt>.
  311. </p>
  312. <h3 id="ffi_fill"><tt>ffi.fill(dst, len [,c])</tt></h3>
  313. <p>
  314. Fills the data pointed to by <tt>dst</tt> with <tt>len</tt> constant
  315. bytes, given by <tt>c</tt>. If <tt>c</tt> is omitted, the data is
  316. zero-filled.
  317. </p>
  318. <p>
  319. Performance notice: <tt>ffi.fill()</tt> may be used as a faster
  320. (inlineable) replacement for the C&nbsp;library function
  321. <tt>memset(dst,&nbsp;c,&nbsp;len)</tt>. Please note the different
  322. order of arguments!
  323. </p>
  324. <h2 id="target">Target-specific Information</h2>
  325. <h3 id="ffi_abi"><tt>status = ffi.abi(param)</tt></h3>
  326. <p>
  327. Returns <tt>true</tt> if <tt>param</tt> (a Lua string) applies for the
  328. target ABI (Application Binary Interface). Returns <tt>false</tt>
  329. otherwise. The following parameters are currently defined:
  330. </p>
  331. <table class="abitable">
  332. <tr class="abihead">
  333. <td class="abiparam">Parameter</td>
  334. <td class="abidesc">Description</td>
  335. </tr>
  336. <tr class="odd separate">
  337. <td class="abiparam">32bit</td><td class="abidesc">32 bit architecture</td></tr>
  338. <tr class="even">
  339. <td class="abiparam">64bit</td><td class="abidesc">64 bit architecture</td></tr>
  340. <tr class="odd separate">
  341. <td class="abiparam">le</td><td class="abidesc">Little-endian architecture</td></tr>
  342. <tr class="even">
  343. <td class="abiparam">be</td><td class="abidesc">Big-endian architecture</td></tr>
  344. <tr class="odd separate">
  345. <td class="abiparam">fpu</td><td class="abidesc">Target has a hardware FPU</td></tr>
  346. <tr class="even">
  347. <td class="abiparam">softfp</td><td class="abidesc">softfp calling conventions</td></tr>
  348. <tr class="odd">
  349. <td class="abiparam">hardfp</td><td class="abidesc">hardfp calling conventions</td></tr>
  350. <tr class="even separate">
  351. <td class="abiparam">eabi</td><td class="abidesc">EABI variant of the standard ABI</td></tr>
  352. <tr class="odd">
  353. <td class="abiparam">win</td><td class="abidesc">Windows variant of the standard ABI</td></tr>
  354. </table>
  355. <h3 id="ffi_os"><tt>ffi.os</tt></h3>
  356. <p>
  357. Contains the target OS name. Same contents as
  358. <a href="ext_jit.html#jit_os"><tt>jit.os</tt></a>.
  359. </p>
  360. <h3 id="ffi_arch"><tt>ffi.arch</tt></h3>
  361. <p>
  362. Contains the target architecture name. Same contents as
  363. <a href="ext_jit.html#jit_arch"><tt>jit.arch</tt></a>.
  364. </p>
  365. <br class="flush">
  366. </div>
  367. <div id="foot">
  368. <hr class="hide">
  369. Copyright &copy; 2005-2011 Mike Pall
  370. <span class="noprint">
  371. &middot;
  372. <a href="contact.html">Contact</a>
  373. </span>
  374. </div>
  375. </body>
  376. </html>