koffi 1.3.0 → 1.3.1

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.
Files changed (27) hide show
  1. package/build/qemu/{1.3.0 → 1.3.1}/koffi_darwin_arm64.tar.gz +0 -0
  2. package/build/qemu/{1.3.0 → 1.3.1}/koffi_darwin_x64.tar.gz +0 -0
  3. package/build/qemu/{1.3.0 → 1.3.1}/koffi_freebsd_arm64.tar.gz +0 -0
  4. package/build/qemu/{1.3.0 → 1.3.1}/koffi_freebsd_ia32.tar.gz +0 -0
  5. package/build/qemu/{1.3.0 → 1.3.1}/koffi_freebsd_x64.tar.gz +0 -0
  6. package/build/qemu/{1.3.0 → 1.3.1}/koffi_linux_arm32hf.tar.gz +0 -0
  7. package/build/qemu/{1.3.0 → 1.3.1}/koffi_linux_arm64.tar.gz +0 -0
  8. package/build/qemu/{1.3.0 → 1.3.1}/koffi_linux_ia32.tar.gz +0 -0
  9. package/build/qemu/{1.3.0 → 1.3.1}/koffi_linux_riscv64hf64.tar.gz +0 -0
  10. package/build/qemu/{1.3.0 → 1.3.1}/koffi_linux_x64.tar.gz +0 -0
  11. package/build/qemu/{1.3.0 → 1.3.1}/koffi_openbsd_ia32.tar.gz +0 -0
  12. package/build/qemu/{1.3.0 → 1.3.1}/koffi_openbsd_x64.tar.gz +0 -0
  13. package/build/qemu/{1.3.0 → 1.3.1}/koffi_win32_arm64.tar.gz +0 -0
  14. package/build/qemu/{1.3.0 → 1.3.1}/koffi_win32_ia32.tar.gz +0 -0
  15. package/build/qemu/{1.3.0 → 1.3.1}/koffi_win32_x64.tar.gz +0 -0
  16. package/doc/conf.py +2 -2
  17. package/doc/dist/html/_static/pygments.css +54 -54
  18. package/doc/dist/html/functions.html +66 -66
  19. package/doc/dist/html/index.html +2 -2
  20. package/doc/dist/html/memory.html +2 -2
  21. package/doc/dist/html/objects.inv +0 -0
  22. package/doc/dist/html/platforms.html +1 -1
  23. package/doc/dist/html/searchindex.js +1 -1
  24. package/doc/dist/html/start.html +45 -45
  25. package/doc/dist/html/types.html +152 -152
  26. package/package.json +3 -3
  27. package/src/ffi.cc +1 -1
@@ -207,8 +207,8 @@
207
207
  <section id="function-definitions">
208
208
  <h2>Function definitions<a class="headerlink" href="#function-definitions" title="Permalink to this heading">#</a></h2>
209
209
  <p>To declare functions, start by loading the shared library with <code class="docutils literal notranslate"><span class="pre">koffi.load()</span></code>.</p>
210
- <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">&#39;koffi&#39;</span><span class="p">);</span>
211
- <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">&#39;/path/to/shared/library&#39;</span><span class="p">);</span> <span class="c1">// File extension depends on platforms: .so, .dll, .dylib, etc.</span>
210
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
211
+ <span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;/path/to/shared/library&#39;</span><span class="p">);</span><span class="w"> </span><span class="c1">// File extension depends on platforms: .so, .dll, .dylib, etc.</span><span class="w"></span>
212
212
  </pre></div>
213
213
  </div>
214
214
  <p>You can use the returned object to load C functions from the library. Koffi supports two syntaxes:</p>
@@ -219,8 +219,8 @@
219
219
  <section id="classic-syntax">
220
220
  <h3>Classic syntax<a class="headerlink" href="#classic-syntax" title="Permalink to this heading">#</a></h3>
221
221
  <p>To declare a function, you need to specify its non-mangled name, its return type, and its parameters. Use an ellipsis as the last parameter for variadic functions.</p>
222
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">printf</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">&#39;printf&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;...&#39;</span><span class="p">]);</span>
223
- <span class="linenos">2</span><span class="kd">const</span> <span class="nx">atoi</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">&#39;atoi&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">]);</span>
222
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">printf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;printf&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;...&#39;</span><span class="p">]);</span><span class="w"></span>
223
+ <span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">atoi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;atoi&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">]);</span><span class="w"></span>
224
224
  </pre></div>
225
225
  </div>
226
226
  <p>Koffi automatically tries mangled names for non-standard x86 calling conventions. See the section <a class="reference internal" href="#synchronous-calls"><span class="std std-doc">on standard calls</span></a> for more information on this subject.</p>
@@ -228,8 +228,8 @@
228
228
  <section id="c-like-prototypes">
229
229
  <h3>C-like prototypes<a class="headerlink" href="#c-like-prototypes" title="Permalink to this heading">#</a></h3>
230
230
  <p>You can declare functions using simple C-like prototype strings, as shown below:</p>
231
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">printf</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">&#39;int printf(const char *fmt, ...)&#39;</span><span class="p">);</span>
232
- <span class="linenos">2</span><span class="kd">const</span> <span class="nx">atoi</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">&#39;int atoi(string)&#39;</span><span class="p">);</span> <span class="c1">// The parameter name is not used by Koffi, and optional</span>
231
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">printf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int printf(const char *fmt, ...)&#39;</span><span class="p">);</span><span class="w"></span>
232
+ <span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">atoi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int atoi(string)&#39;</span><span class="p">);</span><span class="w"> </span><span class="c1">// The parameter name is not used by Koffi, and optional</span><span class="w"></span>
233
233
  </pre></div>
234
234
  </div>
235
235
  </section>
@@ -273,29 +273,29 @@
273
273
  </div>
274
274
  <p>You can safely use these on non-x86 platforms, they are simply ignored.</p>
275
275
  <p>Below you can find a small example showing how to use a non-default calling convention:</p>
276
- <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">&#39;koffi&#39;</span><span class="p">);</span>
277
- <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">&#39;user32.dll&#39;</span><span class="p">);</span>
276
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
277
+ <span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;user32.dll&#39;</span><span class="p">);</span><span class="w"></span>
278
278
  <span class="linenos">3</span>
279
- <span class="linenos">4</span><span class="c1">// The following two declarations are equivalent, and use Stdcall</span>
280
- <span class="linenos">5</span><span class="kd">const</span> <span class="nx">MessageBoxA_1</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">stdcall</span><span class="p">(</span><span class="s1">&#39;MessageBoxA&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;void *&#39;</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;uint&#39;</span><span class="p">]);</span>
281
- <span class="linenos">6</span><span class="kd">const</span> <span class="nx">MessageBoxA_2</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">&#39;int __stdcall MessageBoxA(void *hwnd, string text, string caption, uint type)&#39;</span><span class="p">);</span>
279
+ <span class="linenos">4</span><span class="c1">// The following two declarations are equivalent, and use Stdcall</span><span class="w"></span>
280
+ <span class="linenos">5</span><span class="kd">const</span><span class="w"> </span><span class="nx">MessageBoxA_1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">stdcall</span><span class="p">(</span><span class="s1">&#39;MessageBoxA&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;void *&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">]);</span><span class="w"></span>
281
+ <span class="linenos">6</span><span class="kd">const</span><span class="w"> </span><span class="nx">MessageBoxA_2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int __stdcall MessageBoxA(void *hwnd, string text, string caption, uint type)&#39;</span><span class="p">);</span><span class="w"></span>
282
282
  </pre></div>
283
283
  </div>
284
284
  </section>
285
285
  <section id="asynchronous-calls">
286
286
  <h2>Asynchronous calls<a class="headerlink" href="#asynchronous-calls" title="Permalink to this heading">#</a></h2>
287
287
  <p>You can issue asynchronous calls by calling the function through its async member. In this case, you need to provide a callback function as the last argument, with <code class="docutils literal notranslate"><span class="pre">(err,</span> <span class="pre">res)</span></code> parameters.</p>
288
- <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">&#39;koffi&#39;</span><span class="p">);</span>
289
- <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">&#39;libc.so.6&#39;</span><span class="p">);</span>
288
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
289
+ <span class="linenos"> 2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;libc.so.6&#39;</span><span class="p">);</span><span class="w"></span>
290
290
  <span class="linenos"> 3</span>
291
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">atoi</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">&#39;int atoi(const char *str)&#39;</span><span class="p">);</span>
291
+ <span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">atoi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int atoi(const char *str)&#39;</span><span class="p">);</span><span class="w"></span>
292
292
  <span class="linenos"> 5</span>
293
- <span class="linenos"> 6</span><span class="nx">atoi</span><span class="p">.</span><span class="k">async</span><span class="p">(</span><span class="s1">&#39;1257&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
294
- <span class="linenos"> 7</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Result:&#39;</span><span class="p">,</span> <span class="nx">res</span><span class="p">);</span>
295
- <span class="linenos"> 8</span><span class="p">})</span>
296
- <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="s1">&#39;Hello World!&#39;</span><span class="p">);</span>
293
+ <span class="linenos"> 6</span><span class="nx">atoi</span><span class="p">.</span><span class="k">async</span><span class="p">(</span><span class="s1">&#39;1257&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
294
+ <span class="linenos"> 7</span><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Result:&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span><span class="w"></span>
295
+ <span class="linenos"> 8</span><span class="p">})</span><span class="w"></span>
296
+ <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="s1">&#39;Hello World!&#39;</span><span class="p">);</span><span class="w"></span>
297
297
  <span class="linenos">10</span>
