koffi 1.3.3 → 1.3.4
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/ChangeLog.md +6 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_darwin_arm64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_linux_arm32hf.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.3.4/koffi_openbsd_ia32.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_openbsd_x64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_win32_arm64.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/{1.3.3 → 1.3.4}/koffi_win32_x64.tar.gz +0 -0
- package/doc/dist/html/_static/pygments.css +54 -54
- package/doc/dist/html/changes.html +8 -0
- package/doc/dist/html/functions.html +66 -66
- package/doc/dist/html/index.html +3 -2
- package/doc/dist/html/memory.html +2 -2
- package/doc/dist/html/objects.inv +0 -0
- package/doc/dist/html/platforms.html +1 -1
- package/doc/dist/html/searchindex.js +1 -1
- package/doc/dist/html/start.html +45 -45
- package/doc/dist/html/types.html +152 -152
- package/package.json +1 -1
- package/src/abi_x86.cc +5 -0
- package/build/qemu/1.3.3/koffi_openbsd_ia32.tar.gz +0 -0
package/doc/dist/html/types.html
CHANGED
|
@@ -477,9 +477,9 @@
|
|
|
477
477
|
</table>
|
|
478
478
|
</div>
|
|
479
479
|
<p>Primitive types can be specified by name (in a string) or through <code class="docutils literal notranslate"><span class="pre">koffi.types</span></code>:</p>
|
|
480
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span>
|
|
481
|
-
<span class="linenos">2</span><span class="kd">let</span>
|
|
482
|
-
<span class="linenos">3</span><span class="kd">let</span>
|
|
480
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span><span class="w"></span>
|
|
481
|
+
<span class="linenos">2</span><span class="kd">let</span><span class="w"> </span><span class="nx">struct1</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="w"> </span><span class="nx">dummy</span><span class="o">:</span><span class="w"> </span><span class="s1">'int'</span><span class="w"> </span><span class="p">});</span><span class="w"></span>
|
|
482
|
+
<span class="linenos">3</span><span class="kd">let</span><span class="w"> </span><span class="nx">struct2</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="w"> </span><span class="nx">dummy</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span><span class="w"> </span><span class="p">});</span><span class="w"></span>
|
|
483
483
|
</pre></div>
|
|
484
484
|
</div>
|
|
485
485
|
</section>
|
|
@@ -499,22 +499,22 @@
|
|
|
499
499
|
<span class="linenos">9</span><span class="p">}</span><span class="w"> </span><span class="n">A</span><span class="p">;</span><span class="w"></span>
|
|
500
500
|
</pre></div>
|
|
501
501
|
</div>
|
|
502
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span>
|
|
503
|
-
<span class="linenos">2</span>
|
|
504
|
-
<span class="linenos">3</span>
|
|
505
|
-
<span class="linenos">4</span>
|
|
506
|
-
<span class="linenos">5</span>
|
|
507
|
-
<span class="linenos">6</span>
|
|
508
|
-
<span class="linenos">7</span>
|
|
509
|
-
<span class="linenos">8</span>
|
|
510
|
-
<span class="linenos">9</span><span class="p">});</span>
|
|
502
|
+
<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">A</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">'A'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
503
|
+
<span class="linenos">2</span><span class="w"> </span><span class="nx">a</span><span class="o">:</span><span class="w"> </span><span class="s1">'int'</span><span class="p">,</span><span class="w"></span>
|
|
504
|
+
<span class="linenos">3</span><span class="w"> </span><span class="nx">b</span><span class="o">:</span><span class="w"> </span><span class="s1">'char'</span><span class="p">,</span><span class="w"></span>
|
|
505
|
+
<span class="linenos">4</span><span class="w"> </span><span class="nx">c</span><span class="o">:</span><span class="w"> </span><span class="s1">'string'</span><span class="p">,</span><span class="w"></span>
|
|
506
|
+
<span class="linenos">5</span><span class="w"> </span><span class="nx">d</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="w"></span>
|
|
507
|
+
<span class="linenos">6</span><span class="w"> </span><span class="nx">d1</span><span class="o">:</span><span class="w"> </span><span class="s1">'double'</span><span class="p">,</span><span class="w"></span>
|
|
508
|
+
<span class="linenos">7</span><span class="w"> </span><span class="nx">d2</span><span class="o">:</span><span class="w"> </span><span class="s1">'double'</span><span class="w"></span>
|
|
509
|
+
<span class="linenos">8</span><span class="w"> </span><span class="p">})</span><span class="w"></span>
|
|
510
|
+
<span class="linenos">9</span><span class="p">});</span><span class="w"></span>
|
|
511
511
|
</pre></div>
|
|
512
512
|
</div>
|
|
513
513
|
<p>Koffi follows the C and ABI rules regarding struct alignment and padding.</p>
|
|
514
514
|
<p>Once a struct is declared, you can use it by name (with a string, like you can do for primitive types) or the through the value returned by the call to <code class="docutils literal notranslate"><span class="pre">koffi.struct()</span></code>. Only the latter is possible when declaring an anonymous struct.</p>
|
|
515
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// The following two function declarations are equivalent, and declare a function taking an A value and returning A</span>
|
|
516
|
-
<span class="linenos">2</span><span class="kd">const</span>
|
|
517
|
-
<span class="linenos">3</span><span class="kd">const</span>
|
|
515
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// The following two function declarations are equivalent, and declare a function taking an A value and returning A</span><span class="w"></span>
|
|
516
|
+
<span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">Function1</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">'A Function(A value)'</span><span class="p">);</span><span class="w"></span>
|
|
517
|
+
<span class="linenos">3</span><span class="kd">const</span><span class="w"> </span><span class="nx">Function2</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">'Function'</span><span class="p">,</span><span class="w"> </span><span class="nx">A</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="nx">A</span><span class="p">]);</span><span class="w"></span>
|
|
518
518
|
</pre></div>
|
|
519
519
|
</div>
|
|
520
520
|
</section>
|
|
@@ -530,23 +530,23 @@
|
|
|
530
530
|
<section id="struct-pointers">
|
|
531
531
|
<h3>Struct pointers<a class="headerlink" href="#struct-pointers" title="Permalink to this heading">#</a></h3>
|
|
532
532
|
<p>The following Win32 example uses <code class="docutils literal notranslate"><span class="pre">GetCursorPos()</span></code> (with an output parameter) to retrieve and show the current cursor position.</p>
|
|
533
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span>
|
|
534
|
-
<span class="linenos"> 2</span><span class="kd">const</span>
|
|
533
|
+
<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">'koffi'</span><span class="p">);</span><span class="w"></span>
|
|
534
|
+
<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">'kernel32.dll'</span><span class="p">);</span><span class="w"></span>
|
|
535
535
|
<span class="linenos"> 3</span>
|
|
536
|
-
<span class="linenos"> 4</span><span class="c1">// Type declarations</span>
|
|
537
|
-
<span class="linenos"> 5</span><span class="kd">const</span>
|
|
538
|
-
<span class="linenos"> 6</span>
|
|
539
|
-
<span class="linenos"> 7</span>
|
|
540
|
-
<span class="linenos"> 8</span><span class="p">});</span>
|
|
536
|
+
<span class="linenos"> 4</span><span class="c1">// Type declarations</span><span class="w"></span>
|
|
537
|
+
<span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">POINT</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">'POINT'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
538
|
+
<span class="linenos"> 6</span><span class="w"> </span><span class="nx">x</span><span class="o">:</span><span class="w"> </span><span class="s1">'long'</span><span class="p">,</span><span class="w"></span>
|
|
539
|
+
<span class="linenos"> 7</span><span class="w"> </span><span class="nx">y</span><span class="o">:</span><span class="w"> </span><span class="s1">'long'</span><span class="w"></span>
|
|
540
|
+
<span class="linenos"> 8</span><span class="p">});</span><span class="w"></span>
|
|
541
541
|
<span class="linenos"> 9</span>
|
|
542
|
-
<span class="linenos">10</span><span class="c1">// Functions declarations</span>
|
|
543
|
-
<span class="linenos">11</span><span class="kd">const</span>
|
|
542
|
+
<span class="linenos">10</span><span class="c1">// Functions declarations</span><span class="w"></span>
|
|
543
|
+
<span class="linenos">11</span><span class="kd">const</span><span class="w"> </span><span class="nx">GetCursorPos</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">'int __stdcall GetCursorPos(_Out_ POINT *pos)'</span><span class="p">);</span><span class="w"></span>
|
|
544
544
|
<span class="linenos">12</span>
|
|
545
|
-
<span class="linenos">13</span><span class="c1">// Get and show cursor position</span>
|
|
546
|
-
<span class="linenos">14</span><span class="kd">let</span>
|
|
547
|
-
<span class="linenos">15</span><span class="k">if</span>
|
|
548
|
-
<span class="linenos">16</span>
|
|
549
|
-
<span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pos</span><span class="p">);</span>
|
|
545
|
+
<span class="linenos">13</span><span class="c1">// Get and show cursor position</span><span class="w"></span>
|
|
546
|
+
<span class="linenos">14</span><span class="kd">let</span><span class="w"> </span><span class="nx">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
|
|
547
|
+
<span class="linenos">15</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">GetCursorPos</span><span class="p">(</span><span class="nx">pos</span><span class="p">))</span><span class="w"></span>
|
|
548
|
+
<span class="linenos">16</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">'Failed to get cursor position'</span><span class="p">);</span><span class="w"></span>
|
|
549
|
+
<span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pos</span><span class="p">);</span><span class="w"></span>
|
|
550
550
|
</pre></div>
|
|
551
551
|
</div>
|
|
552
552
|
</section>
|
|
@@ -673,54 +673,54 @@
|
|
|
673
673
|
<span class="linenos">116</span><span class="p">}</span><span class="w"></span>
|
|
674
674
|
</pre></div>
|
|
675
675
|
</div>
|
|
676
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span>
|
|
677
|
-
<span class="linenos"> 2</span><span class="kd">const</span>
|
|
676
|
+
<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">'koffi'</span><span class="p">);</span><span class="w"></span>
|
|
677
|
+
<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">'./handles.so'</span><span class="p">);</span><span class="w"></span>
|
|
678
678
|
<span class="linenos"> 3</span>
|
|
679
|
-
<span class="linenos"> 4</span><span class="kd">const</span>
|
|
680
|
-
<span class="linenos"> 5</span><span class="kd">const</span>
|
|
681
|
-
<span class="linenos"> 6</span><span class="kd">const</span>
|
|
682
|
-
<span class="linenos"> 7</span><span class="kd">const</span>
|
|
683
|
-
<span class="linenos"> 8</span><span class="kd">const</span>
|
|
684
|
-
<span class="linenos"> 9</span><span class="kd">const</span>
|
|
679
|
+
<span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">Concat</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">'Concat'</span><span class="p">);</span><span class="w"></span>
|
|
680
|
+
<span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatNewOut</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">'bool ConcatNewOut(Concat *out)'</span><span class="p">);</span><span class="w"></span>
|
|
681
|
+
<span class="linenos"> 6</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatNew</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">'Concat ConcatNew()'</span><span class="p">);</span><span class="w"></span>
|
|
682
|
+
<span class="linenos"> 7</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatFree</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">'void ConcatFree(Concat c)'</span><span class="p">);</span><span class="w"></span>
|
|
683
|
+
<span class="linenos"> 8</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatAppend</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">'bool ConcatAppend(Concat c, const char *frag)'</span><span class="p">);</span><span class="w"></span>
|
|
684
|
+
<span class="linenos"> 9</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatBuild</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">'const char *ConcatBuild(Concat c)'</span><span class="p">);</span><span class="w"></span>
|
|
685
685
|
<span class="linenos">10</span>
|
|
686
|
-
<span class="linenos">11</span><span class="kd">let</span>
|
|
687
|
-
<span class="linenos">12</span><span class="k">if</span>
|
|
688
|
-
<span class="linenos">13</span>
|
|
689
|
-
<span class="linenos">14</span>
|
|
690
|
-
<span class="linenos">15</span>
|
|
691
|
-
<span class="linenos">16</span><span class="p">}</span>
|
|
686
|
+
<span class="linenos">11</span><span class="kd">let</span><span class="w"> </span><span class="nx">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ConcatNew</span><span class="p">();</span><span class="w"></span>
|
|
687
|
+
<span class="linenos">12</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">c</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
688
|
+
<span class="linenos">13</span><span class="w"> </span><span class="c1">// This is stupid, it does the same, but try both versions (return value, output parameter)</span><span class="w"></span>
|
|
689
|
+
<span class="linenos">14</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatNewOut</span><span class="p">(</span><span class="nx">c</span><span class="p">))</span><span class="w"></span>
|
|
690
|
+
<span class="linenos">15</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">'Allocation failure'</span><span class="p">);</span><span class="w"></span>
|
|
691
|
+
<span class="linenos">16</span><span class="p">}</span><span class="w"></span>
|
|
692
692
|
<span class="linenos">17</span>
|
|
693
|
-
<span class="linenos">18</span><span class="k">try</span>
|
|
694
|
-
<span class="linenos">19</span>
|
|
695
|
-
<span class="linenos">20</span>
|
|
696
|
-
<span class="linenos">21</span>
|
|
697
|
-
<span class="linenos">22</span>
|
|
693
|
+
<span class="linenos">18</span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
694
|
+
<span class="linenos">19</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="s1">'Hello... '</span><span class="p">))</span><span class="w"></span>
|
|
695
|
+
<span class="linenos">20</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">'Allocation failure'</span><span class="p">);</span><span class="w"></span>
|
|
696
|
+
<span class="linenos">21</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="s1">'World!\n'</span><span class="p">))</span><span class="w"></span>
|
|
697
|
+
<span class="linenos">22</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">'Allocation failure'</span><span class="p">);</span><span class="w"></span>
|
|
698
698
|
<span class="linenos">23</span>
|
|
699
|
-
<span class="linenos">24</span>
|
|
700
|
-
<span class="linenos">25</span>
|
|
701
|
-
<span class="linenos">26</span>
|
|
702
|
-
<span class="linenos">27</span>
|
|
703
|
-
<span class="linenos">28</span>
|
|
704
|
-
<span class="linenos">29</span>
|
|
705
|
-
<span class="linenos">30</span>
|
|
706
|
-
<span class="linenos">31</span>
|
|
707
|
-
<span class="linenos">32</span>
|
|
708
|
-
<span class="linenos">33</span>
|
|
709
|
-
<span class="linenos">34</span>
|
|
699
|
+
<span class="linenos">24</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mf">30</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
700
|
+
<span class="linenos">25</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">frag</span><span class="p">;</span><span class="w"></span>
|
|
701
|
+
<span class="linenos">26</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">15</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><span class="p">{</span><span class="w"></span>
|
|
702
|
+
<span class="linenos">27</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'FizzBuzz'</span><span class="p">;</span><span class="w"></span>
|
|
703
|
+
<span class="linenos">28</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">5</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><span class="p">{</span><span class="w"></span>
|
|
704
|
+
<span class="linenos">29</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Buzz'</span><span class="p">;</span><span class="w"></span>
|
|
705
|
+
<span class="linenos">30</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">3</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><span class="p">{</span><span class="w"></span>
|
|
706
|
+
<span class="linenos">31</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Fizz'</span><span class="p">;</span><span class="w"></span>
|
|
707
|
+
<span class="linenos">32</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
708
|
+
<span class="linenos">33</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">String</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span><span class="w"></span>
|
|
709
|
+
<span class="linenos">34</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
|
|
710
710
|
<span class="linenos">35</span>
|
|
711
|
-
<span class="linenos">36</span>
|
|
712
|
-
<span class="linenos">37</span>
|
|
713
|
-
<span class="linenos">38</span>
|
|
714
|
-
<span class="linenos">39</span>
|
|
715
|
-
<span class="linenos">40</span>
|
|
711
|
+
<span class="linenos">36</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="nx">frag</span><span class="p">))</span><span class="w"></span>
|
|
712
|
+
<span class="linenos">37</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">'Allocation failure'</span><span class="p">);</span><span class="w"></span>
|
|
713
|
+
<span class="linenos">38</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="s1">' '</span><span class="p">))</span><span class="w"></span>
|
|
714
|
+
<span class="linenos">39</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">'Allocation failure'</span><span class="p">);</span><span class="w"></span>
|
|
715
|
+
<span class="linenos">40</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
|
|
716
716
|
<span class="linenos">41</span>
|
|
717
|
-
<span class="linenos">42</span>
|
|
718
|
-
<span class="linenos">43</span>
|
|
719
|
-
<span class="linenos">44</span>
|
|
720
|
-
<span class="linenos">45</span>
|
|
721
|
-
<span class="linenos">46</span><span class="p">}</span>
|
|
722
|
-
<span class="linenos">47</span>
|
|
723
|
-
<span class="linenos">48</span><span class="p">}</span>
|
|
717
|
+
<span class="linenos">42</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">str</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ConcatBuild</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span><span class="w"></span>
|
|
718
|
+
<span class="linenos">43</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">str</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"></span>
|
|
719
|
+
<span class="linenos">44</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">'Allocation failure'</span><span class="p">);</span><span class="w"></span>
|
|
720
|
+
<span class="linenos">45</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>
|
|
721
|
+
<span class="linenos">46</span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
722
|
+
<span class="linenos">47</span><span class="w"> </span><span class="nx">ConcatFree</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span><span class="w"></span>
|
|
723
|
+
<span class="linenos">48</span><span class="p">}</span><span class="w"></span>
|
|
724
724
|
</pre></div>
|
|
725
725
|
</div>
|
|
726
726
|
</section>
|
|
@@ -748,77 +748,77 @@
|
|
|
748
748
|
<span class="linenos">17</span><span class="p">}</span><span class="w"></span>
|
|
749
749
|
</pre></div>
|
|
750
750
|
</div>
|
|
751
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span>
|
|
752
|
-
<span class="linenos">2</span><span class="kd">const</span>
|
|
751
|
+
<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">'koffi'</span><span class="p">);</span><span class="w"></span>
|
|
752
|
+
<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">'./length.so'</span><span class="p">);</span><span class="w"></span>
|
|
753
753
|
<span class="linenos">3</span>
|
|
754
|
-
<span class="linenos">4</span><span class="kd">const</span>
|
|
754
|
+
<span class="linenos">4</span><span class="kd">const</span><span class="w"> </span><span class="nx">ComputeTotalLength</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">'int64_t ComputeTotalLength(const char **strings)'</span><span class="p">);</span><span class="w"></span>
|
|
755
755
|
<span class="linenos">5</span>
|
|
756
|
-
<span class="linenos">6</span><span class="kd">let</span>
|
|
757
|
-
<span class="linenos">7</span><span class="kd">let</span>
|
|
756
|
+
<span class="linenos">6</span><span class="kd">let</span><span class="w"> </span><span class="nx">strings</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s1">'Get'</span><span class="p">,</span><span class="w"> </span><span class="s1">'Total'</span><span class="p">,</span><span class="w"> </span><span class="s1">'Length'</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">];</span><span class="w"></span>
|
|
757
|
+
<span class="linenos">7</span><span class="kd">let</span><span class="w"> </span><span class="nx">total</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ComputeTotalLength</span><span class="p">(</span><span class="nx">strings</span><span class="p">);</span><span class="w"></span>
|
|
758
758
|
<span class="linenos">8</span>
|
|
759
|
-
<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">total</span><span class="p">);</span>
|
|
759
|
+
<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">total</span><span class="p">);</span><span class="w"> </span><span class="c1">// Prints 14n (big int)</span><span class="w"></span>
|
|
760
760
|
</pre></div>
|
|
761
761
|
</div>
|
|
762
762
|
<p>By default, just like for objects, array arguments are copied from JS to C but not vice-versa. You can however change the direction as documented in the section on <a class="reference internal" href="functions#output-parameters"><span class="std std-doc">output parameters</span></a>.</p>
|
|
763
763
|
<p>Here is an example based on the Win32 API, listing files in the current directory with <code class="docutils literal notranslate"><span class="pre">FindFirstFileW()</span></code> and <code class="docutils literal notranslate"><span class="pre">FindNextFileW()</span></code>:</p>
|
|
764
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span>
|
|
765
|
-
<span class="linenos"> 2</span><span class="kd">const</span>
|
|
764
|
+
<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">'koffi'</span><span class="p">);</span><span class="w"></span>
|
|
765
|
+
<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">'kernel32.dll'</span><span class="p">);</span><span class="w"></span>
|
|
766
766
|
<span class="linenos"> 3</span>
|
|
767
|
-
<span class="linenos"> 4</span><span class="kd">const</span>
|
|
768
|
-
<span class="linenos"> 5</span><span class="kd">const</span>
|
|
769
|
-
<span class="linenos"> 6</span>
|
|
770
|
-
<span class="linenos"> 7</span>
|
|
771
|
-
<span class="linenos"> 8</span><span class="p">});</span>
|
|
772
|
-
<span class="linenos"> 9</span><span class="kd">const</span>
|
|
773
|
-
<span class="linenos">10</span>
|
|
774
|
-
<span class="linenos">11</span>
|
|
775
|
-
<span class="linenos">12</span>
|
|
776
|
-
<span class="linenos">13</span>
|
|
777
|
-
<span class="linenos">14</span>
|
|
778
|
-
<span class="linenos">15</span>
|
|
779
|
-
<span class="linenos">16</span>
|
|
780
|
-
<span class="linenos">17</span>
|
|
781
|
-
<span class="linenos">18</span>
|
|
782
|
-
<span class="linenos">19</span>
|
|
783
|
-
<span class="linenos">20</span>
|
|
784
|
-
<span class="linenos">21</span>
|
|
785
|
-
<span class="linenos">22</span>
|
|
786
|
-
<span class="linenos">23</span><span class="p">});</span>
|
|
767
|
+
<span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">HANDLE</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">'HANDLE'</span><span class="p">);</span><span class="w"></span>
|
|
768
|
+
<span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">FILETIME</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">'FILETIME'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
769
|
+
<span class="linenos"> 6</span><span class="w"> </span><span class="nx">dwLowDateTime</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"></span>
|
|
770
|
+
<span class="linenos"> 7</span><span class="w"> </span><span class="nx">dwHighDateTime</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="w"></span>
|
|
771
|
+
<span class="linenos"> 8</span><span class="p">});</span><span class="w"></span>
|
|
772
|
+
<span class="linenos"> 9</span><span class="kd">const</span><span class="w"> </span><span class="nx">WIN32_FIND_DATA</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">'WIN32_FIND_DATA'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
773
|
+
<span class="linenos">10</span><span class="w"> </span><span class="nx">dwFileAttributes</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"></span>
|
|
774
|
+
<span class="linenos">11</span><span class="w"> </span><span class="nx">ftCreationTime</span><span class="o">:</span><span class="w"> </span><span class="nx">FILETIME</span><span class="p">,</span><span class="w"></span>
|
|
775
|
+
<span class="linenos">12</span><span class="w"> </span><span class="nx">ftLastAccessTime</span><span class="o">:</span><span class="w"> </span><span class="nx">FILETIME</span><span class="p">,</span><span class="w"></span>
|
|
776
|
+
<span class="linenos">13</span><span class="w"> </span><span class="nx">ftLastWriteTime</span><span class="o">:</span><span class="w"> </span><span class="nx">FILETIME</span><span class="p">,</span><span class="w"></span>
|
|
777
|
+
<span class="linenos">14</span><span class="w"> </span><span class="nx">nFileSizeHigh</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"></span>
|
|
778
|
+
<span class="linenos">15</span><span class="w"> </span><span class="nx">nFileSizeLow</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"></span>
|
|
779
|
+
<span class="linenos">16</span><span class="w"> </span><span class="nx">dwReserved0</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"></span>
|
|
780
|
+
<span class="linenos">17</span><span class="w"> </span><span class="nx">dwReserved1</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"></span>
|
|
781
|
+
<span class="linenos">18</span><span class="w"> </span><span class="nx">cFileName</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">'char16'</span><span class="p">,</span><span class="w"> </span><span class="mf">260</span><span class="p">),</span><span class="w"></span>
|
|
782
|
+
<span class="linenos">19</span><span class="w"> </span><span class="nx">cAlternateFileName</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">'char16'</span><span class="p">,</span><span class="w"> </span><span class="mf">14</span><span class="p">),</span><span class="w"></span>
|
|
783
|
+
<span class="linenos">20</span><span class="w"> </span><span class="nx">dwFileType</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"> </span><span class="c1">// Obsolete. Do not use.</span><span class="w"></span>
|
|
784
|
+
<span class="linenos">21</span><span class="w"> </span><span class="nx">dwCreatorType</span><span class="o">:</span><span class="w"> </span><span class="s1">'uint'</span><span class="p">,</span><span class="w"> </span><span class="c1">// Obsolete. Do not use</span><span class="w"></span>
|
|
785
|
+
<span class="linenos">22</span><span class="w"> </span><span class="nx">wFinderFlags</span><span class="o">:</span><span class="w"> </span><span class="s1">'ushort'</span><span class="w"> </span><span class="c1">// Obsolete. Do not use</span><span class="w"></span>
|
|
786
|
+
<span class="linenos">23</span><span class="p">});</span><span class="w"></span>
|
|
787
787
|
<span class="linenos">24</span>
|
|
788
|
-
<span class="linenos">25</span><span class="kd">const</span>
|
|
789
|
-
<span class="linenos">26</span><span class="kd">const</span>
|
|
790
|
-
<span class="linenos">27</span><span class="kd">const</span>
|
|
791
|
-
<span class="linenos">28</span><span class="kd">const</span>
|
|
788
|
+
<span class="linenos">25</span><span class="kd">const</span><span class="w"> </span><span class="nx">FindFirstFile</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">'HANDLE __stdcall FindFirstFileW(string16 path, _Out_ WIN32_FIND_DATA *data)'</span><span class="p">);</span><span class="w"></span>
|
|
789
|
+
<span class="linenos">26</span><span class="kd">const</span><span class="w"> </span><span class="nx">FindNextFile</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">'bool __stdcall FindNextFileW(HANDLE h, _Out_ WIN32_FIND_DATA *data)'</span><span class="p">);</span><span class="w"></span>
|
|
790
|
+
<span class="linenos">27</span><span class="kd">const</span><span class="w"> </span><span class="nx">FindClose</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">'bool __stdcall FindClose(HANDLE h)'</span><span class="p">);</span><span class="w"></span>
|
|
791
|
+
<span class="linenos">28</span><span class="kd">const</span><span class="w"> </span><span class="nx">GetLastError</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">'uint GetLastError()'</span><span class="p">);</span><span class="w"></span>
|
|
792
792
|
<span class="linenos">29</span>
|
|
793
|
-
<span class="linenos">30</span><span class="kd">function</span>
|
|
794
|
-
<span class="linenos">31</span>
|
|
793
|
+
<span class="linenos">30</span><span class="kd">function</span><span class="w"> </span><span class="nx">list</span><span class="p">(</span><span class="nx">dirname</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
794
|
+
<span class="linenos">31</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">filenames</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[];</span><span class="w"></span>
|
|
795
795
|
<span class="linenos">32</span>
|
|
796
|
-
<span class="linenos">33</span>
|
|
797
|
-
<span class="linenos">34</span>
|
|
796
|
+
<span class="linenos">33</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
|
|
797
|
+
<span class="linenos">34</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">FindFirstFile</span><span class="p">(</span><span class="nx">dirname</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'\\*'</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">);</span><span class="w"></span>
|
|
798
798
|
<span class="linenos">35</span>
|
|
799
|
-
<span class="linenos">36</span>
|
|
800
|
-
<span class="linenos">37</span>
|
|
801
|
-
<span class="linenos">38</span>
|
|
802
|
-
<span class="linenos">39</span>
|
|
803
|
-
<span class="linenos">40</span>
|
|
799
|
+
<span class="linenos">36</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">h</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
800
|
+
<span class="linenos">37</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">GetLastError</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">2</span><span class="p">)</span><span class="w"> </span><span class="c1">// ERROR_FILE_NOT_FOUND</span><span class="w"></span>
|
|
801
|
+
<span class="linenos">38</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">filenames</span><span class="p">;</span><span class="w"></span>
|
|
802
|
+
<span class="linenos">39</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">'FindFirstFile() failed'</span><span class="p">);</span><span class="w"></span>
|
|
803
|
+
<span class="linenos">40</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
|
|
804
804
|
<span class="linenos">41</span>
|
|
805
|
-
<span class="linenos">42</span>
|
|
806
|
-
<span class="linenos">43</span>
|
|
807
|
-
<span class="linenos">44</span>
|
|
808
|
-
<span class="linenos">45</span>
|
|
809
|
-
<span class="linenos">46</span>
|
|
805
|
+
<span class="linenos">42</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
806
|
+
<span class="linenos">43</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
807
|
+
<span class="linenos">44</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s1">'.'</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s1">'..'</span><span class="p">)</span><span class="w"></span>
|
|
808
|
+
<span class="linenos">45</span><span class="w"> </span><span class="nx">filenames</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="p">);</span><span class="w"></span>
|
|
809
|
+
<span class="linenos">46</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nx">FindNextFile</span><span class="p">(</span><span class="nx">h</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">));</span><span class="w"></span>
|
|
810
810
|
<span class="linenos">47</span>
|
|
811
|
-
<span class="linenos">48</span>
|
|
812
|
-
<span class="linenos">49</span>
|
|
813
|
-
<span class="linenos">50</span>
|
|
814
|
-
<span class="linenos">51</span>
|
|
815
|
-
<span class="linenos">52</span>
|
|
811
|
+
<span class="linenos">48</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">GetLastError</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mf">18</span><span class="p">)</span><span class="w"> </span><span class="c1">// ERROR_NO_MORE_FILES</span><span class="w"></span>
|
|
812
|
+
<span class="linenos">49</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">'FindNextFile() failed'</span><span class="p">);</span><span class="w"></span>
|
|
813
|
+
<span class="linenos">50</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
814
|
+
<span class="linenos">51</span><span class="w"> </span><span class="nx">FindClose</span><span class="p">(</span><span class="nx">h</span><span class="p">);</span><span class="w"></span>
|
|
815
|
+
<span class="linenos">52</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
|
|
816
816
|
<span class="linenos">53</span>
|
|
817
|
-
<span class="linenos">54</span>
|
|
818
|
-
<span class="linenos">55</span><span class="p">}</span>
|
|
817
|
+
<span class="linenos">54</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">filenames</span><span class="p">;</span><span class="w"></span>
|
|
818
|
+
<span class="linenos">55</span><span class="p">}</span><span class="w"></span>
|
|
819
819
|
<span class="linenos">56</span>
|
|
820
|
-
<span class="linenos">57</span><span class="kd">let</span>
|
|
821
|
-
<span class="linenos">58</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">filenames</span><span class="p">);</span>
|
|
820
|
+
<span class="linenos">57</span><span class="kd">let</span><span class="w"> </span><span class="nx">filenames</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">list</span><span class="p">(</span><span class="s1">'.'</span><span class="p">);</span><span class="w"></span>
|
|
821
|
+
<span class="linenos">58</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">filenames</span><span class="p">);</span><span class="w"></span>
|
|
822
822
|
</pre></div>
|
|
823
823
|
</div>
|
|
824
824
|
</section>
|
|
@@ -826,12 +826,12 @@
|
|
|
826
826
|
<h3>Pointers to primitive types<a class="headerlink" href="#pointers-to-primitive-types" title="Permalink to this heading">#</a></h3>
|
|
827
827
|
<p>In javascript, it is not possible to pass a primitive value by reference to another function. This means that you cannot call a function and expect it to modify the value of one of its number or string parameter.</p>
|
|
828
828
|
<p>However, arrays and objects (among others) are reference type values. Assigning an array or an object from one variable to another does not invole any copy. Instead, as the following example illustrates, the new variable references the same list as the first:</p>
|
|
829
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">let</span>
|
|
830
|
-
<span class="linenos">2</span><span class="kd">let</span>
|
|
829
|
+
<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">list1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">];</span><span class="w"></span>
|
|
830
|
+
<span class="linenos">2</span><span class="kd">let</span><span class="w"> </span><span class="nx">list2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">list1</span><span class="p">;</span><span class="w"></span>
|
|
831
831
|
<span class="linenos">3</span>
|
|
832
|
-
<span class="linenos">4</span><span class="nx">list2</span><span class="p">[</span><span class="mf">1</span><span class="p">]</span>
|
|
832
|
+
<span class="linenos">4</span><span class="nx">list2</span><span class="p">[</span><span class="mf">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">42</span><span class="p">;</span><span class="w"></span>
|
|
833
833
|
<span class="linenos">5</span>
|
|
834
|
-
<span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">list1</span><span class="p">);</span>
|
|
834
|
+
<span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">list1</span><span class="p">);</span><span class="w"> </span><span class="c1">// Prints [1, 42]</span><span class="w"></span>
|
|
835
835
|
</pre></div>
|
|
836
836
|
</div>
|
|
837
837
|
<p>All of this means that C functions that are expected to modify their primitive output values (such as an <code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">*</span></code> parameter) cannot be used directly. However, thanks to Koffi’s transparent array support, you can use Javascript arrays to approximate reference semantics with single-element arrays.</p>
|
|
@@ -843,12 +843,12 @@
|
|
|
843
843
|
</pre></div>
|
|
844
844
|
</div>
|
|
845
845
|
<p>You can simply pass a single-element array as the third argument:</p>
|
|
846
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span>
|
|
846
|
+
<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">AddInt</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">'void AddInt(_Inout_ int *dest, int add)'</span><span class="p">);</span><span class="w"></span>
|
|
847
847
|
<span class="linenos">2</span>
|
|
848
|
-
<span class="linenos">3</span><span class="kd">let</span>
|
|
849
|
-
<span class="linenos">4</span><span class="nx">AddInt</span><span class="p">(</span><span class="nx">sum</span><span class="p">,</span>
|
|
848
|
+
<span class="linenos">3</span><span class="kd">let</span><span class="w"> </span><span class="nx">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mf">36</span><span class="p">];</span><span class="w"></span>
|
|
849
|
+
<span class="linenos">4</span><span class="nx">AddInt</span><span class="p">(</span><span class="nx">sum</span><span class="p">,</span><span class="w"> </span><span class="mf">6</span><span class="p">);</span><span class="w"></span>
|
|
850
850
|
<span class="linenos">5</span>
|
|
851
|
-
<span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">[</span><span class="mf">0</span><span class="p">]);</span>
|
|
851
|
+
<span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">[</span><span class="mf">0</span><span class="p">]);</span><span class="w"> </span><span class="c1">// Prints 42</span><span class="w"></span>
|
|
852
852
|
</pre></div>
|
|
853
853
|
</div>
|
|
854
854
|
</section>
|
|
@@ -862,24 +862,24 @@
|
|
|
862
862
|
<li><p><strong>C to JS</strong> (return value, output parameters, callbacks): Koffi will use a TypedArray if possible. But you can change this behavior when you create the array type with the optional hint argument: <code class="docutils literal notranslate"><span class="pre">koffi.array('uint8_t',</span> <span class="pre">64,</span> <span class="pre">'array')</span></code>. For non-number types, such as arrays of strings or structs, Koffi creates normal arrays.</p></li>
|
|
863
863
|
</ul>
|
|
864
864
|
<p>See the example below:</p>
|
|
865
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span>
|
|
865
|
+
<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">'koffi'</span><span class="p">);</span><span class="w"></span>
|
|
866
866
|
<span class="linenos"> 2</span>
|
|
867
|
-
<span class="linenos"> 3</span><span class="c1">// Those two structs are exactly the same, only the array conversion hint is different</span>
|
|
868
|
-
<span class="linenos"> 4</span><span class="kd">const</span>
|
|
869
|
-
<span class="linenos"> 5</span>
|
|
870
|
-
<span class="linenos"> 6</span>
|
|
871
|
-
<span class="linenos"> 7</span><span class="p">});</span>
|
|
872
|
-
<span class="linenos"> 8</span><span class="kd">const</span>
|
|
873
|
-
<span class="linenos"> 9</span>
|
|
874
|
-
<span class="linenos">10</span>
|
|
875
|
-
<span class="linenos">11</span><span class="p">});</span>
|
|
867
|
+
<span class="linenos"> 3</span><span class="c1">// Those two structs are exactly the same, only the array conversion hint is different</span><span class="w"></span>
|
|
868
|
+
<span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">Foo1</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">'Foo'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
869
|
+
<span class="linenos"> 5</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="s1">'int'</span><span class="p">,</span><span class="w"></span>
|
|
870
|
+
<span class="linenos"> 6</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">'int16_t'</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">)</span><span class="w"></span>
|
|
871
|
+
<span class="linenos"> 7</span><span class="p">});</span><span class="w"></span>
|
|
872
|
+
<span class="linenos"> 8</span><span class="kd">const</span><span class="w"> </span><span class="nx">Foo2</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">'Foo'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
|
873
|
+
<span class="linenos"> 9</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="s1">'int'</span><span class="p">,</span><span class="w"></span>
|
|
874
|
+
<span class="linenos">10</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">'int16_t'</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">,</span><span class="w"> </span><span class="s1">'array'</span><span class="p">)</span><span class="w"></span>
|
|
875
|
+
<span class="linenos">11</span><span class="p">});</span><span class="w"></span>
|
|
876
876
|
<span class="linenos">12</span>
|
|
877
|
-
<span class="linenos">13</span><span class="c1">// Uses an hypothetical C function that just returns the struct passed as a parameter</span>
|
|
878
|
-
<span class="linenos">14</span><span class="kd">const</span>
|
|
879
|
-
<span class="linenos">15</span><span class="kd">const</span>
|
|
877
|
+
<span class="linenos">13</span><span class="c1">// Uses an hypothetical C function that just returns the struct passed as a parameter</span><span class="w"></span>
|
|
878
|
+
<span class="linenos">14</span><span class="kd">const</span><span class="w"> </span><span class="nx">ReturnFoo1</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">'Foo1 ReturnFoo(Foo1 p)'</span><span class="p">);</span><span class="w"></span>
|
|
879
|
+
<span class="linenos">15</span><span class="kd">const</span><span class="w"> </span><span class="nx">ReturnFoo2</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">'Foo2 ReturnFoo(Foo2 p)'</span><span class="p">);</span><span class="w"></span>
|
|
880
880
|
<span class="linenos">16</span>
|
|
881
|
-
<span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo1</span><span class="p">({</span>
|
|
882
|
-
<span class="linenos">18</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo2</span><span class="p">({</span>
|
|
881
|
+
<span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo1</span><span class="p">({</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">]</span><span class="w"> </span><span class="p">}))</span><span class="w"> </span><span class="c1">// Prints { i: 5, a16: Int16Array(2) [6, 8] }</span><span class="w"></span>
|
|
882
|
+
<span class="linenos">18</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo2</span><span class="p">({</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">]</span><span class="w"> </span><span class="p">}))</span><span class="w"> </span><span class="c1">// Prints { i: 5, a16: [6, 8] }</span><span class="w"></span>
|
|
883
883
|
</pre></div>
|
|
884
884
|
</div>
|
|
885
885
|
<section id="handling-of-strings">
|
|
@@ -901,9 +901,9 @@
|
|
|
901
901
|
<li><p><code class="docutils literal notranslate"><span class="pre">koffi.introspect(type)</span></code> to get the definition of a type (only for structs for now)</p></li>
|
|
902
902
|
</ul>
|
|
903
903
|
<p>Just like before, you can refer to primitive types by their name or through <code class="docutils literal notranslate"><span class="pre">koffi.types</span></code>:</p>
|
|
904
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span>
|
|
905
|
-
<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">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="s1">'long'</span><span class="p">));</span>
|
|
906
|
-
<span class="linenos">3</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span><span class="p">));</span>
|
|
904
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span><span class="w"></span>
|
|
905
|
+
<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">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="s1">'long'</span><span class="p">));</span><span class="w"></span>
|
|
906
|
+
<span class="linenos">3</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span><span class="p">));</span><span class="w"></span>
|
|
907
907
|
</pre></div>
|
|
908
908
|
</div>
|
|
909
909
|
</section>
|