koffi 1.3.10 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CMakeLists.txt +7 -2
- package/ChangeLog.md +52 -14
- package/README.md +6 -0
- package/build/qemu/2.0.0/koffi_darwin_arm64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_linux_arm32hf.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_openbsd_ia32.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_openbsd_x64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_win32_arm64.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/2.0.0/koffi_win32_x64.tar.gz +0 -0
- package/doc/benchmarks.md +2 -2
- package/doc/changes.md +156 -1
- package/doc/contribute.md +0 -1
- package/doc/dist/doctrees/changes.doctree +0 -0
- package/doc/dist/doctrees/environment.pickle +0 -0
- package/doc/dist/doctrees/functions.doctree +0 -0
- package/doc/dist/doctrees/types.doctree +0 -0
- package/doc/dist/html/_sources/changes.md.txt +156 -1
- package/doc/dist/html/_sources/functions.md.txt +8 -4
- package/doc/dist/html/_sources/types.md.txt +9 -0
- package/doc/dist/html/benchmarks.html +1 -1
- package/doc/dist/html/changes.html +226 -14
- package/doc/dist/html/contribute.html +1 -1
- package/doc/dist/html/functions.html +15 -12
- package/doc/dist/html/genindex.html +1 -1
- package/doc/dist/html/index.html +6 -16
- package/doc/dist/html/memory.html +3 -3
- package/doc/dist/html/objects.inv +0 -0
- package/doc/dist/html/platforms.html +1 -1
- package/doc/dist/html/search.html +1 -1
- package/doc/dist/html/searchindex.js +1 -1
- package/doc/dist/html/start.html +1 -1
- package/doc/dist/html/types.html +11 -3
- package/doc/functions.md +137 -13
- package/doc/types.md +35 -10
- package/package.json +9 -7
- package/qemu/registry/machines.json +5 -5
- package/qemu/registry/sha256sum.txt +16 -16
- package/src/abi_arm32.cc +90 -18
- package/src/abi_arm32_fwd.S +121 -57
- package/src/abi_arm64.cc +90 -18
- package/src/abi_arm64_fwd.S +96 -0
- package/src/abi_arm64_fwd.asm +128 -0
- package/src/abi_riscv64.cc +88 -18
- package/src/abi_riscv64_fwd.S +96 -0
- package/src/abi_x64_sysv.cc +93 -21
- package/src/abi_x64_sysv_fwd.S +96 -0
- package/src/abi_x64_win.cc +88 -18
- package/src/abi_x64_win_fwd.asm +128 -0
- package/src/abi_x86.cc +93 -18
- package/src/abi_x86_fwd.S +96 -0
- package/src/abi_x86_fwd.asm +128 -0
- package/src/call.cc +97 -63
- package/src/call.hh +2 -1
- package/src/ffi.cc +452 -140
- package/src/ffi.hh +23 -9
- package/src/parser.cc +20 -42
- package/src/util.cc +117 -27
- package/src/util.hh +3 -2
- package/test/callbacks.js +54 -8
- package/test/misc.c +30 -15
- package/test/raylib.js +1 -1
- package/test/sqlite.js +24 -16
- package/test/sync.js +43 -33
- package/vendor/libcc/libcc.cc +18 -5
- package/vendor/libcc/libcc.hh +70 -23
- package/build/qemu/1.3.10/koffi_darwin_arm64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_linux_arm32hf.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_openbsd_ia32.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_openbsd_x64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_win32_arm64.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.3.10/koffi_win32_x64.tar.gz +0 -0
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
<li class="toctree-l1"><a class="reference internal" href="platforms">Requirements</a></li>
|
|
166
166
|
<li class="toctree-l1"><a class="reference internal" href="start">Quick start</a></li>
|
|
167
167
|
<li class="toctree-l1"><a class="reference internal" href="types">Data types</a></li>
|
|
168
|
-
<li class="toctree-l1"><a class="reference internal" href="functions">
|
|
168
|
+
<li class="toctree-l1"><a class="reference internal" href="functions">Functions</a></li>
|
|
169
169
|
<li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
|
|
170
170
|
<li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
|
|
171
171
|
<li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
|
|
@@ -205,15 +205,68 @@
|
|
|
205
205
|
<article role="main">
|
|
206
206
|
<section id="changelog">
|
|
207
207
|
<h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this heading">#</a></h1>
|
|
208
|
+
<section id="history">
|
|
209
|
+
<h2>History<a class="headerlink" href="#history" title="Permalink to this heading">#</a></h2>
|
|
210
|
+
<section id="koffi-2-0-0">
|
|
211
|
+
<h3>Koffi 2.0.0<a class="headerlink" href="#koffi-2-0-0" title="Permalink to this heading">#</a></h3>
|
|
212
|
+
<p><strong>Major new features:</strong></p>
|
|
213
|
+
<ul class="simple">
|
|
214
|
+
<li><p>Add disposable types for automatic disposal of C values (such as heap-allocated strings)</p></li>
|
|
215
|
+
<li><p>Add support for registered callbacks, that can be called after FFI call</p></li>
|
|
216
|
+
<li><p>Support named pointer types</p></li>
|
|
217
|
+
<li><p>Support complex type specifications outside of prototype parser</p></li>
|
|
218
|
+
</ul>
|
|
219
|
+
<p><strong>Minor new features:</strong></p>
|
|
220
|
+
<ul class="simple">
|
|
221
|
+
<li><p>Support type aliases with <code class="docutils literal notranslate"><span class="pre">koffi.alias()</span></code></p></li>
|
|
222
|
+
<li><p>Add <code class="docutils literal notranslate"><span class="pre">koffi.resolve()</span></code> to resolve type strings</p></li>
|
|
223
|
+
<li><p>Expose all primitive type aliases in <code class="docutils literal notranslate"><span class="pre">koffi.types</span></code></p></li>
|
|
224
|
+
<li><p>Correctly pass exceptions thrown in JS callbacks</p></li>
|
|
225
|
+
</ul>
|
|
226
|
+
<p><strong>Breaking API changes:</strong></p>
|
|
227
|
+
<ul class="simple">
|
|
228
|
+
<li><p>Change handling of callback types, which must be used through pointers</p></li>
|
|
229
|
+
<li><p>Change handling of opaque handles, which must be used through pointers</p></li>
|
|
230
|
+
<li><p>Support all types in <code class="docutils literal notranslate"><span class="pre">koffi.introspect(type)</span></code></p></li>
|
|
231
|
+
</ul>
|
|
232
|
+
<p>Consult the <a class="reference internal" href="#migration-guide"><span class="std std-doc">migration guide</span></a> for more information.</p>
|
|
233
|
+
</section>
|
|
234
|
+
<section id="koffi-1-3-12">
|
|
235
|
+
<h3>Koffi 1.3.12<a class="headerlink" href="#koffi-1-3-12" title="Permalink to this heading">#</a></h3>
|
|
236
|
+
<p><strong>Main fixes:</strong></p>
|
|
237
|
+
<ul class="simple">
|
|
238
|
+
<li><p>Fix support for Yarn package manager</p></li>
|
|
239
|
+
</ul>
|
|
240
|
+
</section>
|
|
241
|
+
<section id="koffi-1-3-11">
|
|
242
|
+
<h3>Koffi 1.3.11<a class="headerlink" href="#koffi-1-3-11" title="Permalink to this heading">#</a></h3>
|
|
243
|
+
<p><strong>Main fixes:</strong></p>
|
|
244
|
+
<ul class="simple">
|
|
245
|
+
<li><p>Fix broken parsing of <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">*</span></code> when used for first parameter</p></li>
|
|
246
|
+
</ul>
|
|
247
|
+
</section>
|
|
248
|
+
<section id="koffi-1-3-10">
|
|
249
|
+
<h3>Koffi 1.3.10<a class="headerlink" href="#koffi-1-3-10" title="Permalink to this heading">#</a></h3>
|
|
250
|
+
<p><strong>Main fixes:</strong></p>
|
|
251
|
+
<ul class="simple">
|
|
252
|
+
<li><p>Fix support for callbacks with more than 4 parameters on Windows x64</p></li>
|
|
253
|
+
<li><p>Fix support for callbacks with multiple floating-point arguments on ARM32 platforms</p></li>
|
|
254
|
+
<li><p>Fix possibly incorrect conversion for uint32_t callback parameters</p></li>
|
|
255
|
+
</ul>
|
|
256
|
+
<p><strong>Other changes:</strong></p>
|
|
257
|
+
<ul class="simple">
|
|
258
|
+
<li><p>Various documentation fixes and improvements</p></li>
|
|
259
|
+
</ul>
|
|
260
|
+
</section>
|
|
208
261
|
<section id="koffi-1-3-9">
|
|
209
|
-
<
|
|
262
|
+
<h3>Koffi 1.3.9<a class="headerlink" href="#koffi-1-3-9" title="Permalink to this heading">#</a></h3>
|
|
210
263
|
<p><strong>Main fixes:</strong></p>
|
|
211
264
|
<ul class="simple">
|
|
212
265
|
<li><p>Fix prebuild compatibility with Electron on Windows x64</p></li>
|
|
213
266
|
</ul>
|
|
214
267
|
</section>
|
|
215
268
|
<section id="koffi-1-3-8">
|
|
216
|
-
<
|
|
269
|
+
<h3>Koffi 1.3.8<a class="headerlink" href="#koffi-1-3-8" title="Permalink to this heading">#</a></h3>
|
|
217
270
|
<p><strong>Main changes:</strong></p>
|
|
218
271
|
<ul class="simple">
|
|
219
272
|
<li><p>Prevent callback reuse beyond FFI call</p></li>
|
|
@@ -225,7 +278,7 @@
|
|
|
225
278
|
</ul>
|
|
226
279
|
</section>
|
|
227
280
|
<section id="koffi-1-3-7">
|
|
228
|
-
<
|
|
281
|
+
<h3>Koffi 1.3.7<a class="headerlink" href="#koffi-1-3-7" title="Permalink to this heading">#</a></h3>
|
|
229
282
|
<p><strong>Main fixes:</strong></p>
|
|
230
283
|
<ul class="simple">
|
|
231
284
|
<li><p>Fix crash when using callbacks inside structs</p></li>
|
|
@@ -239,7 +292,7 @@
|
|
|
239
292
|
</ul>
|
|
240
293
|
</section>
|
|
241
294
|
<section id="koffi-1-3-6">
|
|
242
|
-
<
|
|
295
|
+
<h3>Koffi 1.3.6<a class="headerlink" href="#koffi-1-3-6" title="Permalink to this heading">#</a></h3>
|
|
243
296
|
<p><strong>Main fixes:</strong></p>
|
|
244
297
|
<ul class="simple">
|
|
245
298
|
<li><p>Fix install error with Node < 15 on Windows (build system bug)</p></li>
|
|
@@ -252,7 +305,7 @@
|
|
|
252
305
|
</ul>
|
|
253
306
|
</section>
|
|
254
307
|
<section id="koffi-1-3-5">
|
|
255
|
-
<
|
|
308
|
+
<h3>Koffi 1.3.5<a class="headerlink" href="#koffi-1-3-5" title="Permalink to this heading">#</a></h3>
|
|
256
309
|
<p><strong>Main changes:</strong></p>
|
|
257
310
|
<ul class="simple">
|
|
258
311
|
<li><p>Fix memory leak when many async calls are running</p></li>
|
|
@@ -265,14 +318,14 @@
|
|
|
265
318
|
</ul>
|
|
266
319
|
</section>
|
|
267
320
|
<section id="koffi-1-3-4">
|
|
268
|
-
<
|
|
321
|
+
<h3>Koffi 1.3.4<a class="headerlink" href="#koffi-1-3-4" title="Permalink to this heading">#</a></h3>
|
|
269
322
|
<p><strong>Main fixes:</strong></p>
|
|
270
323
|
<ul class="simple">
|
|
271
324
|
<li><p>Fix possible OpenBSD i386 crash with <code class="docutils literal notranslate"><span class="pre">(void)</span></code> functions</p></li>
|
|
272
325
|
</ul>
|
|
273
326
|
</section>
|
|
274
327
|
<section id="koffi-1-3-3">
|
|
275
|
-
<
|
|
328
|
+
<h3>Koffi 1.3.3<a class="headerlink" href="#koffi-1-3-3" title="Permalink to this heading">#</a></h3>
|
|
276
329
|
<p><strong>Main fixes:</strong></p>
|
|
277
330
|
<ul class="simple">
|
|
278
331
|
<li><p>Fix misconversion of signed integer return value as unsigned</p></li>
|
|
@@ -285,7 +338,7 @@
|
|
|
285
338
|
</ul>
|
|
286
339
|
</section>
|
|
287
340
|
<section id="koffi-1-3-2">
|
|
288
|
-
<
|
|
341
|
+
<h3>Koffi 1.3.2<a class="headerlink" href="#koffi-1-3-2" title="Permalink to this heading">#</a></h3>
|
|
289
342
|
<p><strong>Main fixes:</strong></p>
|
|
290
343
|
<ul class="simple">
|
|
291
344
|
<li><p>Support compilation in C++14 mode (graceful degradation)</p></li>
|
|
@@ -293,14 +346,14 @@
|
|
|
293
346
|
</ul>
|
|
294
347
|
</section>
|
|
295
348
|
<section id="koffi-1-3-1">
|
|
296
|
-
<
|
|
349
|
+
<h3>Koffi 1.3.1<a class="headerlink" href="#koffi-1-3-1" title="Permalink to this heading">#</a></h3>
|
|
297
350
|
<p><strong>Main fixes:</strong></p>
|
|
298
351
|
<ul class="simple">
|
|
299
352
|
<li><p>The prebuilt binary is tested when Koffi is installed, and a rebuild happens if it fails to load</p></li>
|
|
300
353
|
</ul>
|
|
301
354
|
</section>
|
|
302
355
|
<section id="koffi-1-3-0">
|
|
303
|
-
<
|
|
356
|
+
<h3>Koffi 1.3.0<a class="headerlink" href="#koffi-1-3-0" title="Permalink to this heading">#</a></h3>
|
|
304
357
|
<p><strong>Major changes:</strong></p>
|
|
305
358
|
<ul class="simple">
|
|
306
359
|
<li><p>Expand and move documentation to <a class="reference external" href="https://koffi.dev/">https://koffi.dev/</a></p></li>
|
|
@@ -317,21 +370,21 @@
|
|
|
317
370
|
</ul>
|
|
318
371
|
</section>
|
|
319
372
|
<section id="koffi-1-2-4">
|
|
320
|
-
<
|
|
373
|
+
<h3>Koffi 1.2.4<a class="headerlink" href="#koffi-1-2-4" title="Permalink to this heading">#</a></h3>
|
|
321
374
|
<p><strong>New features:</strong></p>
|
|
322
375
|
<ul class="simple">
|
|
323
376
|
<li><p>Windows ARM64 is now supported</p></li>
|
|
324
377
|
</ul>
|
|
325
378
|
</section>
|
|
326
379
|
<section id="koffi-1-2-3">
|
|
327
|
-
<
|
|
380
|
+
<h3>Koffi 1.2.3<a class="headerlink" href="#koffi-1-2-3" title="Permalink to this heading">#</a></h3>
|
|
328
381
|
<p><strong>New features:</strong></p>
|
|
329
382
|
<ul class="simple">
|
|
330
383
|
<li><p>A prebuilt binary for macOS ARM64 (M1) is now included</p></li>
|
|
331
384
|
</ul>
|
|
332
385
|
</section>
|
|
333
386
|
<section id="koffi-1-2-1">
|
|
334
|
-
<
|
|
387
|
+
<h3>Koffi 1.2.1<a class="headerlink" href="#koffi-1-2-1" title="Permalink to this heading">#</a></h3>
|
|
335
388
|
<p>This entry documents changes since version 1.1.0.</p>
|
|
336
389
|
<p><strong>New features:</strong></p>
|
|
337
390
|
<ul class="simple">
|
|
@@ -355,6 +408,149 @@
|
|
|
355
408
|
<li><p>Use slower allocation for big objects instead of failing</p></li>
|
|
356
409
|
</ul>
|
|
357
410
|
</section>
|
|
411
|
+
</section>
|
|
412
|
+
<section id="migration-guide">
|
|
413
|
+
<h2>Migration guide<a class="headerlink" href="#migration-guide" title="Permalink to this heading">#</a></h2>
|
|
414
|
+
<section id="koffi-1-x-to-2-x">
|
|
415
|
+
<h3>Koffi 1.x to 2.x<a class="headerlink" href="#koffi-1-x-to-2-x" title="Permalink to this heading">#</a></h3>
|
|
416
|
+
<p>The API was changed in 2.x in a few ways, in order to reduce some excessively “magic” behavior and reduce the syntax differences between C and the C-like prototypes.</p>
|
|
417
|
+
<p>You may need to change your code if you use:</p>
|
|
418
|
+
<ul class="simple">
|
|
419
|
+
<li><p>Callback functions</p></li>
|
|
420
|
+
<li><p>Opaque handles</p></li>
|
|
421
|
+
<li><p><code class="docutils literal notranslate"><span class="pre">koffi.introspect()</span></code></p></li>
|
|
422
|
+
</ul>
|
|
423
|
+
<section id="callback-types">
|
|
424
|
+
<h4>Callback types<a class="headerlink" href="#callback-types" title="Permalink to this heading">#</a></h4>
|
|
425
|
+
<p>In Koffi 1.x, callbacks were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer. Now, you must use them through a pointer: <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">CallIt(CallbackType</span> <span class="pre">func)</span></code> in Koffi 1.x becomes <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">CallIt(CallbackType</span> <span class="pre">*func)</span></code> in version 2.0 and newer.</p>
|
|
426
|
+
<p>Given the following C code:</p>
|
|
427
|
+
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><string.h></span><span class="cp"></span>
|
|
428
|
+
<span class="linenos">2</span>
|
|
429
|
+
<span class="linenos">3</span><span class="kt">int</span><span class="w"> </span><span class="nf">TransferToJS</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">cb</span><span class="p">)(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">))</span><span class="w"></span>
|
|
430
|
+
<span class="linenos">4</span><span class="p">{</span><span class="w"></span>
|
|
431
|
+
<span class="linenos">5</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">64</span><span class="p">];</span><span class="w"></span>
|
|
432
|
+
<span class="linenos">6</span><span class="w"> </span><span class="n">snprintf</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">),</span><span class="w"> </span><span class="s">"Hello %s!"</span><span class="p">,</span><span class="w"> </span><span class="n">str</span><span class="p">);</span><span class="w"></span>
|
|
433
|
+
<span class="linenos">7</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">cb</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="n">age</span><span class="p">);</span><span class="w"></span>
|
|
434
|
+
<span class="linenos">8</span><span class="p">}</span><span class="w"></span>
|
|
435
|
+
</pre></div>
|
|
436
|
+
</div>
|
|
437
|
+
<p>The two versions below illustrate the API difference between Koffi 1.x and Koffi 2.x:</p>
|
|
438
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
|
|
439
|
+
<span class="linenos"> 2</span>
|
|
440
|
+
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">TransferCallback</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">'int TransferCallback(const char *str, int age)'</span><span class="p">);</span>
|
|
441
|
+
<span class="linenos"> 4</span>
|
|
442
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">TransferToJS</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'TransferToJS'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'str'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="nx">TransferCallback</span><span class="p">]);</span>
|
|
443
|
+
<span class="linenos"> 6</span><span class="c1">// Equivalent to: const TransferToJS = lib.func('int TransferToJS(str s, int x, TransferCallback cb)');</span>
|
|
444
|
+
<span class="linenos"> 7</span>
|
|
445
|
+
<span class="linenos"> 8</span><span class="kd">let</span> <span class="nx">ret</span> <span class="o">=</span> <span class="nx">TransferToJS</span><span class="p">(</span><span class="s1">'Niels'</span><span class="p">,</span> <span class="mf">27</span><span class="p">,</span> <span class="p">(</span><span class="nx">str</span><span class="p">,</span> <span class="nx">age</span><span class="p">)</span> <span class="p">=></span> <span class="p">{</span>
|
|
446
|
+
<span class="linenos"> 9</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span>
|
|
447
|
+
<span class="linenos">10</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Your age is:'</span><span class="p">,</span> <span class="nx">age</span><span class="p">);</span>
|
|
448
|
+
<span class="linenos">11</span> <span class="k">return</span> <span class="mf">42</span><span class="p">;</span>
|
|
449
|
+
<span class="linenos">12</span><span class="p">});</span>
|
|
450
|
+
<span class="linenos">13</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ret</span><span class="p">);</span>
|
|
451
|
+
</pre></div>
|
|
452
|
+
</div>
|
|
453
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.x</span>
|
|
454
|
+
<span class="linenos"> 2</span>
|
|
455
|
+
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">TransferCallback</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">'int TransferCallback(const char *str, int age)'</span><span class="p">);</span>
|
|
456
|
+
<span class="linenos"> 4</span>
|
|
457
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">TransferToJS</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'TransferToJS'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'str'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">pointer</span><span class="p">(</span><span class="nx">TransferCallback</span><span class="p">)]);</span>
|
|
458
|
+
<span class="linenos"> 6</span><span class="c1">// Equivalent to: const TransferToJS = lib.func('int TransferToJS(str s, int x, TransferCallback *cb)');</span>
|
|
459
|
+
<span class="linenos"> 7</span>
|
|
460
|
+
<span class="linenos"> 8</span><span class="kd">let</span> <span class="nx">ret</span> <span class="o">=</span> <span class="nx">TransferToJS</span><span class="p">(</span><span class="s1">'Niels'</span><span class="p">,</span> <span class="mf">27</span><span class="p">,</span> <span class="p">(</span><span class="nx">str</span><span class="p">,</span> <span class="nx">age</span><span class="p">)</span> <span class="p">=></span> <span class="p">{</span>
|
|
461
|
+
<span class="linenos"> 9</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span>
|
|
462
|
+
<span class="linenos">10</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Your age is:'</span><span class="p">,</span> <span class="nx">age</span><span class="p">);</span>
|
|
463
|
+
<span class="linenos">11</span> <span class="k">return</span> <span class="mf">42</span><span class="p">;</span>
|
|
464
|
+
<span class="linenos">12</span><span class="p">});</span>
|
|
465
|
+
<span class="linenos">13</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ret</span><span class="p">);</span>
|
|
466
|
+
</pre></div>
|
|
467
|
+
</div>
|
|
468
|
+
<p>Koffi 1.x only supported <a class="reference internal" href="functions#javascript-callbacks"><span class="std std-doc">transient callbacks</span></a>, you must use Koffi 2.x for registered callbacks.</p>
|
|
469
|
+
</section>
|
|
470
|
+
<section id="opaque-handles">
|
|
471
|
+
<h4>Opaque handles<a class="headerlink" href="#opaque-handles" title="Permalink to this heading">#</a></h4>
|
|
472
|
+
<p>In Koffi 1.x, opaque handles were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer. Now, you must use them through a pointer, and use an array for output parameters.</p>
|
|
473
|
+
<p>For functions that return handles or pass them by parameter:</p>
|
|
474
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
|
|
475
|
+
<span class="linenos"> 2</span>
|
|
476
|
+
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">FILE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">'FILE'</span><span class="p">);</span>
|
|
477
|
+
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">fopen</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'FILE fopen(const char *path, const char *mode)'</span><span class="p">);</span>
|
|
478
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">fclose</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'int fclose(FILE stream)'</span><span class="p">);</span>
|
|
479
|
+
<span class="linenos"> 6</span>
|
|
480
|
+
<span class="linenos"> 7</span><span class="kd">let</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="s1">'touch'</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">);</span>
|
|
481
|
+
<span class="linenos"> 8</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fp</span><span class="p">)</span>
|
|
482
|
+
<span class="linenos"> 9</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to open file'</span><span class="p">);</span>
|
|
483
|
+
<span class="linenos">10</span><span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
|
|
484
|
+
</pre></div>
|
|
485
|
+
</div>
|
|
486
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.x</span>
|
|
487
|
+
<span class="linenos"> 2</span>
|
|
488
|
+
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">FILE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">'FILE'</span><span class="p">);</span>
|
|
489
|
+
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">fopen</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'FILE *fopen(const char *path, const char *mode)'</span><span class="p">);</span>
|
|
490
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">fclose</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'int fclose(FILE *stream)'</span><span class="p">);</span>
|
|
491
|
+
<span class="linenos"> 6</span>
|
|
492
|
+
<span class="linenos"> 7</span><span class="kd">let</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="s1">'touch'</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">);</span>
|
|
493
|
+
<span class="linenos"> 8</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fp</span><span class="p">)</span>
|
|
494
|
+
<span class="linenos"> 9</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to open file'</span><span class="p">);</span>
|
|
495
|
+
<span class="linenos">10</span><span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
|
|
496
|
+
</pre></div>
|
|
497
|
+
</div>
|
|
498
|
+
<p>For functions that set opaque handles through output parameters (such as <code class="docutils literal notranslate"><span class="pre">sqlite3_open_v2</span></code>), you must now use a single element array as shown below:</p>
|
|
499
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
|
|
500
|
+
<span class="linenos"> 2</span>
|
|
501
|
+
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">sqlite3_db</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">'sqlite3_db'</span><span class="p">);</span>
|
|
502
|
+
<span class="linenos"> 4</span>
|
|
503
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">sqlite3_open_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'sqlite3_open_v2'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'str'</span><span class="p">,</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">out</span><span class="p">(</span><span class="nx">sqlite3_db</span><span class="p">),</span> <span class="s1">'int'</span><span class="p">,</span> <span class="s1">'str'</span><span class="p">]);</span>
|
|
504
|
+
<span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">sqlite3_close_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'sqlite3_close_v2'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="nx">sqlite3_db</span><span class="p">]);</span>
|
|
505
|
+
<span class="linenos"> 7</span>
|
|
506
|
+
<span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">=</span> <span class="mh">0x2</span><span class="p">;</span>
|
|
507
|
+
<span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_CREATE</span> <span class="o">=</span> <span class="mh">0x4</span><span class="p">;</span>
|
|
508
|
+
<span class="linenos">10</span>
|
|
509
|
+
<span class="linenos">11</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="p">{};</span>
|
|
510
|
+
<span class="linenos">12</span>
|
|
511
|
+
<span class="linenos">13</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">':memory:'</span><span class="p">,</span> <span class="nx">db</span><span class="p">,</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">|</span> <span class="nx">SQLITE_OPEN_CREATE</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">)</span>
|
|
512
|
+
<span class="linenos">14</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to open database'</span><span class="p">);</span>
|
|
513
|
+
<span class="linenos">15</span>
|
|
514
|
+
<span class="linenos">16</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
|
|
515
|
+
</pre></div>
|
|
516
|
+
</div>
|
|
517
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.x</span>
|
|
518
|
+
<span class="linenos"> 2</span>
|
|
519
|
+
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">sqlite3_db</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">'sqlite3_db'</span><span class="p">);</span>
|
|
520
|
+
<span class="linenos"> 4</span>
|
|
521
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">sqlite3_open_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'sqlite3_open_v2'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'str'</span><span class="p">,</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">out</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">pointer</span><span class="p">(</span><span class="nx">sqlite3_db</span><span class="p">,</span> <span class="mf">2</span><span class="p">)),</span> <span class="s1">'int'</span><span class="p">,</span> <span class="s1">'str'</span><span class="p">]);</span>
|
|
522
|
+
<span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">sqlite3_close_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">'sqlite3_close_v2'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">pointer</span><span class="p">(</span><span class="nx">sqlite3_db</span><span class="p">)]);</span>
|
|
523
|
+
<span class="linenos"> 7</span>
|
|
524
|
+
<span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">=</span> <span class="mh">0x2</span><span class="p">;</span>
|
|
525
|
+
<span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_CREATE</span> <span class="o">=</span> <span class="mh">0x4</span><span class="p">;</span>
|
|
526
|
+
<span class="linenos">10</span>
|
|
527
|
+
<span class="linenos">11</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
|
|
528
|
+
<span class="linenos">12</span>
|
|
529
|
+
<span class="linenos">13</span><span class="kd">let</span> <span class="nx">ptr</span> <span class="o">=</span> <span class="p">[</span><span class="kc">null</span><span class="p">];</span>
|
|
530
|
+
<span class="linenos">14</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">':memory:'</span><span class="p">,</span> <span class="nx">ptr</span><span class="p">,</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">|</span> <span class="nx">SQLITE_OPEN_CREATE</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">)</span>
|
|
531
|
+
<span class="linenos">15</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to open database'</span><span class="p">);</span>
|
|
532
|
+
<span class="linenos">16</span><span class="nx">db</span> <span class="o">=</span> <span class="nx">ptr</span><span class="p">[</span><span class="mf">0</span><span class="p">];</span>
|
|
533
|
+
<span class="linenos">17</span>
|
|
534
|
+
<span class="linenos">18</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
|
|
535
|
+
</pre></div>
|
|
536
|
+
</div>
|
|
537
|
+
</section>
|
|
538
|
+
<section id="koffi-introspect">
|
|
539
|
+
<h4>koffi.introspect()<a class="headerlink" href="#koffi-introspect" title="Permalink to this heading">#</a></h4>
|
|
540
|
+
<p>In Koffi 1.x, <code class="docutils literal notranslate"><span class="pre">koffi.introspect()</span></code> would only work with struct types, and return the object passed to <code class="docutils literal notranslate"><span class="pre">koffi.struct()</span></code> to initialize the type. Now this function works with all types.</p>
|
|
541
|
+
<p>You can still get the list of struct members:</p>
|
|
542
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">StructType</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">'StructType'</span><span class="p">,</span> <span class="p">{</span> <span class="nx">dummy</span><span class="o">:</span> <span class="s1">'int'</span> <span class="p">});</span>
|
|
543
|
+
<span class="linenos">2</span>
|
|
544
|
+
<span class="linenos">3</span><span class="c1">// Koffi 1.x</span>
|
|
545
|
+
<span class="linenos">4</span><span class="kd">let</span> <span class="nx">members</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">introspect</span><span class="p">(</span><span class="nx">StructType</span><span class="p">);</span>
|
|
546
|
+
<span class="linenos">5</span>
|
|
547
|
+
<span class="linenos">6</span><span class="c1">// Koffi 2.x</span>
|
|
548
|
+
<span class="linenos">7</span><span class="kd">let</span> <span class="nx">members</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">introspect</span><span class="p">(</span><span class="nx">StructType</span><span class="p">).</span><span class="nx">members</span><span class="p">;</span>
|
|
549
|
+
</pre></div>
|
|
550
|
+
</div>
|
|
551
|
+
</section>
|
|
552
|
+
</section>
|
|
553
|
+
</section>
|
|
358
554
|
</section>
|
|
359
555
|
|
|
360
556
|
</article>
|
|
@@ -407,6 +603,11 @@
|
|
|
407
603
|
<div class="toc-tree">
|
|
408
604
|
<ul>
|
|
409
605
|
<li><a class="reference internal" href="#">Changelog</a><ul>
|
|
606
|
+
<li><a class="reference internal" href="#history">History</a><ul>
|
|
607
|
+
<li><a class="reference internal" href="#koffi-2-0-0">Koffi 2.0.0</a></li>
|
|
608
|
+
<li><a class="reference internal" href="#koffi-1-3-12">Koffi 1.3.12</a></li>
|
|
609
|
+
<li><a class="reference internal" href="#koffi-1-3-11">Koffi 1.3.11</a></li>
|
|
610
|
+
<li><a class="reference internal" href="#koffi-1-3-10">Koffi 1.3.10</a></li>
|
|
410
611
|
<li><a class="reference internal" href="#koffi-1-3-9">Koffi 1.3.9</a></li>
|
|
411
612
|
<li><a class="reference internal" href="#koffi-1-3-8">Koffi 1.3.8</a></li>
|
|
412
613
|
<li><a class="reference internal" href="#koffi-1-3-7">Koffi 1.3.7</a></li>
|
|
@@ -422,6 +623,17 @@
|
|
|
422
623
|
<li><a class="reference internal" href="#koffi-1-2-1">Koffi 1.2.1</a></li>
|
|
423
624
|
</ul>
|
|
424
625
|
</li>
|
|
626
|
+
<li><a class="reference internal" href="#migration-guide">Migration guide</a><ul>
|
|
627
|
+
<li><a class="reference internal" href="#koffi-1-x-to-2-x">Koffi 1.x to 2.x</a><ul>
|
|
628
|
+
<li><a class="reference internal" href="#callback-types">Callback types</a></li>
|
|
629
|
+
<li><a class="reference internal" href="#opaque-handles">Opaque handles</a></li>
|
|
630
|
+
<li><a class="reference internal" href="#koffi-introspect">koffi.introspect()</a></li>
|
|
631
|
+
</ul>
|
|
632
|
+
</li>
|
|
633
|
+
</ul>
|
|
634
|
+
</li>
|
|
635
|
+
</ul>
|
|
636
|
+
</li>
|
|
425
637
|
</ul>
|
|
426
638
|
|
|
427
639
|
</div>
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
<li class="toctree-l1"><a class="reference internal" href="platforms">Requirements</a></li>
|
|
166
166
|
<li class="toctree-l1"><a class="reference internal" href="start">Quick start</a></li>
|
|
167
167
|
<li class="toctree-l1"><a class="reference internal" href="types">Data types</a></li>
|
|
168
|
-
<li class="toctree-l1"><a class="reference internal" href="functions">
|
|
168
|
+
<li class="toctree-l1"><a class="reference internal" href="functions">Functions</a></li>
|
|
169
169
|
<li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
|
|
170
170
|
<li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
|
|
171
171
|
<li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Contributing</a></li>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<link rel="index" title="Index" href="genindex" /><link rel="search" title="Search" href="search" /><link rel="next" title="Memory usage" href="memory" /><link rel="prev" title="Data types" href="types" />
|
|
7
7
|
|
|
8
8
|
<meta name="generator" content="sphinx-5.0.1, furo 2022.06.04.1"/>
|
|
9
|
-
<title>
|
|
9
|
+
<title>Functions - Koffi</title>
|
|
10
10
|
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
|
|
11
11
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=40978830699223671f4072448e654b5958f38b89" />
|
|
12
12
|
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
<li class="toctree-l1"><a class="reference internal" href="platforms">Requirements</a></li>
|
|
166
166
|
<li class="toctree-l1"><a class="reference internal" href="start">Quick start</a></li>
|
|
167
167
|
<li class="toctree-l1"><a class="reference internal" href="types">Data types</a></li>
|
|
168
|
-
<li class="toctree-l1 current current-page"><a class="current reference internal" href="#">
|
|
168
|
+
<li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Functions</a></li>
|
|
169
169
|
<li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
|
|
170
170
|
<li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
|
|
171
171
|
<li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
|
|
@@ -203,8 +203,8 @@
|
|
|
203
203
|
</label>
|
|
204
204
|
</div>
|
|
205
205
|
<article role="main">
|
|
206
|
-
<section id="
|
|
207
|
-
<h1>
|
|
206
|
+
<section id="functions">
|
|
207
|
+
<h1>Functions<a class="headerlink" href="#functions" title="Permalink to this heading">#</a></h1>
|
|
208
208
|
<section id="function-definitions">
|
|
209
209
|
<h2>Function definitions<a class="headerlink" href="#function-definitions" title="Permalink to this heading">#</a></h2>
|
|
210
210
|
<p>To declare functions, start by loading the shared library with <code class="docutils literal notranslate"><span class="pre">koffi.load(filename)</span></code>.</p>
|
|
@@ -236,8 +236,8 @@
|
|
|
236
236
|
<p>You can use <code class="docutils literal notranslate"><span class="pre">()</span></code> or <code class="docutils literal notranslate"><span class="pre">(void)</span></code> for functions that take no argument.</p>
|
|
237
237
|
</section>
|
|
238
238
|
</section>
|
|
239
|
-
<section id="
|
|
240
|
-
<h2>Function calls<a class="headerlink" href="#
|
|
239
|
+
<section id="function-calls">
|
|
240
|
+
<h2>Function calls<a class="headerlink" href="#function-calls" title="Permalink to this heading">#</a></h2>
|
|
241
241
|
<section id="calling-conventions">
|
|
242
242
|
<h3>Calling conventions<a class="headerlink" href="#calling-conventions" title="Permalink to this heading">#</a></h3>
|
|
243
243
|
<p>By default, calling a C function happens synchronously.</p>
|
|
@@ -370,7 +370,7 @@
|
|
|
370
370
|
<h4>Opaque handle example<a class="headerlink" href="#opaque-handle-example" title="Permalink to this heading">#</a></h4>
|
|
371
371
|
<p>This example opens an in-memory SQLite database, and uses the node-ffi-style function declaration syntax.</p>
|
|
372
372
|
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span> <span class="nx">koffi</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'koffi'</span><span class="p">);</span>
|
|
373
|
-
<span class="linenos"> 2</span><span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">'
|
|
373
|
+
<span class="linenos"> 2</span><span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">'sqlite3.so'</span><span class="p">);</span>
|
|
374
374
|
<span class="linenos"> 3</span>
|
|
375
375
|
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">sqlite3_db</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">'sqlite3_db'</span><span class="p">);</span>
|
|
376
376
|
<span class="linenos"> 5</span>
|
|
@@ -381,10 +381,12 @@
|
|
|
381
381
|
<span class="linenos">10</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">=</span> <span class="mh">0x2</span><span class="p">;</span>
|
|
382
382
|
<span class="linenos">11</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_CREATE</span> <span class="o">=</span> <span class="mh">0x4</span><span class="p">;</span>
|
|
383
383
|
<span class="linenos">12</span>
|
|
384
|
-
<span class="linenos">13</span><span class="kd">let</span> <span class="nx">
|
|
385
|
-
<span class="linenos">14</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">':memory:'</span><span class="p">,</span> <span class="nx">
|
|
384
|
+
<span class="linenos">13</span><span class="kd">let</span> <span class="nx">out</span> <span class="o">=</span> <span class="p">[</span><span class="kc">null</span><span class="p">];</span>
|
|
385
|
+
<span class="linenos">14</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">':memory:'</span><span class="p">,</span> <span class="nx">out</span><span class="p">,</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">|</span> <span class="nx">SQLITE_OPEN_CREATE</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">)</span>
|
|
386
386
|
<span class="linenos">15</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to open database'</span><span class="p">);</span>
|
|
387
|
-
<span class="linenos">16</span><span class="nx">
|
|
387
|
+
<span class="linenos">16</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="nx">out</span><span class="p">[</span><span class="mf">0</span><span class="p">];</span>
|
|
388
|
+
<span class="linenos">17</span>
|
|
389
|
+
<span class="linenos">18</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
|
|
388
390
|
</pre></div>
|
|
389
391
|
</div>
|
|
390
392
|
</section>
|
|
@@ -448,6 +450,7 @@
|
|
|
448
450
|
<p>Callbacks <strong>have changed in version 2.0</strong>.</p>
|
|
449
451
|
<p>In Koffi 1.x, callbacks were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer.</p>
|
|
450
452
|
<p>Now, you must use them through a pointer: <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">CallIt(CallbackType</span> <span class="pre">func)</span></code> in Koffi 1.x becomes <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">CallIt(CallbackType</span> <span class="pre">*func)</span></code> in version 2.0 and newer.</p>
|
|
453
|
+
<p>Consult the <a class="reference internal" href="changes"><span class="doc std std-doc">migration guide</span></a> for more information.</p>
|
|
451
454
|
</div>
|
|
452
455
|
<p>Koffi only uses predefined static trampolines, and does not need to generate code at runtime, which makes it compatible with platforms with hardened W^X migitations (such as PaX mprotect). However, this imposes some restrictions on the maximum number of callbacks, and their duration.</p>
|
|
453
456
|
<p>Thus, Koffi distinguishes two callback modes:</p>
|
|
@@ -601,13 +604,13 @@
|
|
|
601
604
|
<div class="toc-tree-container">
|
|
602
605
|
<div class="toc-tree">
|
|
603
606
|
<ul>
|
|
604
|
-
<li><a class="reference internal" href="#">
|
|
607
|
+
<li><a class="reference internal" href="#">Functions</a><ul>
|
|
605
608
|
<li><a class="reference internal" href="#function-definitions">Function definitions</a><ul>
|
|
606
609
|
<li><a class="reference internal" href="#classic-syntax">Classic syntax</a></li>
|
|
607
610
|
<li><a class="reference internal" href="#c-like-prototypes">C-like prototypes</a></li>
|
|
608
611
|
</ul>
|
|
609
612
|
</li>
|
|
610
|
-
<li><a class="reference internal" href="#
|
|
613
|
+
<li><a class="reference internal" href="#function-calls">Function calls</a><ul>
|
|
611
614
|
<li><a class="reference internal" href="#calling-conventions">Calling conventions</a></li>
|
|
612
615
|
<li><a class="reference internal" href="#asynchronous-calls">Asynchronous calls</a></li>
|
|
613
616
|
<li><a class="reference internal" href="#variadic-functions">Variadic functions</a></li>
|
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
<li class="toctree-l1"><a class="reference internal" href="platforms">Requirements</a></li>
|
|
164
164
|
<li class="toctree-l1"><a class="reference internal" href="start">Quick start</a></li>
|
|
165
165
|
<li class="toctree-l1"><a class="reference internal" href="types">Data types</a></li>
|
|
166
|
-
<li class="toctree-l1"><a class="reference internal" href="functions">
|
|
166
|
+
<li class="toctree-l1"><a class="reference internal" href="functions">Functions</a></li>
|
|
167
167
|
<li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
|
|
168
168
|
<li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
|
|
169
169
|
<li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
|
package/doc/dist/html/index.html
CHANGED
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
<li class="toctree-l1"><a class="reference internal" href="platforms">Requirements</a></li>
|
|
166
166
|
<li class="toctree-l1"><a class="reference internal" href="start">Quick start</a></li>
|
|
167
167
|
<li class="toctree-l1"><a class="reference internal" href="types">Data types</a></li>
|
|
168
|
-
<li class="toctree-l1"><a class="reference internal" href="functions">
|
|
168
|
+
<li class="toctree-l1"><a class="reference internal" href="functions">Functions</a></li>
|
|
169
169
|
<li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
|
|
170
170
|
<li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
|
|
171
171
|
<li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
|
|
@@ -238,11 +238,12 @@
|
|
|
238
238
|
<li class="toctree-l2"><a class="reference internal" href="types#pointer-types">Pointer types</a></li>
|
|
239
239
|
<li class="toctree-l2"><a class="reference internal" href="types#fixed-size-c-arrays">Fixed-size C arrays</a></li>
|
|
240
240
|
<li class="toctree-l2"><a class="reference internal" href="types#type-introspection">Type introspection</a></li>
|
|
241
|
+
<li class="toctree-l2"><a class="reference internal" href="types#type-aliasing">Type aliasing</a></li>
|
|
241
242
|
</ul>
|
|
242
243
|
</li>
|
|
243
|
-
<li class="toctree-l1"><a class="reference internal" href="functions">
|
|
244
|
+
<li class="toctree-l1"><a class="reference internal" href="functions">Functions</a><ul>
|
|
244
245
|
<li class="toctree-l2"><a class="reference internal" href="functions#function-definitions">Function definitions</a></li>
|
|
245
|
-
<li class="toctree-l2"><a class="reference internal" href="functions#
|
|
246
|
+
<li class="toctree-l2"><a class="reference internal" href="functions#function-calls">Function calls</a></li>
|
|
246
247
|
<li class="toctree-l2"><a class="reference internal" href="functions#c-to-js-conversion-gotchas">C to JS conversion gotchas</a></li>
|
|
247
248
|
<li class="toctree-l2"><a class="reference internal" href="functions#javascript-callbacks">Javascript callbacks</a></li>
|
|
248
249
|
<li class="toctree-l2"><a class="reference internal" href="functions#thread-safety">Thread safety</a></li>
|
|
@@ -269,19 +270,8 @@
|
|
|
269
270
|
</ul>
|
|
270
271
|
</li>
|
|
271
272
|
<li class="toctree-l1"><a class="reference internal" href="changes">Changelog</a><ul>
|
|
272
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#
|
|
273
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#
|
|
274
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-7">Koffi 1.3.7</a></li>
|
|
275
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-6">Koffi 1.3.6</a></li>
|
|
276
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-5">Koffi 1.3.5</a></li>
|
|
277
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-4">Koffi 1.3.4</a></li>
|
|
278
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-3">Koffi 1.3.3</a></li>
|
|
279
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-2">Koffi 1.3.2</a></li>
|
|
280
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-1">Koffi 1.3.1</a></li>
|
|
281
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-0">Koffi 1.3.0</a></li>
|
|
282
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-2-4">Koffi 1.2.4</a></li>
|
|
283
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-2-3">Koffi 1.2.3</a></li>
|
|
284
|
-
<li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-2-1">Koffi 1.2.1</a></li>
|
|
273
|
+
<li class="toctree-l2"><a class="reference internal" href="changes#history">History</a></li>
|
|
274
|
+
<li class="toctree-l2"><a class="reference internal" href="changes#migration-guide">Migration guide</a></li>
|
|
285
275
|
</ul>
|
|
286
276
|
</li>
|
|
287
277
|
</ul>
|