298
- <span class="linenos">11</span><span class="c1">// This program will print &quot;Hello World!&quot;, and then &quot;Result: 1257&quot;</span>
298
+ <span class="linenos">11</span><span class="c1">// This program will print &quot;Hello World!&quot;, and then &quot;Result: 1257&quot;</span><span class="w"></span>
299
299
  </pre></div>
300
300
  </div>
301
301
  <p>You can easily convert this callback-style async function to a promise-based version with <code class="docutils literal notranslate"><span class="pre">util.promisify()</span></code> from the Node.js standard library.</p>
@@ -305,10 +305,10 @@
305
305
  <h2>Variadic functions<a class="headerlink" href="#variadic-functions" title="Permalink to this heading">#</a></h2>
306
306
  <p>Variadic functions are declared with an ellipsis as the last argument.</p>
307
307
  <p>In order to call a variadic function, you must provide two Javascript arguments for each additional C parameter, the first one is the expected type and the second one is the value.</p>
308
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">printf</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">&#39;printf&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;...&#39;</span><span class="p">]);</span>
308
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">printf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;printf&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;...&#39;</span><span class="p">]);</span><span class="w"></span>
309
309
  <span class="linenos">2</span>
310
- <span class="linenos">3</span><span class="c1">// The variadic arguments are: 6 (int), 8.5 (double), &#39;THE END&#39; (const char *)</span>
311
- <span class="linenos">4</span><span class="nx">printf</span><span class="p">(</span><span class="s1">&#39;Integer %d, double %g, string %s&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="mf">6</span><span class="p">,</span> <span class="s1">&#39;double&#39;</span><span class="p">,</span> <span class="mf">8.5</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;THE END&#39;</span><span class="p">);</span>
310
+ <span class="linenos">3</span><span class="c1">// The variadic arguments are: 6 (int), 8.5 (double), &#39;THE END&#39; (const char *)</span><span class="w"></span>
311
+ <span class="linenos">4</span><span class="nx">printf</span><span class="p">(</span><span class="s1">&#39;Integer %d, double %g, string %s&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;double&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">8.5</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;THE END&#39;</span><span class="p">);</span><span class="w"></span>
312
312
  </pre></div>
313
313
  </div>
314
314
  <p>On x86 platforms, only the Cdecl convention can be used for variadic functions.</p>
@@ -334,46 +334,46 @@
334
334
  <section id="struct-example">
335
335
  <h3>Struct example<a class="headerlink" href="#struct-example" title="Permalink to this heading">#</a></h3>
336
336
  <p>This example calls the POSIX function <code class="docutils literal notranslate"><span class="pre">gettimeofday()</span></code>, and uses the prototype-like syntax.</p>
337
- <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">&#39;koffi&#39;</span><span class="p">);</span>
338
- <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">&#39;libc.so.6&#39;</span><span class="p">);</span>
337
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
338
+ <span class="linenos"> 2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;libc.so.6&#39;</span><span class="p">);</span><span class="w"></span>
339
339
  <span class="linenos"> 3</span>
340
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">timeval</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">&#39;timeval&#39;</span><span class="p">,</span> <span class="p">{</span>
341
- <span class="linenos"> 5</span> <span class="nx">tv_sec</span><span class="o">:</span> <span class="s1">&#39;unsigned int&#39;</span><span class="p">,</span>
342
- <span class="linenos"> 6</span> <span class="nx">tv_usec</span><span class="o">:</span> <span class="s1">&#39;unsigned int&#39;</span>
343
- <span class="linenos"> 7</span><span class="p">});</span>
344
- <span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">timezone</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">&#39;timezone&#39;</span><span class="p">,</span> <span class="p">{</span>
345
- <span class="linenos"> 9</span> <span class="nx">tz_minuteswest</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
346
- <span class="linenos">10</span> <span class="nx">tz_dsttime</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span>
347
- <span class="linenos">11</span><span class="p">});</span>
340
+ <span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">timeval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;timeval&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
341
+ <span class="linenos"> 5</span><span class="w"> </span><span class="nx">tv_sec</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;unsigned int&#39;</span><span class="p">,</span><span class="w"></span>
342
+ <span class="linenos"> 6</span><span class="w"> </span><span class="nx">tv_usec</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;unsigned int&#39;</span><span class="w"></span>
343
+ <span class="linenos"> 7</span><span class="p">});</span><span class="w"></span>
344
+ <span class="linenos"> 8</span><span class="kd">const</span><span class="w"> </span><span class="nx">timezone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;timezone&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
345
+ <span class="linenos"> 9</span><span class="w"> </span><span class="nx">tz_minuteswest</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
346
+ <span class="linenos">10</span><span class="w"> </span><span class="nx">tz_dsttime</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="w"></span>
347
+ <span class="linenos">11</span><span class="p">});</span><span class="w"></span>
348
348
  <span class="linenos">12</span>
349
- <span class="linenos">13</span><span class="c1">// The _Out_ qualifiers instruct Koffi to marshal out the values</span>
350
- <span class="linenos">14</span><span class="kd">const</span> <span class="nx">gettimeofday</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">&#39;int gettimeofday(_Out_ timeval *tv, _Out_ timezone *tz)&#39;</span><span class="p">);</span>
349
+ <span class="linenos">13</span><span class="c1">// The _Out_ qualifiers instruct Koffi to marshal out the values</span><span class="w"></span>
350
+ <span class="linenos">14</span><span class="kd">const</span><span class="w"> </span><span class="nx">gettimeofday</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int gettimeofday(_Out_ timeval *tv, _Out_ timezone *tz)&#39;</span><span class="p">);</span><span class="w"></span>
351
351
  <span class="linenos">15</span>
352
- <span class="linenos">16</span><span class="kd">let</span> <span class="nx">tv</span> <span class="o">=</span> <span class="p">{};</span>
353
- <span class="linenos">17</span><span class="nx">gettimeofday</span><span class="p">(</span><span class="nx">tv</span><span class="p">,</span> <span class="kc">null</span><span class="p">);</span>
352
+ <span class="linenos">16</span><span class="kd">let</span><span class="w"> </span><span class="nx">tv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
353
+ <span class="linenos">17</span><span class="nx">gettimeofday</span><span class="p">(</span><span class="nx">tv</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span><span class="w"></span>
354
354
  <span class="linenos">18</span>
355
- <span class="linenos">19</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">tv</span><span class="p">);</span>
355
+ <span class="linenos">19</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">tv</span><span class="p">);</span><span class="w"></span>
356
356
  </pre></div>
357
357
  </div>
358
358
  </section>
359
359
  <section id="opaque-handle-example">
360
360
  <h3>Opaque handle example<a class="headerlink" href="#opaque-handle-example" title="Permalink to this heading">#</a></h3>
361
361
  <p>This example opens an in-memory SQLite database, and uses the node-ffi-style function declaration syntax.</p>
362
- <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">&#39;koffi&#39;</span><span class="p">);</span>
363
- <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">&#39;sqlite.so&#39;</span><span class="p">);</span>
362
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
363
+ <span class="linenos"> 2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;sqlite.so&#39;</span><span class="p">);</span><span class="w"></span>
364
364
  <span class="linenos"> 3</span>
365
- <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">&#39;sqlite3_db&#39;</span><span class="p">);</span>
365
+ <span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">sqlite3_db</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;sqlite3_db&#39;</span><span class="p">);</span><span class="w"></span>
366
366
  <span class="linenos"> 5</span>
367
- <span class="linenos"> 6</span><span class="c1">// Use koffi.out() on a pointer to copy out (from C to JS) after the call</span>
368
- <span class="linenos"> 7</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">&#39;sqlite3_open_v2&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;string&#39;</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="s1">&#39;int&#39;</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">]);</span>
367
+ <span class="linenos"> 6</span><span class="c1">// Use koffi.out() on a pointer to copy out (from C to JS) after the call</span><span class="w"></span>
368
+ <span class="linenos"> 7</span><span class="kd">const</span><span class="w"> </span><span class="nx">sqlite3_open_v2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;sqlite3_open_v2&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </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="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">]);</span><span class="w"></span>
369
369
  <span class="linenos"> 8</span>
370
- <span class="linenos"> 9</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>
371
- <span class="linenos">10</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>
370
+ <span class="linenos"> 9</span><span class="kd">const</span><span class="w"> </span><span class="nx">SQLITE_OPEN_READWRITE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x2</span><span class="p">;</span><span class="w"></span>
371
+ <span class="linenos">10</span><span class="kd">const</span><span class="w"> </span><span class="nx">SQLITE_OPEN_CREATE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x4</span><span class="p">;</span><span class="w"></span>
372
372
  <span class="linenos">11</span>
373
- <span class="linenos">12</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="p">{};</span>
374
- <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">&#39;:memory:&#39;</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>
375
- <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">&#39;Failed to open database&#39;</span><span class="p">);</span>
376
- <span class="linenos">15</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
373
+ <span class="linenos">12</span><span class="kd">let</span><span class="w"> </span><span class="nx">db</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
374
+ <span class="linenos">13</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">&#39;:memory:&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">db</span><span class="p">,</span><span class="w"> </span><span class="nx">SQLITE_OPEN_READWRITE</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">SQLITE_OPEN_CREATE</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mf">0</span><span class="p">)</span><span class="w"></span>
375
+ <span class="linenos">14</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to open database&#39;</span><span class="p">);</span><span class="w"></span>
376
+ <span class="linenos">15</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span><span class="w"></span>
377
377
  </pre></div>
378
378
  </div>
379
379
  </section>
@@ -383,13 +383,13 @@
383
383
  <section id="using-callbacks">
384
384
  <h3>Using callbacks<a class="headerlink" href="#using-callbacks" title="Permalink to this heading">#</a></h3>
385
385
  <p>In order to pass a JS function to a C function expecting a callback, you must first create a callback type with the expected return type and parameters. The syntax is similar to the one used to load functions from a shared library.</p>
386
- <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">&#39;koffi&#39;</span><span class="p">);</span>
386
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
387
387
  <span class="linenos">2</span>
388
- <span class="linenos">3</span><span class="c1">// With the classic syntax, this callback expects an integer and returns nothing</span>
389
- <span class="linenos">4</span><span class="kd">const</span> <span class="nx">ExampleCallback</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">&#39;ExampleCallback&#39;</span><span class="p">,</span> <span class="s1">&#39;void&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;int&#39;</span><span class="p">]);</span>
388
+ <span class="linenos">3</span><span class="c1">// With the classic syntax, this callback expects an integer and returns nothing</span><span class="w"></span>
389
+ <span class="linenos">4</span><span class="kd">const</span><span class="w"> </span><span class="nx">ExampleCallback</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">&#39;ExampleCallback&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;void&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;int&#39;</span><span class="p">]);</span><span class="w"></span>
390
390
  <span class="linenos">5</span>
391
- <span class="linenos">6</span><span class="c1">// With the prototype parser, this callback expects a double and float, and returns the sum as a double</span>
392
- <span class="linenos">7</span><span class="kd">const</span> <span class="nx">AddDoubleFloat</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">&#39;double AddDoubleFloat(double d, float f)&#39;</span><span class="p">);</span>
391
+ <span class="linenos">6</span><span class="c1">// With the prototype parser, this callback expects a double and float, and returns the sum as a double</span><span class="w"></span>
392
+ <span class="linenos">7</span><span class="kd">const</span><span class="w"> </span><span class="nx">AddDoubleFloat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">&#39;double AddDoubleFloat(double d, float f)&#39;</span><span class="p">);</span><span class="w"></span>
393
393
  </pre></div>
394
394
  </div>
395
395
  <p>Once your callback type is declared, you can use them in struct definitions, or as function parameter and/or return type.</p>
@@ -404,23 +404,23 @@
404
404
  <span class="linenos">8</span><span class="p">}</span><span class="w"></span>
405
405
  </pre></div>
406
406
  </div>
407
- <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">&#39;koffi&#39;</span><span class="p">);</span>
407
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
408
408
  <span class="linenos"> 2</span>
409
- <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">&#39;int TransferCallback(const char *str, int age)&#39;</span><span class="p">);</span>
409
+ <span class="linenos"> 3</span><span class="kd">const</span><span class="w"> </span><span class="nx">TransferCallback</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">&#39;int TransferCallback(const char *str, int age)&#39;</span><span class="p">);</span><span class="w"></span>
410
410
  <span class="linenos"> 4</span>
411
- <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">&#39;int TransferToJS(const char *str, int age, TransferCallback cb)&#39;</span><span class="p">);</span>
411
+ <span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">TransferToJS</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int TransferToJS(const char *str, int age, TransferCallback cb)&#39;</span><span class="p">);</span><span class="w"></span>
412
412
  <span class="linenos"> 6</span>
413
- <span class="linenos"> 7</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">&#39;Niels&#39;</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">=&gt;</span> <span class="p">{</span>
414
- <span class="linenos"> 8</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>
415
- <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="s1">&#39;Your age is:&#39;</span><span class="p">,</span> <span class="nx">age</span><span class="p">);</span>
416
- <span class="linenos">10</span> <span class="k">return</span> <span class="mf">42</span><span class="p">;</span>
417
- <span class="linenos">11</span><span class="p">});</span>
418
- <span class="linenos">12</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>
413
+ <span class="linenos"> 7</span><span class="kd">let</span><span class="w"> </span><span class="nx">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">TransferToJS</span><span class="p">(</span><span class="s1">&#39;Niels&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">27</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">str</span><span class="p">,</span><span class="w"> </span><span class="nx">age</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
414
+ <span class="linenos"> 8</span><span class="w"> </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><span class="w"></span>
415
+ <span class="linenos"> 9</span><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Your age is:&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">age</span><span class="p">);</span><span class="w"></span>
416
+ <span class="linenos">10</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mf">42</span><span class="p">;</span><span class="w"></span>
417
+ <span class="linenos">11</span><span class="p">});</span><span class="w"></span>
418
+ <span class="linenos">12</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><span class="w"></span>
419
419
  <span class="linenos">13</span>
420
- <span class="linenos">14</span><span class="c1">// This example prints:</span>
421
- <span class="linenos">15</span><span class="c1">// Hello Niels!</span>
422
- <span class="linenos">16</span><span class="c1">// Your age is: 27</span>
423
- <span class="linenos">17</span><span class="c1">// 42</span>
420
+ <span class="linenos">14</span><span class="c1">// This example prints:</span><span class="w"></span>
421
+ <span class="linenos">15</span><span class="c1">// Hello Niels!</span><span class="w"></span>
422
+ <span class="linenos">16</span><span class="c1">// Your age is: 27</span><span class="w"></span>
423
+ <span class="linenos">17</span><span class="c1">// 42</span><span class="w"></span>
424
424
  </pre></div>
425
425
  </div>
426
426
  <p>On x86 platforms, only Cdecl and Stdcall callbacks are supported.</p>
@@ -203,7 +203,7 @@
203
203
  </div>
204
204
  <article role="main">
205
205
  <section id="koffi-version">
206
- <h1>Koffi 1.3.0<a class="headerlink" href="#koffi-version" title="Permalink to this heading">#</a></h1>
206
+ <h1>Koffi 1.3.1<a class="headerlink" href="#koffi-version" title="Permalink to this heading">#</a></h1>
207
207
  <section id="overview">
208
208
  <h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading">#</a></h2>
209
209
  <p>Koffi is a <strong>fast and easy-to-use C FFI module for Node.js</strong>, featuring:</p>
@@ -317,7 +317,7 @@
317
317
  <div class="toc-tree-container">
318
318
  <div class="toc-tree">
319
319
  <ul>
320
- <li><a class="reference internal" href="#">Koffi 1.3.0</a><ul>
320
+ <li><a class="reference internal" href="#">Koffi 1.3.1</a><ul>
321
321
  <li><a class="reference internal" href="#overview">Overview</a></li>
322
322
  <li><a class="reference internal" href="#table-of-contents">Table of contents</a></li>
323
323
  <li><a class="reference internal" href="#license">License</a></li>
@@ -213,8 +213,8 @@
213
213
  </ul>
214
214
  <p>Unless very big strings or objects (at least more than one page of memory) are used, no extra allocation ever happens during calls or callbacks.</p>
215
215
  <p>The size (in bytes) of these preallocated blocks can be changed. Use <code class="docutils literal notranslate"><span class="pre">koffi.config()</span></code> to get an object with the settings, and <code class="docutils literal notranslate"><span class="pre">koffi.config(obj)</span></code> to apply new settings.</p>
216
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">let</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span>
217
- <span class="linenos">2</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span>
216
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">let</span><span class="w"> </span><span class="nx">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span><span class="w"></span>
217
+ <span class="linenos">2</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span><span class="w"></span>
218
218
  </pre></div>
219
219
  </div>
220
220
  <p>The same is true for asynchronous calls. When an asynchronous call is made, Koffi will allocate new blocks unless there is an unused (resident) set of blocks still available. Once the asynchronous call is finished, these blocks are freed if there are more than <code class="docutils literal notranslate"><span class="pre">resident_async_pools</span></code> sets of blocks left around.</p>
Binary file
@@ -3,7 +3,7 @@
3
3
  <head><meta charset="utf-8"/>
4
4
  <meta name="viewport" content="width=device-width,initial-scale=1"/>
5
5
  <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
6
- <link rel="index" title="Index" href="genindex" /><link rel="search" title="Search" href="search" /><link rel="next" title="Quick start" href="start" /><link rel="prev" title="Koffi 1.3.0" href="index" />
6
+ <link rel="index" title="Index" href="genindex" /><link rel="search" title="Search" href="search" /><link rel="next" title="Quick start" href="start" /><link rel="prev" title="Koffi 1.3.1" href="index" />
7
7
 
8
8
  <meta name="generator" content="sphinx-5.0.1, furo 2022.06.04.1"/>
9
9
  <title>Supported platforms - Koffi</title>
@@ -1 +1 @@
1
- Search.setIndex({"docnames": ["benchmarks", "contribute", "functions", "index", "memory", "platforms", "start", "types"], "filenames": ["benchmarks.md", "contribute.md", "functions.md", "index.rst", "memory.md", "platforms.md", "start.md", "types.md"], "titles": ["Benchmarks", "Contributing", "Function calls", "Koffi 1.3.0", "Memory usage", "Supported platforms", "Quick start", "Data types"], "terms": {"here": [0, 1, 2, 3, 7], "quick": [0, 3], "overview": 0, "execut": 0, "time": [0, 1, 6], "koffi": [0, 1, 2, 4, 5, 6, 7], "call": [0, 3, 4, 5, 6, 7], "three": [0, 6, 7], "test": [0, 3, 5], "case": [0, 1, 2, 7], "one": [0, 2, 4, 6, 7], "base": [0, 2, 3, 7], "around": [0, 4, 7], "compar": 0, "theoret": 0, "ideal": 0, "implement": [0, 7], "These": [0, 1, 7], "ar": [0, 1, 2, 4, 5, 6, 7], "detail": 0, "explain": 0, "below": [0, 1, 2, 6, 7], "node": [0, 1, 2, 3, 6], "ffi": [0, 2, 3, 6], "napi": 0, "thi": [0, 1, 2, 3, 6, 7], "repeat": 0, "simpl": [0, 1, 2, 7], "standard": [0, 2, 7], "c": [0, 1, 3, 4, 5, 6], "function": [0, 1, 3, 6, 7], "ha": [0, 1, 2, 7], "first": [0, 1, 2, 6, 7], "refer": [0, 3, 7], "through": [0, 2, 7], "an": [0, 2, 4, 7], "n": [0, 5, 6, 7], "api": [0, 1, 2, 6, 7], "modul": [0, 3], "close": [0, 7], "limit": 0, "perfect": 0, "overhead": [0, 3], "js": [0, 1, 2, 3, 5, 7], "second": [0, 2, 6, 7], "third": [0, 7], "us": [0, 1, 3, 4, 5, 6, 7], "offici": [0, 1, 5], "becaus": [0, 1, 2, 7], "pretti": [0, 1], "small": [0, 2, 3], "clearli": 0, "visibl": 0, "The": [0, 1, 2, 4, 5, 6, 7], "were": 0, "measur": 0, "my": 0, "machin": [0, 1], "amd": 0, "ryzen": 0, "7": 0, "4700u": 0, "iter": [0, 7], "total": [0, 7], "rand_napi": 0, "20000000": 0, "1": [0, 1, 4, 5, 7], "44": 0, "baselin": 0, "rand_koffi": 0, "2": [0, 3, 4, 5, 7], "60": 0, "x1": 0, "81": [0, 1], "rand_node_ffi": 0, "107": 0, "58": 0, "x75": 0, "intel": 0, "core": 0, "i5": 0, "4460": 0, "10": 0, "3": [0, 1, 5, 7], "87": 0, "84": 0, "x42": 0, "similar": [0, 2], "which": [0, 1, 5, 6], "take": [0, 7], "string": [0, 1, 2, 4, 6], "paramet": [0, 3, 6, 7], "javascript": [0, 3, 7], "v8": [0, 2], "convers": [0, 7], "rel": 0, "slow": [0, 1], "heavi": 0, "atoi_napi": 0, "97": 0, "atoi_koffi": 0, "5": [0, 2, 7], "07": 0, "71": 0, "atoi_node_ffi": 0, "693": 0, "16": [0, 7], "x233": 0, "91": 0, "99": 0, "479": 0, "34": 0, "x161": 0, "cpu": 0, "imag": 0, "draw": 0, "much": [0, 1], "heavier": 0, "than": [0, 4], "thu": 0, "reduc": 0, "In": [0, 2, 7], "full": [0, 1, 7], "version": [0, 1, 2, 3, 7], "code": [0, 3, 4], "nativ": 0, "wrapper": 0, "raylib_cc": 0, "100": 0, "9": 0, "31": 0, "raylib_node_raylib": 0, "90": 0, "17": 0, "raylib_koffi": 0, "12": [0, 1], "86": 0, "38": 0, "raylib_node_ffi": 0, "35": 0, "76": 0, "x3": 0, "67": 0, "05": 0, "13": 0, "14": [0, 7], "39": 0, "63": 0, "x4": 0, "18": [0, 7], "open": [0, 2, 7], "consol": [0, 2, 4, 7], "go": [0, 1], "cnoke": [0, 1], "befor": [0, 7], "do": [0, 1, 7], "anyth": 0, "els": [0, 7], "cd": [0, 1], "onc": [0, 1, 2, 4, 6, 7], "done": [0, 1, 2, 7], "you": [0, 1, 2, 3, 5, 6, 7], "can": [0, 1, 2, 3, 4, 5, 6, 7], "each": [0, 1, 2, 7], "e": [0, 2, 7], "g": [0, 1, 2, 7], "build": [0, 3, 5, 7], "option": [0, 1, 2, 3, 7], "defin": [0, 7], "custom": 0, "number": [0, 4, 7], "10000000": 0, "repositori": 1, "name": [1, 2, 7], "luigi": 1, "monorepo": 1, "contain": [1, 7], "multipl": 1, "project": 1, "idea": 1, "http": [1, 3], "github": 1, "com": 1, "koromix": 1, "issu": [1, 2], "we": [1, 7], "provid": [1, 2, 7], "prebuilt": [1, 5], "binari": [1, 5], "packag": [1, 5], "npm": [1, 5, 6], "archiv": 1, "so": [1, 2, 6, 7], "most": [1, 2, 7], "should": 1, "instal": [1, 5, 6], "If": 1, "want": 1, "hack": 1, "specif": [1, 4], "follow": [1, 2, 5, 7], "instruct": [1, 2], "make": 1, "sure": 1, "depend": [1, 2, 7], "met": 1, "desktop": 1, "develop": 1, "workload": 1, "visual": 1, "studio": 1, "2022": 1, "2019": 1, "tool": 1, "default": [1, 2, 3, 7], "compon": 1, "cmake": 1, "meta": 1, "system": [1, 6], "later": [1, 3], "command": 1, "benchmark": [1, 3], "directori": [1, 7], "what": 1, "gcc": 1, "8": [1, 2, 7], "newer": 1, "gnu": [1, 3], "architectur": [1, 2, 3, 5, 7], "emul": 1, "acceler": 1, "when": [1, 2, 4, 7], "possibl": [1, 7], "qemu": 1, "need": [1, 2, 7], "even": 1, "gui": 1, "ubuntu": 1, "includ": [1, 2, 5, 7], "directli": [1, 7], "licens": 1, "size": [1, 3, 4], "reason": [1, 7], "thei": [1, 2, 7], "avail": [1, 4], "dev": 1, "file": [1, 2, 7], "For": [1, 2, 4, 5, 7], "exampl": [1, 3, 7], "debian": 1, "arm64": [1, 5], "wget": 1, "q": 1, "o": [1, 7], "qemu_debian_arm64": 1, "tar": 1, "zst": 1, "zstd": 1, "d": [1, 2, 7], "xv": 1, "sha256sum": 1, "ignor": [1, 2], "miss": 1, "registri": 1, "txt": 1, "note": [1, 7], "disk": 1, "content": [1, 7], "mai": 1, "chang": [1, 2, 4, 7], "checksum": 1, "fail": [1, 2, 7], "been": 1, "least": [1, 4], "And": [1, 6], "now": [1, 6, 7], "sever": [1, 2], "help": 1, "patient": 1, "linux": [1, 3, 5], "have": [1, 6, 7], "ccach": 1, "subsequ": [1, 4], "step": 1, "get": [1, 4, 6, 7], "more": [1, 2, 3, 4, 7], "toler": 1, "By": [1, 2, 7], "start": [1, 2, 3], "stop": 1, "But": [1, 7], "ahead": 1, "instead": [1, 7], "without": [1, 5], "shut": 1, "down": 1, "again": 1, "everyth": 1, "also": [1, 7], "restrict": 1, "subset": 1, "cycl": 1, "debian_x64": 1, "debian_i386": 1, "separ": 1, "shutdown": 1, "final": [1, 7], "join": 1, "ssh": 1, "shortcut": 1, "some": [1, 7], "debug": 1, "ani": [1, 3, 7], "manual": 1, "procedur": [1, 2], "configur": 1, "vnc": 1, "server": 1, "local": [1, 6], "access": 1, "displai": 1, "krdc": 1, "compat": 1, "viewer": 1, "info": 1, "port": 1, "after": [1, 2], "releas": 1, "0": [1, 2, 7], "current": [1, 6, 7], "prioriti": 1, "next": [1, 7], "major": 1, "autom": 1, "aarch64": [1, 5], "maco": [1, 5], "how": [1, 2, 3, 7], "creat": [1, 2, 7], "real": 1, "world": [1, 2, 6, 7], "librari": [1, 2, 6, 7], "raylib": [1, 3], "sqlite": [1, 2], "libsodium": 1, "illustr": [1, 6, 7], "work": [1, 3], "variou": 1, "style": [1, 2], "plan": 1, "eventu": 1, "necessarili": 1, "order": [1, 2], "optim": 1, "pass": [1, 2, 7], "struct": [1, 3, 4, 6], "arrai": [1, 3], "hfa": 1, "helper": 1, "add": [1, 7], "type": [1, 2, 3, 6], "parser": [1, 2], "wai": [1, 6, 7], "encod": [1, 7], "decod": 1, "byte": [1, 4, 7], "support": [1, 2, 3, 7], "union": 1, "better": 1, "automat": [1, 2], "deal": [1, 7], "caller": 1, "heap": [1, 4], "alloc": [1, 4, 7], "memori": [1, 2, 3, 7], "etc": [1, 2], "powerpc": 1, "power9": 1, "abi": [1, 5, 7], "To": 2, "declar": [2, 6, 7], "load": [2, 6, 7], "share": [2, 6, 7], "const": [2, 6, 7], "requir": [2, 6, 7], "lib": [2, 6, 7], "path": [2, 7], "extens": 2, "platform": [2, 3, 4, 7], "dll": [2, 6, 7], "dylib": 2, "return": [2, 7], "object": [2, 4, 7], "from": [2, 3, 5, 7], "two": [2, 4, 7], "inspir": 2, "specifi": [2, 7], "its": [2, 7], "non": [2, 7], "mangl": 2, "ellipsi": 2, "last": [2, 7], "printf": [2, 6], "func": [2, 6, 7], "int": [2, 6, 7], "atoi": [2, 3], "tri": 2, "x86": [2, 5, 6], "convent": [2, 5, 6], "see": [2, 3, 7], "section": [2, 7], "inform": [2, 3, 7], "subject": 2, "shown": 2, "char": [2, 6, 7], "fmt": 2, "happen": [2, 4, 7], "onli": [2, 5, 7], "per": 2, "process": 2, "32": 2, "bit": 2, "except": 2, "form": 2, "descript": [2, 4], "cdecl": [2, 5], "other": [2, 7], "stdcall": [2, 5, 6], "__stdcall": [2, 7], "within": 2, "win32": [2, 6, 7], "fastcal": [2, 5], "__fastcal": 2, "rare": [2, 7], "ecx": 2, "edx": 2, "thiscal": [2, 5], "__thiscal": 2, "safe": 2, "simpli": [2, 7], "find": [2, 3, 6, 7], "show": [2, 6, 7], "user32": [2, 6], "equival": [2, 7], "messageboxa_1": 2, "messageboxa": [2, 6], "void": [2, 6, 7], "uint": [2, 6, 7], "messageboxa_2": 2, "hwnd": 2, "text": 2, "caption": 2, "async": 2, "member": [2, 7], "argument": [2, 7], "err": 2, "re": 2, "libc": [2, 6], "6": [2, 6, 7], "str": [2, 7], "1257": 2, "log": [2, 4, 7], "result": [2, 3, 6, 7], "hello": [2, 6, 7], "program": [2, 3], "print": [2, 6, 7], "easili": 2, "convert": [2, 7], "promis": 2, "util": 2, "promisifi": 2, "cannot": [2, 7], "must": 2, "addit": [2, 7], "expect": [2, 5, 7], "valu": [2, 3, 6, 7], "doubl": [2, 5, 7], "THE": 2, "end": 2, "integ": [2, 7], "s": [2, 7], "On": 2, "forward": [2, 5], "howev": [2, 7], "mani": [2, 7], "pointer": [2, 3], "input": [2, 7], "simplici": 2, "semant": [2, 7], "primit": [2, 3], "marshal": 2, "out": [2, 7], "timev": [2, 6], "where": [2, 7], "inout": 2, "dual": 2, "same": [2, 4, 7], "msdn": 2, "qualifi": 2, "_out_": [2, 6, 7], "_inout_": [2, 7], "posix": 2, "gettimeofdai": [2, 6], "tv_sec": [2, 6], "unsign": [2, 6, 7], "tv_usec": [2, 6], "timezon": [2, 6], "tz_minuteswest": [2, 6], "tz_dsttime": [2, 6], "tv": [2, 6], "tz": [2, 6], "let": [2, 4, 6, 7], "null": [2, 6, 7], "databas": 2, "sqlite3_db": 2, "copi": [2, 7], "sqlite3_open_v2": 2, "sqlite_open_readwrit": 2, "0x2": 2, "sqlite_open_cr": 2, "0x4": 2, "db": 2, "throw": [2, 7], "new": [2, 4, 7], "error": [2, 7], "sqlite3_close_v2": 2, "With": 2, "noth": 2, "examplecallback": 2, "float": [2, 5, 7], "sum": [2, 7], "adddoublefloat": 2, "f": [2, 7], "your": [2, 3], "them": [2, 7], "part": 2, "h": [2, 7], "transfertoj": 2, "ag": 2, "cb": 2, "buf": 2, "64": [2, 5, 7], "snprintf": 2, "sizeof": [2, 7], "transfercallback": 2, "ret": 2, "niel": 2, "27": 2, "42": [2, 7], "main": 2, "precis": [2, 5], "intepret": 2, "anoth": [2, 7], "undefin": 2, "behavior": [2, 7], "lead": 2, "mess": [2, 7], "fast": 3, "easi": 3, "featur": 3, "low": 3, "perform": 3, "aggreg": 3, "data": 3, "fix": 3, "both": [3, 7], "callback": [3, 4, 5, 7], "sinc": 3, "well": 3, "popular": 3, "os": [3, 5, 7], "combin": [3, 5], "window": [3, 5], "introspect": 3, "definit": [3, 7], "synchron": [3, 4], "asynchron": [3, 4], "variad": [3, 6], "output": [3, 6, 7], "usag": 3, "set": 3, "rand": 3, "run": [3, 6], "contribut": 3, "bug": 3, "request": 3, "sourc": [3, 5], "todo": 3, "list": [3, 7], "free": [3, 7], "softwar": 3, "redistribut": 3, "modifi": [3, 7], "under": 3, "term": 3, "affero": 3, "gener": [3, 7], "public": 3, "publish": 3, "foundat": 3, "either": [3, 7], "www": 3, "org": 3, "normal": [4, 7], "prealloc": 4, "block": 4, "One": 4, "construct": 4, "assign": [4, 7], "stack": 4, "assembl": 4, "mib": 4, "big": [4, 7], "unless": 4, "veri": 4, "page": 4, "extra": 4, "ever": 4, "dure": 4, "config": 4, "obj": 4, "appli": [4, 7], "true": [4, 7], "made": 4, "unus": 4, "resid": 4, "still": 4, "finish": 4, "freed": 4, "resident_async_pool": 4, "left": 4, "sync_stack_s": 4, "sync_heap_s": 4, "async_stack_s": 4, "512": 4, "kib": 4, "async_heap_s": 4, "pool": 4, "moment": 5, "isa": 5, "freebsd": 5, "openbsd": 5, "ia32": 5, "ye": 5, "A": [5, 7], "x86_64": 5, "amd64": 5, "arm32": 5, "le": [5, 7], "probabl": 5, "risc": 5, "v": 5, "all": [5, 7], "fulli": 5, "green": 5, "check": 5, "mark": 5, "mean": [5, 7], "compil": 5, "ms": 5, "hard": 5, "vfp": 5, "coprocessor": 5, "differ": [5, 7], "softfp": 5, "soft": 5, "lp64d": 5, "lp64": [5, 7], "theori": 5, "untest": 5, "lp64f": 5, "like": [6, 7], "prototyp": 6, "languag": 6, "syntax": 6, "It": [6, 7], "time_t": 6, "int64_t": [6, 7], "tm": 6, "tm_sec": 6, "tm_min": 6, "tm_hour": 6, "tm_mdai": 6, "tm_mon": 6, "tm_year": 6, "tm_wdai": 6, "tm_ydai": 6, "tm_isdst": 6, "localtime_r": 6, "format": 6, "02d": 6, "target": 6, "messagebox": 6, "messag": 6, "user": [6, 7], "constant": 6, "mb_iconinform": 6, "0x40": 6, "foobar": 6, "while": 7, "allow": 7, "variat": 7, "enforc": 7, "signed": 7, "valid": 7, "int8": 7, "sign": 7, "int8_t": 7, "uint8": 7, "uint8_t": 7, "uchar": 7, "char16": 7, "char16_t": 7, "int16": 7, "int16_t": 7, "uint16": 7, "uint16_t": 7, "short": 7, "int32": 7, "4": 7, "int32_t": 7, "uint32": 7, "uint32_t": 7, "int64": 7, "uint64": 7, "uint64_t": 7, "longlong": 7, "long": 7, "ulonglong": 7, "float32": 7, "float64": 7, "few": 7, "boolean": 7, "bool": 7, "usual": 7, "llp64": 7, "ulong": 7, "utf": 7, "string16": 7, "line": 7, "struct1": 7, "dummi": 7, "struct2": 7, "vice": 7, "versa": 7, "unlik": 7, "omit": 7, "anonym": 7, "typedef": 7, "b": 7, "d1": 7, "d2": 7, "rule": 7, "regard": 7, "align": 7, "pad": 7, "latter": 7, "function1": 7, "function2": 7, "differenti": 7, "purpos": 7, "import": 7, "distinguish": 7, "fall": 7, "avoid": 7, "potenti": 7, "expens": 7, "doe": 7, "expos": 7, "sqlite3_stmt": 7, "someth": 7, "stabil": 7, "prevent": 7, "intern": 7, "dynam": 7, "termin": 7, "length": 7, "lot": 7, "getcursorpo": 7, "retriev": 7, "cursor": 7, "posit": 7, "kernel32": 7, "point": 7, "x": 7, "y": 7, "po": 7, "kind": 7, "orient": 7, "pair": 7, "dedic": 7, "delet": 7, "obviou": 7, "found": 7, "stdio": 7, "fopen": 7, "fclose": 7, "manipul": 7, "fread": 7, "ftell": 7, "manag": 7, "builder": 7, "concaten": 7, "mix": 7, "fizzbuzz": 7, "hidden": 7, "behind": 7, "destroi": 7, "concatnew": 7, "concatnewout": 7, "concatfre": 7, "clang": 7, "fpic": 7, "wall": 7, "o2": 7, "stdlib": 7, "stdbool": 7, "errno": 7, "fragment": 7, "size_t": 7, "len": 7, "concat": 7, "malloc": 7, "fprintf": 7, "stderr": 7, "strerror": 7, "fals": 7, "concatappend": 7, "frag": 7, "strlen": 7, "memcpi": 7, "concatbuild": 7, "r": 7, "stupid": 7, "try": 7, "failur": 7, "i": 7, "30": 7, "15": 7, "buzz": 7, "fizz": 7, "infer": 7, "itself": 7, "sentinel": 7, "translat": 7, "typedarrai": 7, "proper": 7, "notion": 7, "fat": 7, "yourself": 7, "calcul": 7, "stdint": 7, "computetotallength": 7, "ptr": 7, "14n": 7, "just": 7, "direct": 7, "document": 7, "findfirstfilew": 7, "findnextfilew": 7, "filetim": 7, "dwlowdatetim": 7, "dwhighdatetim": 7, "win32_find_data": 7, "dwfileattribut": 7, "ftcreationtim": 7, "ftlastaccesstim": 7, "ftlastwritetim": 7, "nfilesizehigh": 7, "nfilesizelow": 7, "dwreserved0": 7, "dwreserved1": 7, "cfilenam": 7, "260": 7, "calternatefilenam": 7, "dwfiletyp": 7, "obsolet": 7, "dwcreatortyp": 7, "wfinderflag": 7, "ushort": 7, "findfirstfil": 7, "findnextfil": 7, "findclos": 7, "getlasterror": 7, "dirnam": 7, "filenam": 7, "error_file_not_found": 7, "push": 7, "error_no_more_fil": 7, "among": 7, "variabl": 7, "invol": 7, "list1": 7, "list2": 7, "thank": 7, "transpar": 7, "approxim": 7, "singl": 7, "element": 7, "store": 7, "addint": 7, "dest": 7, "36": 7, "degener": 7, "emb": 7, "correct": 7, "uint8arrai": 7, "hint": 7, "those": 7, "exactli": 7, "foo1": 7, "foo": 7, "a16": 7, "foo2": 7, "hypothet": 7, "returnfoo1": 7, "returnfoo": 7, "p": 7, "returnfoo2": 7, "int16arrai": 7, "fill": 7, "truncat": 7, "buffer": 7, "alwai": 7, "nul": 7, "revers": 7, "explicitli": 7, "ask": 7, "explor": 7, "alignof": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "rand": 0, "result": 0, "linux": [0, 6], "x86_64": 0, "window": [0, 1, 6], "atoi": 0, "raylib": 0, "run": [0, 1], "contribut": 1, "bug": 1, "featur": 1, "request": 1, "build": 1, "from": 1, "sourc": 1, "other": 1, "platform": [1, 5], "test": 1, "todo": 1, "list": 1, "function": 2, "call": 2, "definit": 2, "classic": 2, "syntax": 2, "c": [2, 7], "like": 2, "prototyp": 2, "synchron": 2, "asynchron": 2, "variad": 2, "output": 2, "paramet": 2, "struct": [2, 7], "exampl": [2, 6], "opaqu": [2, 7], "handl": [2, 7], "javascript": 2, "callback": 2, "us": 2, "thread": 2, "safeti": 2, "koffi": 3, "overview": 3, "tabl": 3, "content": 3, "licens": 3, "memori": 4, "usag": 4, "how": 4, "work": 4, "default": 4, "set": 4, "support": 5, "quick": 6, "start": 6, "small": 6, "data": 7, "type": 7, "primit": 7, "pointer": 7, "arrai": 7, "fix": 7, "size": 7, "string": 7, "introspect": 7, "1": 3, "2": [], "4": [], "3": 3, "0": 3, "rc": []}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})
1
+ Search.setIndex({"docnames": ["benchmarks", "contribute", "functions", "index", "memory", "platforms", "start", "types"], "filenames": ["benchmarks.md", "contribute.md", "functions.md", "index.rst", "memory.md", "platforms.md", "start.md", "types.md"], "titles": ["Benchmarks", "Contributing", "Function calls", "Koffi 1.3.1", "Memory usage", "Supported platforms", "Quick start", "Data types"], "terms": {"here": [0, 1, 2, 3, 7], "quick": [0, 3], "overview": 0, "execut": 0, "time": [0, 1, 6], "koffi": [0, 1, 2, 4, 5, 6, 7], "call": [0, 3, 4, 5, 6, 7], "three": [0, 6, 7], "test": [0, 3, 5], "case": [0, 1, 2, 7], "one": [0, 2, 4, 6, 7], "base": [0, 2, 3, 7], "around": [0, 4, 7], "compar": 0, "theoret": 0, "ideal": 0, "implement": [0, 7], "These": [0, 1, 7], "ar": [0, 1, 2, 4, 5, 6, 7], "detail": 0, "explain": 0, "below": [0, 1, 2, 6, 7], "node": [0, 1, 2, 3, 6], "ffi": [0, 2, 3, 6], "napi": 0, "thi": [0, 1, 2, 3, 6, 7], "repeat": 0, "simpl": [0, 1, 2, 7], "standard": [0, 2, 7], "c": [0, 1, 3, 4, 5, 6], "function": [0, 1, 3, 6, 7], "ha": [0, 1, 2, 7], "first": [0, 1, 2, 6, 7], "refer": [0, 3, 7], "through": [0, 2, 7], "an": [0, 2, 4, 7], "n": [0, 5, 6, 7], "api": [0, 1, 2, 6, 7], "modul": [0, 3], "close": [0, 7], "limit": 0, "perfect": 0, "overhead": [0, 3], "js": [0, 1, 2, 3, 5, 7], "second": [0, 2, 6, 7], "third": [0, 7], "us": [0, 1, 3, 4, 5, 6, 7], "offici": [0, 1, 5], "becaus": [0, 1, 2, 7], "pretti": [0, 1], "small": [0, 2, 3], "clearli": 0, "visibl": 0, "The": [0, 1, 2, 4, 5, 6, 7], "were": 0, "measur": 0, "my": 0, "machin": [0, 1], "amd": 0, "ryzen": 0, "7": 0, "4700u": 0, "iter": [0, 7], "total": [0, 7], "rand_napi": 0, "20000000": 0, "1": [0, 1, 4, 5, 7], "44": 0, "baselin": 0, "rand_koffi": 0, "2": [0, 3, 4, 5, 7], "60": 0, "x1": 0, "81": [0, 1], "rand_node_ffi": 0, "107": 0, "58": 0, "x75": 0, "intel": 0, "core": 0, "i5": 0, "4460": 0, "10": 0, "3": [0, 1, 5, 7], "87": 0, "84": 0, "x42": 0, "similar": [0, 2], "which": [0, 1, 5, 6], "take": [0, 7], "string": [0, 1, 2, 4, 6], "paramet": [0, 3, 6, 7], "javascript": [0, 3, 7], "v8": [0, 2], "convers": [0, 7], "rel": 0, "slow": [0, 1], "heavi": 0, "atoi_napi": 0, "97": 0, "atoi_koffi": 0, "5": [0, 2, 7], "07": 0, "71": 0, "atoi_node_ffi": 0, "693": 0, "16": [0, 7], "x233": 0, "91": 0, "99": 0, "479": 0, "34": 0, "x161": 0, "cpu": 0, "imag": 0, "draw": 0, "much": [0, 1], "heavier": 0, "than": [0, 4], "thu": 0, "reduc": 0, "In": [0, 2, 7], "full": [0, 1, 7], "version": [0, 1, 2, 3, 7], "code": [0, 3, 4], "nativ": 0, "wrapper": 0, "raylib_cc": 0, "100": 0, "9": 0, "31": 0, "raylib_node_raylib": 0, "90": 0, "17": 0, "raylib_koffi": 0, "12": [0, 1], "86": 0, "38": 0, "raylib_node_ffi": 0, "35": 0, "76": 0, "x3": 0, "67": 0, "05": 0, "13": 0, "14": [0, 7], "39": 0, "63": 0, "x4": 0, "18": [0, 7], "open": [0, 2, 7], "consol": [0, 2, 4, 7], "go": [0, 1], "cnoke": [0, 1], "befor": [0, 7], "do": [0, 1, 7], "anyth": 0, "els": [0, 7], "cd": [0, 1], "onc": [0, 1, 2, 4, 6, 7], "done": [0, 1, 2, 7], "you": [0, 1, 2, 3, 5, 6, 7], "can": [0, 1, 2, 3, 4, 5, 6, 7], "each": [0, 1, 2, 7], "e": [0, 2, 7], "g": [0, 1, 2, 7], "build": [0, 3, 5, 7], "option": [0, 1, 2, 3, 7], "defin": [0, 7], "custom": 0, "number": [0, 4, 7], "10000000": 0, "repositori": 1, "name": [1, 2, 7], "luigi": 1, "monorepo": 1, "contain": [1, 7], "multipl": 1, "project": 1, "idea": 1, "http": [1, 3], "github": 1, "com": 1, "koromix": 1, "issu": [1, 2], "we": [1, 7], "provid": [1, 2, 7], "prebuilt": [1, 5], "binari": [1, 5], "packag": [1, 5], "npm": [1, 5, 6], "archiv": 1, "so": [1, 2, 6, 7], "most": [1, 2, 7], "should": 1, "instal": [1, 5, 6], "If": 1, "want": 1, "hack": 1, "specif": [1, 4], "follow": [1, 2, 5, 7], "instruct": [1, 2], "make": 1, "sure": 1, "depend": [1, 2, 7], "met": 1, "desktop": 1, "develop": 1, "workload": 1, "visual": 1, "studio": 1, "2022": 1, "2019": 1, "tool": 1, "default": [1, 2, 3, 7], "compon": 1, "cmake": 1, "meta": 1, "system": [1, 6], "later": [1, 3], "command": 1, "benchmark": [1, 3], "directori": [1, 7], "what": 1, "gcc": 1, "8": [1, 2, 7], "newer": 1, "gnu": [1, 3], "architectur": [1, 2, 3, 5, 7], "emul": 1, "acceler": 1, "when": [1, 2, 4, 7], "possibl": [1, 7], "qemu": 1, "need": [1, 2, 7], "even": 1, "gui": 1, "ubuntu": 1, "includ": [1, 2, 5, 7], "directli": [1, 7], "licens": 1, "size": [1, 3, 4], "reason": [1, 7], "thei": [1, 2, 7], "avail": [1, 4], "dev": 1, "file": [1, 2, 7], "For": [1, 2, 4, 5, 7], "exampl": [1, 3, 7], "debian": 1, "arm64": [1, 5], "wget": 1, "q": 1, "o": [1, 7], "qemu_debian_arm64": 1, "tar": 1, "zst": 1, "zstd": 1, "d": [1, 2, 7], "xv": 1, "sha256sum": 1, "ignor": [1, 2], "miss": 1, "registri": 1, "txt": 1, "note": [1, 7], "disk": 1, "content": [1, 7], "mai": 1, "chang": [1, 2, 4, 7], "checksum": 1, "fail": [1, 2, 7], "been": 1, "least": [1, 4], "And": [1, 6], "now": [1, 6, 7], "sever": [1, 2], "help": 1, "patient": 1, "linux": [1, 3, 5], "have": [1, 6, 7], "ccach": 1, "subsequ": [1, 4], "step": 1, "get": [1, 4, 6, 7], "more": [1, 2, 3, 4, 7], "toler": 1, "By": [1, 2, 7], "start": [1, 2, 3], "stop": 1, "But": [1, 7], "ahead": 1, "instead": [1, 7], "without": [1, 5], "shut": 1, "down": 1, "again": 1, "everyth": 1, "also": [1, 7], "restrict": 1, "subset": 1, "cycl": 1, "debian_x64": 1, "debian_i386": 1, "separ": 1, "shutdown": 1, "final": [1, 7], "join": 1, "ssh": 1, "shortcut": 1, "some": [1, 7], "debug": 1, "ani": [1, 3, 7], "manual": 1, "procedur": [1, 2], "configur": 1, "vnc": 1, "server": 1, "local": [1, 6], "access": 1, "displai": 1, "krdc": 1, "compat": 1, "viewer": 1, "info": 1, "port": 1, "after": [1, 2], "releas": 1, "0": [1, 2, 3, 7], "current": [1, 6, 7], "prioriti": 1, "next": [1, 7], "major": 1, "autom": 1, "aarch64": [1, 5], "maco": [1, 5], "how": [1, 2, 3, 7], "creat": [1, 2, 7], "real": 1, "world": [1, 2, 6, 7], "librari": [1, 2, 6, 7], "raylib": [1, 3], "sqlite": [1, 2], "libsodium": 1, "illustr": [1, 6, 7], "work": [1, 3], "variou": 1, "style": [1, 2], "plan": 1, "eventu": 1, "necessarili": 1, "order": [1, 2], "optim": 1, "pass": [1, 2, 7], "struct": [1, 3, 4, 6], "arrai": [1, 3], "hfa": 1, "helper": 1, "add": [1, 7], "type": [1, 2, 3, 6], "parser": [1, 2], "wai": [1, 6, 7], "encod": [1, 7], "decod": 1, "byte": [1, 4, 7], "support": [1, 2, 3, 7], "union": 1, "better": 1, "automat": [1, 2], "deal": [1, 7], "caller": 1, "heap": [1, 4], "alloc": [1, 4, 7], "memori": [1, 2, 3, 7], "etc": [1, 2], "powerpc": 1, "power9": 1, "abi": [1, 5, 7], "To": 2, "declar": [2, 6, 7], "load": [2, 6, 7], "share": [2, 6, 7], "const": [2, 6, 7], "requir": [2, 6, 7], "lib": [2, 6, 7], "path": [2, 7], "extens": 2, "platform": [2, 3, 4, 7], "dll": [2, 6, 7], "dylib": 2, "return": [2, 7], "object": [2, 4, 7], "from": [2, 3, 5, 7], "two": [2, 4, 7], "inspir": 2, "specifi": [2, 7], "its": [2, 7], "non": [2, 7], "mangl": 2, "ellipsi": 2, "last": [2, 7], "printf": [2, 6], "func": [2, 6, 7], "int": [2, 6, 7], "atoi": [2, 3], "tri": 2, "x86": [2, 5, 6], "convent": [2, 5, 6], "see": [2, 3, 7], "section": [2, 7], "inform": [2, 3, 7], "subject": 2, "shown": 2, "char": [2, 6, 7], "fmt": 2, "happen": [2, 4, 7], "onli": [2, 5, 7], "per": 2, "process": 2, "32": 2, "bit": 2, "except": 2, "form": 2, "descript": [2, 4], "cdecl": [2, 5], "other": [2, 7], "stdcall": [2, 5, 6], "__stdcall": [2, 7], "within": 2, "win32": [2, 6, 7], "fastcal": [2, 5], "__fastcal": 2, "rare": [2, 7], "ecx": 2, "edx": 2, "thiscal": [2, 5], "__thiscal": 2, "safe": 2, "simpli": [2, 7], "find": [2, 3, 6, 7], "show": [2, 6, 7], "user32": [2, 6], "equival": [2, 7], "messageboxa_1": 2, "messageboxa": [2, 6], "void": [2, 6, 7], "uint": [2, 6, 7], "messageboxa_2": 2, "hwnd": 2, "text": 2, "caption": 2, "async": 2, "member": [2, 7], "argument": [2, 7], "err": 2, "re": 2, "libc": [2, 6], "6": [2, 6, 7], "str": [2, 7], "1257": 2, "log": [2, 4, 7], "result": [2, 3, 6, 7], "hello": [2, 6, 7], "program": [2, 3], "print": [2, 6, 7], "easili": 2, "convert": [2, 7], "promis": 2, "util": 2, "promisifi": 2, "cannot": [2, 7], "must": 2, "addit": [2, 7], "expect": [2, 5, 7], "valu": [2, 3, 6, 7], "doubl": [2, 5, 7], "THE": 2, "end": 2, "integ": [2, 7], "s": [2, 7], "On": 2, "forward": [2, 5], "howev": [2, 7], "mani": [2, 7], "pointer": [2, 3], "input": [2, 7], "simplici": 2, "semant": [2, 7], "primit": [2, 3], "marshal": 2, "out": [2, 7], "timev": [2, 6], "where": [2, 7], "inout": 2, "dual": 2, "same": [2, 4, 7], "msdn": 2, "qualifi": 2, "_out_": [2, 6, 7], "_inout_": [2, 7], "posix": 2, "gettimeofdai": [2, 6], "tv_sec": [2, 6], "unsign": [2, 6, 7], "tv_usec": [2, 6], "timezon": [2, 6], "tz_minuteswest": [2, 6], "tz_dsttime": [2, 6], "tv": [2, 6], "tz": [2, 6], "let": [2, 4, 6, 7], "null": [2, 6, 7], "databas": 2, "sqlite3_db": 2, "copi": [2, 7], "sqlite3_open_v2": 2, "sqlite_open_readwrit": 2, "0x2": 2, "sqlite_open_cr": 2, "0x4": 2, "db": 2, "throw": [2, 7], "new": [2, 4, 7], "error": [2, 7], "sqlite3_close_v2": 2, "With": 2, "noth": 2, "examplecallback": 2, "float": [2, 5, 7], "sum": [2, 7], "adddoublefloat": 2, "f": [2, 7], "your": [2, 3], "them": [2, 7], "part": 2, "h": [2, 7], "transfertoj": 2, "ag": 2, "cb": 2, "buf": 2, "64": [2, 5, 7], "snprintf": 2, "sizeof": [2, 7], "transfercallback": 2, "ret": 2, "niel": 2, "27": 2, "42": [2, 7], "main": 2, "precis": [2, 5], "intepret": 2, "anoth": [2, 7], "undefin": 2, "behavior": [2, 7], "lead": 2, "mess": [2, 7], "fast": 3, "easi": 3, "featur": 3, "low": 3, "perform": 3, "aggreg": 3, "data": 3, "fix": 3, "both": [3, 7], "callback": [3, 4, 5, 7], "sinc": 3, "well": 3, "popular": 3, "os": [3, 5, 7], "combin": [3, 5], "window": [3, 5], "introspect": 3, "definit": [3, 7], "synchron": [3, 4], "asynchron": [3, 4], "variad": [3, 6], "output": [3, 6, 7], "usag": 3, "set": 3, "rand": 3, "run": [3, 6], "contribut": 3, "bug": 3, "request": 3, "sourc": [3, 5], "todo": 3, "list": [3, 7], "free": [3, 7], "softwar": 3, "redistribut": 3, "modifi": [3, 7], "under": 3, "term": 3, "affero": 3, "gener": [3, 7], "public": 3, "publish": 3, "foundat": 3, "either": [3, 7], "www": 3, "org": 3, "normal": [4, 7], "prealloc": 4, "block": 4, "One": 4, "construct": 4, "assign": [4, 7], "stack": 4, "assembl": 4, "mib": 4, "big": [4, 7], "unless": 4, "veri": 4, "page": 4, "extra": 4, "ever": 4, "dure": 4, "config": 4, "obj": 4, "appli": [4, 7], "true": [4, 7], "made": 4, "unus": 4, "resid": 4, "still": 4, "finish": 4, "freed": 4, "resident_async_pool": 4, "left": 4, "sync_stack_s": 4, "sync_heap_s": 4, "async_stack_s": 4, "512": 4, "kib": 4, "async_heap_s": 4, "pool": 4, "moment": 5, "isa": 5, "freebsd": 5, "openbsd": 5, "ia32": 5, "ye": 5, "A": [5, 7], "x86_64": 5, "amd64": 5, "arm32": 5, "le": [5, 7], "probabl": 5, "risc": 5, "v": 5, "all": [5, 7], "fulli": 5, "green": 5, "check": 5, "mark": 5, "mean": [5, 7], "compil": 5, "ms": 5, "hard": 5, "vfp": 5, "coprocessor": 5, "differ": [5, 7], "softfp": 5, "soft": 5, "lp64d": 5, "lp64": [5, 7], "theori": 5, "untest": 5, "lp64f": 5, "like": [6, 7], "prototyp": 6, "languag": 6, "syntax": 6, "It": [6, 7], "time_t": 6, "int64_t": [6, 7], "tm": 6, "tm_sec": 6, "tm_min": 6, "tm_hour": 6, "tm_mdai": 6, "tm_mon": 6, "tm_year": 6, "tm_wdai": 6, "tm_ydai": 6, "tm_isdst": 6, "localtime_r": 6, "format": 6, "02d": 6, "target": 6, "messagebox": 6, "messag": 6, "user": [6, 7], "constant": 6, "mb_iconinform": 6, "0x40": 6, "foobar": 6, "while": 7, "allow": 7, "variat": 7, "enforc": 7, "signed": 7, "valid": 7, "int8": 7, "sign": 7, "int8_t": 7, "uint8": 7, "uint8_t": 7, "uchar": 7, "char16": 7, "char16_t": 7, "int16": 7, "int16_t": 7, "uint16": 7, "uint16_t": 7, "short": 7, "int32": 7, "4": 7, "int32_t": 7, "uint32": 7, "uint32_t": 7, "int64": 7, "uint64": 7, "uint64_t": 7, "longlong": 7, "long": 7, "ulonglong": 7, "float32": 7, "float64": 7, "few": 7, "boolean": 7, "bool": 7, "usual": 7, "llp64": 7, "ulong": 7, "utf": 7, "string16": 7, "line": 7, "struct1": 7, "dummi": 7, "struct2": 7, "vice": 7, "versa": 7, "unlik": 7, "omit": 7, "anonym": 7, "typedef": 7, "b": 7, "d1": 7, "d2": 7, "rule": 7, "regard": 7, "align": 7, "pad": 7, "latter": 7, "function1": 7, "function2": 7, "differenti": 7, "purpos": 7, "import": 7, "distinguish": 7, "fall": 7, "avoid": 7, "potenti": 7, "expens": 7, "doe": 7, "expos": 7, "sqlite3_stmt": 7, "someth": 7, "stabil": 7, "prevent": 7, "intern": 7, "dynam": 7, "termin": 7, "length": 7, "lot": 7, "getcursorpo": 7, "retriev": 7, "cursor": 7, "posit": 7, "kernel32": 7, "point": 7, "x": 7, "y": 7, "po": 7, "kind": 7, "orient": 7, "pair": 7, "dedic": 7, "delet": 7, "obviou": 7, "found": 7, "stdio": 7, "fopen": 7, "fclose": 7, "manipul": 7, "fread": 7, "ftell": 7, "manag": 7, "builder": 7, "concaten": 7, "mix": 7, "fizzbuzz": 7, "hidden": 7, "behind": 7, "destroi": 7, "concatnew": 7, "concatnewout": 7, "concatfre": 7, "clang": 7, "fpic": 7, "wall": 7, "o2": 7, "stdlib": 7, "stdbool": 7, "errno": 7, "fragment": 7, "size_t": 7, "len": 7, "concat": 7, "malloc": 7, "fprintf": 7, "stderr": 7, "strerror": 7, "fals": 7, "concatappend": 7, "frag": 7, "strlen": 7, "memcpi": 7, "concatbuild": 7, "r": 7, "stupid": 7, "try": 7, "failur": 7, "i": 7, "30": 7, "15": 7, "buzz": 7, "fizz": 7, "infer": 7, "itself": 7, "sentinel": 7, "translat": 7, "typedarrai": 7, "proper": 7, "notion": 7, "fat": 7, "yourself": 7, "calcul": 7, "stdint": 7, "computetotallength": 7, "ptr": 7, "14n": 7, "just": 7, "direct": 7, "document": 7, "findfirstfilew": 7, "findnextfilew": 7, "filetim": 7, "dwlowdatetim": 7, "dwhighdatetim": 7, "win32_find_data": 7, "dwfileattribut": 7, "ftcreationtim": 7, "ftlastaccesstim": 7, "ftlastwritetim": 7, "nfilesizehigh": 7, "nfilesizelow": 7, "dwreserved0": 7, "dwreserved1": 7, "cfilenam": 7, "260": 7, "calternatefilenam": 7, "dwfiletyp": 7, "obsolet": 7, "dwcreatortyp": 7, "wfinderflag": 7, "ushort": 7, "findfirstfil": 7, "findnextfil": 7, "findclos": 7, "getlasterror": 7, "dirnam": 7, "filenam": 7, "error_file_not_found": 7, "push": 7, "error_no_more_fil": 7, "among": 7, "variabl": 7, "invol": 7, "list1": 7, "list2": 7, "thank": 7, "transpar": 7, "approxim": 7, "singl": 7, "element": 7, "store": 7, "addint": 7, "dest": 7, "36": 7, "degener": 7, "emb": 7, "correct": 7, "uint8arrai": 7, "hint": 7, "those": 7, "exactli": 7, "foo1": 7, "foo": 7, "a16": 7, "foo2": 7, "hypothet": 7, "returnfoo1": 7, "returnfoo": 7, "p": 7, "returnfoo2": 7, "int16arrai": 7, "fill": 7, "truncat": 7, "buffer": 7, "alwai": 7, "nul": 7, "revers": 7, "explicitli": 7, "ask": 7, "explor": 7, "alignof": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "rand": 0, "result": 0, "linux": [0, 6], "x86_64": 0, "window": [0, 1, 6], "atoi": 0, "raylib": 0, "run": [0, 1], "contribut": 1, "bug": 1, "featur": 1, "request": 1, "build": 1, "from": 1, "sourc": 1, "other": 1, "platform": [1, 5], "test": 1, "todo": 1, "list": 1, "function": 2, "call": 2, "definit": 2, "classic": 2, "syntax": 2, "c": [2, 7], "like": 2, "prototyp": 2, "synchron": 2, "asynchron": 2, "variad": 2, "output": 2, "paramet": 2, "struct": [2, 7], "exampl": [2, 6], "opaqu": [2, 7], "handl": [2, 7], "javascript": 2, "callback": 2, "us": 2, "thread": 2, "safeti": 2, "koffi": 3, "overview": 3, "tabl": 3, "content": 3, "licens": 3, "memori": 4, "usag": 4, "how": 4, "work": 4, "default": 4, "set": 4, "support": 5, "quick": 6, "start": 6, "small": 6, "data": 7, "type": 7, "primit": 7, "pointer": 7, "arrai": 7, "fix": 7, "size": 7, "string": 7, "introspect": 7, "1": 3, "2": [], "4": [], "3": 3, "0": [], "rc": []}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})