koffi 2.0.0 → 2.1.0-beta.2

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 (127) hide show
  1. package/CMakeLists.txt +2 -9
  2. package/ChangeLog.md +25 -2
  3. package/benchmark/atoi_koffi.js +12 -8
  4. package/benchmark/atoi_napi.js +12 -8
  5. package/benchmark/atoi_node_ffi.js +11 -10
  6. package/benchmark/raylib_cc.cc +12 -9
  7. package/benchmark/raylib_koffi.js +15 -13
  8. package/benchmark/raylib_node_ffi.js +15 -13
  9. package/benchmark/raylib_node_raylib.js +14 -11
  10. package/build/qemu/2.1.0-beta.2/koffi_darwin_arm64.tar.gz +0 -0
  11. package/build/qemu/2.1.0-beta.2/koffi_darwin_x64.tar.gz +0 -0
  12. package/build/qemu/2.1.0-beta.2/koffi_freebsd_arm64.tar.gz +0 -0
  13. package/build/qemu/2.1.0-beta.2/koffi_freebsd_ia32.tar.gz +0 -0
  14. package/build/qemu/2.1.0-beta.2/koffi_freebsd_x64.tar.gz +0 -0
  15. package/build/qemu/2.1.0-beta.2/koffi_linux_arm32hf.tar.gz +0 -0
  16. package/build/qemu/2.1.0-beta.2/koffi_linux_arm64.tar.gz +0 -0
  17. package/build/qemu/2.1.0-beta.2/koffi_linux_ia32.tar.gz +0 -0
  18. package/build/qemu/2.1.0-beta.2/koffi_linux_riscv64hf64.tar.gz +0 -0
  19. package/build/qemu/2.1.0-beta.2/koffi_linux_x64.tar.gz +0 -0
  20. package/build/qemu/2.1.0-beta.2/koffi_openbsd_ia32.tar.gz +0 -0
  21. package/build/qemu/2.1.0-beta.2/koffi_openbsd_x64.tar.gz +0 -0
  22. package/build/qemu/2.1.0-beta.2/koffi_win32_arm64.tar.gz +0 -0
  23. package/build/qemu/2.1.0-beta.2/koffi_win32_ia32.tar.gz +0 -0
  24. package/build/qemu/2.1.0-beta.2/koffi_win32_x64.tar.gz +0 -0
  25. package/doc/benchmarks.md +2 -2
  26. package/doc/changes.md +23 -19
  27. package/doc/conf.py +14 -1
  28. package/doc/dist/doctrees/benchmarks.doctree +0 -0
  29. package/doc/dist/doctrees/changes.doctree +0 -0
  30. package/doc/dist/doctrees/environment.pickle +0 -0
  31. package/doc/dist/doctrees/functions.doctree +0 -0
  32. package/doc/dist/doctrees/index.doctree +0 -0
  33. package/doc/dist/doctrees/types.doctree +0 -0
  34. package/doc/functions.md +76 -10
  35. package/doc/templates/badges.html +4 -0
  36. package/doc/types.md +157 -161
  37. package/package.json +2 -2
  38. package/qemu/qemu.js +1 -1
  39. package/src/abi_arm32.cc +167 -3
  40. package/src/abi_arm64.cc +196 -3
  41. package/src/abi_riscv64.cc +107 -3
  42. package/src/abi_x64_sysv.cc +114 -4
  43. package/src/abi_x64_win.cc +113 -3
  44. package/src/abi_x86.cc +156 -5
  45. package/src/call.cc +241 -26
  46. package/src/call.hh +15 -3
  47. package/src/ffi.cc +123 -34
  48. package/src/ffi.hh +19 -0
  49. package/src/index.js +4 -2
  50. package/src/parser.cc +3 -5
  51. package/src/util.cc +44 -1
  52. package/src/util.hh +4 -0
  53. package/test/async.js +1 -2
  54. package/test/callbacks.js +2 -3
  55. package/test/misc.c +21 -1
  56. package/test/raylib.js +1 -1
  57. package/test/sqlite.js +7 -7
  58. package/test/sync.js +30 -4
  59. package/build/qemu/2.0.0/koffi_darwin_arm64.tar.gz +0 -0
  60. package/build/qemu/2.0.0/koffi_darwin_x64.tar.gz +0 -0
  61. package/build/qemu/2.0.0/koffi_freebsd_arm64.tar.gz +0 -0
  62. package/build/qemu/2.0.0/koffi_freebsd_ia32.tar.gz +0 -0
  63. package/build/qemu/2.0.0/koffi_freebsd_x64.tar.gz +0 -0
  64. package/build/qemu/2.0.0/koffi_linux_arm32hf.tar.gz +0 -0
  65. package/build/qemu/2.0.0/koffi_linux_arm64.tar.gz +0 -0
  66. package/build/qemu/2.0.0/koffi_linux_ia32.tar.gz +0 -0
  67. package/build/qemu/2.0.0/koffi_linux_riscv64hf64.tar.gz +0 -0
  68. package/build/qemu/2.0.0/koffi_linux_x64.tar.gz +0 -0
  69. package/build/qemu/2.0.0/koffi_openbsd_ia32.tar.gz +0 -0
  70. package/build/qemu/2.0.0/koffi_openbsd_x64.tar.gz +0 -0
  71. package/build/qemu/2.0.0/koffi_win32_arm64.tar.gz +0 -0
  72. package/build/qemu/2.0.0/koffi_win32_ia32.tar.gz +0 -0
  73. package/build/qemu/2.0.0/koffi_win32_x64.tar.gz +0 -0
  74. package/doc/dist/html/.buildinfo +0 -4
  75. package/doc/dist/html/_sources/benchmarks.md.txt +0 -137
  76. package/doc/dist/html/_sources/changes.md.txt +0 -157
  77. package/doc/dist/html/_sources/contribute.md.txt +0 -127
  78. package/doc/dist/html/_sources/functions.md.txt +0 -355
  79. package/doc/dist/html/_sources/index.rst.txt +0 -39
  80. package/doc/dist/html/_sources/memory.md.txt +0 -32
  81. package/doc/dist/html/_sources/platforms.md.txt +0 -31
  82. package/doc/dist/html/_sources/start.md.txt +0 -100
  83. package/doc/dist/html/_sources/types.md.txt +0 -545
  84. package/doc/dist/html/_static/_sphinx_javascript_frameworks_compat.js +0 -134
  85. package/doc/dist/html/_static/basic.css +0 -932
  86. package/doc/dist/html/_static/bench_linux.png +0 -0
  87. package/doc/dist/html/_static/bench_windows.png +0 -0
  88. package/doc/dist/html/_static/custom.css +0 -22
  89. package/doc/dist/html/_static/debug.css +0 -69
  90. package/doc/dist/html/_static/doctools.js +0 -264
  91. package/doc/dist/html/_static/documentation_options.js +0 -14
  92. package/doc/dist/html/_static/file.png +0 -0
  93. package/doc/dist/html/_static/jquery-3.6.0.js +0 -10881
  94. package/doc/dist/html/_static/jquery.js +0 -2
  95. package/doc/dist/html/_static/language_data.js +0 -199
  96. package/doc/dist/html/_static/minus.png +0 -0
  97. package/doc/dist/html/_static/perf_linux_20220623.png +0 -0
  98. package/doc/dist/html/_static/perf_linux_20220623_2.png +0 -0
  99. package/doc/dist/html/_static/perf_windows_20220623.png +0 -0
  100. package/doc/dist/html/_static/perf_windows_20220623_2.png +0 -0
  101. package/doc/dist/html/_static/plus.png +0 -0
  102. package/doc/dist/html/_static/pygments.css +0 -252
  103. package/doc/dist/html/_static/scripts/furo-extensions.js +0 -0
  104. package/doc/dist/html/_static/scripts/furo.js +0 -3
  105. package/doc/dist/html/_static/scripts/furo.js.LICENSE.txt +0 -7
  106. package/doc/dist/html/_static/scripts/furo.js.map +0 -1
  107. package/doc/dist/html/_static/searchtools.js +0 -531
  108. package/doc/dist/html/_static/skeleton.css +0 -296
  109. package/doc/dist/html/_static/styles/furo-extensions.css +0 -2
  110. package/doc/dist/html/_static/styles/furo-extensions.css.map +0 -1
  111. package/doc/dist/html/_static/styles/furo.css +0 -2
  112. package/doc/dist/html/_static/styles/furo.css.map +0 -1
  113. package/doc/dist/html/_static/underscore-1.13.1.js +0 -2042
  114. package/doc/dist/html/_static/underscore.js +0 -6
  115. package/doc/dist/html/benchmarks.html +0 -568
  116. package/doc/dist/html/changes.html +0 -653
  117. package/doc/dist/html/contribute.html +0 -400
  118. package/doc/dist/html/functions.html +0 -653
  119. package/doc/dist/html/genindex.html +0 -250
  120. package/doc/dist/html/index.html +0 -356
  121. package/doc/dist/html/memory.html +0 -343
  122. package/doc/dist/html/objects.inv +0 -0
  123. package/doc/dist/html/platforms.html +0 -368
  124. package/doc/dist/html/search.html +0 -258
  125. package/doc/dist/html/searchindex.js +0 -1
  126. package/doc/dist/html/start.html +0 -381
  127. package/doc/dist/html/types.html +0 -1044
@@ -1,653 +0,0 @@
1
- <!doctype html>
2
- <html class="no-js" lang="en">
3
- <head><meta charset="utf-8"/>
4
- <meta name="viewport" content="width=device-width,initial-scale=1"/>
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="prev" title="Contributing" href="contribute" />
7
-
8
- <meta name="generator" content="sphinx-5.0.1, furo 2022.06.04.1"/>
9
- <title>Changelog - Koffi</title>
10
- <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
11
- <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?digest=40978830699223671f4072448e654b5958f38b89" />
12
- <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
13
- <link rel="stylesheet" type="text/css" href="_static/custom.css" />
14
-
15
-
16
-
17
-
18
- <style>
19
- body {
20
- --color-code-background: #f8f8f8;
21
- --color-code-foreground: black;
22
- --color-brand-primary: #FF6600;
23
- --color-brand-content: #FF6600;
24
-
25
- }
26
- @media not print {
27
- body[data-theme="dark"] {
28
- --color-code-background: #202020;
29
- --color-code-foreground: #d0d0d0;
30
- --color-brand-primary: #FF6600;
31
- --color-brand-content: #FF6600;
32
-
33
- }
34
- @media (prefers-color-scheme: dark) {
35
- body:not([data-theme="light"]) {
36
- --color-code-background: #202020;
37
- --color-code-foreground: #d0d0d0;
38
- --color-brand-primary: #FF6600;
39
- --color-brand-content: #FF6600;
40
-
41
- }
42
- }
43
- }
44
- </style></head>
45
- <body>
46
-
47
- <script>
48
- document.body.dataset.theme = localStorage.getItem("theme") || "auto";
49
- </script>
50
-
51
-
52
- <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
53
- <symbol id="svg-toc" viewBox="0 0 24 24">
54
- <title>Contents</title>
55
- <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
56
- <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
57
- </svg>
58
- </symbol>
59
- <symbol id="svg-menu" viewBox="0 0 24 24">
60
- <title>Menu</title>
61
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
62
- stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
63
- <line x1="3" y1="12" x2="21" y2="12"></line>
64
- <line x1="3" y1="6" x2="21" y2="6"></line>
65
- <line x1="3" y1="18" x2="21" y2="18"></line>
66
- </svg>
67
- </symbol>
68
- <symbol id="svg-arrow-right" viewBox="0 0 24 24">
69
- <title>Expand</title>
70
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
71
- stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
72
- <polyline points="9 18 15 12 9 6"></polyline>
73
- </svg>
74
- </symbol>
75
- <symbol id="svg-sun" viewBox="0 0 24 24">
76
- <title>Light mode</title>
77
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
78
- stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
79
- <circle cx="12" cy="12" r="5"></circle>
80
- <line x1="12" y1="1" x2="12" y2="3"></line>
81
- <line x1="12" y1="21" x2="12" y2="23"></line>
82
- <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
83
- <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
84
- <line x1="1" y1="12" x2="3" y2="12"></line>
85
- <line x1="21" y1="12" x2="23" y2="12"></line>
86
- <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
87
- <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
88
- </svg>
89
- </symbol>
90
- <symbol id="svg-moon" viewBox="0 0 24 24">
91
- <title>Dark mode</title>
92
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
93
- stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
94
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
95
- <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
96
- </svg>
97
- </symbol>
98
- <symbol id="svg-sun-half" viewBox="0 0 24 24">
99
- <title>Auto light/dark mode</title>
100
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
101
- stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
102
- <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
103
- <circle cx="12" cy="12" r="9" />
104
- <path d="M13 12h5" />
105
- <path d="M13 15h4" />
106
- <path d="M13 18h1" />
107
- <path d="M13 9h4" />
108
- <path d="M13 6h1" />
109
- </svg>
110
- </symbol>
111
- </svg>
112
-
113
- <input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
114
- <input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
115
- <label class="overlay sidebar-overlay" for="__navigation">
116
- <div class="visually-hidden">Hide navigation sidebar</div>
117
- </label>
118
- <label class="overlay toc-overlay" for="__toc">
119
- <div class="visually-hidden">Hide table of contents sidebar</div>
120
- </label>
121
-
122
-
123
-
124
- <div class="page">
125
- <header class="mobile-header">
126
- <div class="header-left">
127
- <label class="nav-overlay-icon" for="__navigation">
128
- <div class="visually-hidden">Toggle site navigation sidebar</div>
129
- <i class="icon"><svg><use href="#svg-menu"></use></svg></i>
130
- </label>
131
- </div>
132
- <div class="header-center">
133
- <a href="index"><div class="brand">Koffi</div></a>
134
- </div>
135
- <div class="header-right">
136
- <div class="theme-toggle-container theme-toggle-header">
137
- <button class="theme-toggle">
138
- <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
139
- <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
140
- <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
141
- <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
142
- </button>
143
- </div>
144
- <label class="toc-overlay-icon toc-header-icon" for="__toc">
145
- <div class="visually-hidden">Toggle table of contents sidebar</div>
146
- <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
147
- </label>
148
- </div>
149
- </header>
150
- <aside class="sidebar-drawer">
151
- <div class="sidebar-container">
152
-
153
- <div class="sidebar-sticky"><a class="sidebar-brand" href="index">
154
-
155
-
156
- <span class="sidebar-brand-text">Koffi</span>
157
-
158
- </a><form class="sidebar-search-container" method="get" action="search" role="search">
159
- <input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
160
- <input type="hidden" name="check_keywords" value="yes">
161
- <input type="hidden" name="area" value="default">
162
- </form>
163
- <div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
164
- <ul class="current">
165
- <li class="toctree-l1"><a class="reference internal" href="platforms">Requirements</a></li>
166
- <li class="toctree-l1"><a class="reference internal" href="start">Quick start</a></li>
167
- <li class="toctree-l1"><a class="reference internal" href="types">Data types</a></li>
168
- <li class="toctree-l1"><a class="reference internal" href="functions">Functions</a></li>
169
- <li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
170
- <li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
171
- <li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
172
- <li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Changelog</a></li>
173
- </ul>
174
-
175
- </div>
176
- </div>
177
-
178
- </div>
179
-
180
- </div>
181
- </aside>
182
- <div class="main">
183
- <div class="content">
184
- <div class="article-container">
185
- <a href="#" class="back-to-top muted-link">
186
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
187
- <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
188
- </svg>
189
- <span>Back to top</span>
190
- </a>
191
- <div class="content-icon-container">
192
- <div class="theme-toggle-container theme-toggle-content">
193
- <button class="theme-toggle">
194
- <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
195
- <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
196
- <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
197
- <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
198
- </button>
199
- </div>
200
- <label class="toc-overlay-icon toc-content-icon" for="__toc">
201
- <div class="visually-hidden">Toggle table of contents sidebar</div>
202
- <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
203
- </label>
204
- </div>
205
- <article role="main">
206
- <section id="changelog">
207
- <h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this heading">#</a></h1>
208
- <section id="history">
209
- <h2>History<a class="headerlink" href="#history" title="Permalink to this heading">#</a></h2>
210
- <section id="koffi-2-0-0">
211
- <h3>Koffi 2.0.0<a class="headerlink" href="#koffi-2-0-0" title="Permalink to this heading">#</a></h3>
212
- <p><strong>Major new features:</strong></p>
213
- <ul class="simple">
214
- <li><p>Add disposable types for automatic disposal of C values (such as heap-allocated strings)</p></li>
215
- <li><p>Add support for registered callbacks, that can be called after FFI call</p></li>
216
- <li><p>Support named pointer types</p></li>
217
- <li><p>Support complex type specifications outside of prototype parser</p></li>
218
- </ul>
219
- <p><strong>Minor new features:</strong></p>
220
- <ul class="simple">
221
- <li><p>Support type aliases with <code class="docutils literal notranslate"><span class="pre">koffi.alias()</span></code></p></li>
222
- <li><p>Add <code class="docutils literal notranslate"><span class="pre">koffi.resolve()</span></code> to resolve type strings</p></li>
223
- <li><p>Expose all primitive type aliases in <code class="docutils literal notranslate"><span class="pre">koffi.types</span></code></p></li>
224
- <li><p>Correctly pass exceptions thrown in JS callbacks</p></li>
225
- </ul>
226
- <p><strong>Breaking API changes:</strong></p>
227
- <ul class="simple">
228
- <li><p>Change handling of callback types, which must be used through pointers</p></li>
229
- <li><p>Change handling of opaque handles, which must be used through pointers</p></li>
230
- <li><p>Support all types in <code class="docutils literal notranslate"><span class="pre">koffi.introspect(type)</span></code></p></li>
231
- </ul>
232
- <p>Consult the <a class="reference internal" href="#migration-guide"><span class="std std-doc">migration guide</span></a> for more information.</p>
233
- </section>
234
- <section id="koffi-1-3-12">
235
- <h3>Koffi 1.3.12<a class="headerlink" href="#koffi-1-3-12" title="Permalink to this heading">#</a></h3>
236
- <p><strong>Main fixes:</strong></p>
237
- <ul class="simple">
238
- <li><p>Fix support for Yarn package manager</p></li>
239
- </ul>
240
- </section>
241
- <section id="koffi-1-3-11">
242
- <h3>Koffi 1.3.11<a class="headerlink" href="#koffi-1-3-11" title="Permalink to this heading">#</a></h3>
243
- <p><strong>Main fixes:</strong></p>
244
- <ul class="simple">
245
- <li><p>Fix broken parsing of <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">*</span></code> when used for first parameter</p></li>
246
- </ul>
247
- </section>
248
- <section id="koffi-1-3-10">
249
- <h3>Koffi 1.3.10<a class="headerlink" href="#koffi-1-3-10" title="Permalink to this heading">#</a></h3>
250
- <p><strong>Main fixes:</strong></p>
251
- <ul class="simple">
252
- <li><p>Fix support for callbacks with more than 4 parameters on Windows x64</p></li>
253
- <li><p>Fix support for callbacks with multiple floating-point arguments on ARM32 platforms</p></li>
254
- <li><p>Fix possibly incorrect conversion for uint32_t callback parameters</p></li>
255
- </ul>
256
- <p><strong>Other changes:</strong></p>
257
- <ul class="simple">
258
- <li><p>Various documentation fixes and improvements</p></li>
259
- </ul>
260
- </section>
261
- <section id="koffi-1-3-9">
262
- <h3>Koffi 1.3.9<a class="headerlink" href="#koffi-1-3-9" title="Permalink to this heading">#</a></h3>
263
- <p><strong>Main fixes:</strong></p>
264
- <ul class="simple">
265
- <li><p>Fix prebuild compatibility with Electron on Windows x64</p></li>
266
- </ul>
267
- </section>
268
- <section id="koffi-1-3-8">
269
- <h3>Koffi 1.3.8<a class="headerlink" href="#koffi-1-3-8" title="Permalink to this heading">#</a></h3>
270
- <p><strong>Main changes:</strong></p>
271
- <ul class="simple">
272
- <li><p>Prevent callback reuse beyond FFI call</p></li>
273
- <li><p>Add BTI support for AAarch64 platforms (except Windows)</p></li>
274
- </ul>
275
- <p><strong>Other changes:</strong></p>
276
- <ul class="simple">
277
- <li><p>Fix and harmonize a few error messages</p></li>
278
- </ul>
279
- </section>
280
- <section id="koffi-1-3-7">
281
- <h3>Koffi 1.3.7<a class="headerlink" href="#koffi-1-3-7" title="Permalink to this heading">#</a></h3>
282
- <p><strong>Main fixes:</strong></p>
283
- <ul class="simple">
284
- <li><p>Fix crash when using callbacks inside structs</p></li>
285
- <li><p>Support for null strings in record members</p></li>
286
- </ul>
287
- <p><strong>Other changes:</strong></p>
288
- <ul class="simple">
289
- <li><p>Add intptr_t and uintptr_t primitive types</p></li>
290
- <li><p>Add str/str16 type aliases for string/string16</p></li>
291
- <li><p>Various documentation fixes and improvements</p></li>
292
- </ul>
293
- </section>
294
- <section id="koffi-1-3-6">
295
- <h3>Koffi 1.3.6<a class="headerlink" href="#koffi-1-3-6" title="Permalink to this heading">#</a></h3>
296
- <p><strong>Main fixes:</strong></p>
297
- <ul class="simple">
298
- <li><p>Fix install error with Node &lt; 15 on Windows (build system bug)</p></li>
299
- </ul>
300
- <p><strong>Other changes:</strong></p>
301
- <ul class="simple">
302
- <li><p>Detect incompatible Node.js versions when installing Koffi</p></li>
303
- <li><p>Prebuild with Clang for Windows x64 and Linux x64 binaries</p></li>
304
- <li><p>Various documentation improvements</p></li>
305
- </ul>
306
- </section>
307
- <section id="koffi-1-3-5">
308
- <h3>Koffi 1.3.5<a class="headerlink" href="#koffi-1-3-5" title="Permalink to this heading">#</a></h3>
309
- <p><strong>Main changes:</strong></p>
310
- <ul class="simple">
311
- <li><p>Fix memory leak when many async calls are running</p></li>
312
- <li><p>Add configurable limit for maximum number of async calls (max_async_calls)</p></li>
313
- </ul>
314
- <p><strong>Other changes:</strong></p>
315
- <ul class="simple">
316
- <li><p>Reduce default async memory stack and heap size</p></li>
317
- <li><p>Various documentation improvements</p></li>
318
- </ul>
319
- </section>
320
- <section id="koffi-1-3-4">
321
- <h3>Koffi 1.3.4<a class="headerlink" href="#koffi-1-3-4" title="Permalink to this heading">#</a></h3>
322
- <p><strong>Main fixes:</strong></p>
323
- <ul class="simple">
324
- <li><p>Fix possible OpenBSD i386 crash with <code class="docutils literal notranslate"><span class="pre">(void)</span></code> functions</p></li>
325
- </ul>
326
- </section>
327
- <section id="koffi-1-3-3">
328
- <h3>Koffi 1.3.3<a class="headerlink" href="#koffi-1-3-3" title="Permalink to this heading">#</a></h3>
329
- <p><strong>Main fixes:</strong></p>
330
- <ul class="simple">
331
- <li><p>Fix misconversion of signed integer return value as unsigned</p></li>
332
- </ul>
333
- <p><strong>Other changes:</strong></p>
334
- <ul class="simple">
335
- <li><p>Support <code class="docutils literal notranslate"><span class="pre">(void)</span></code> (empty) function signatures</p></li>
336
- <li><p>Disable unsafe compiler optimizations</p></li>
337
- <li><p>Various documentation improvements</p></li>
338
- </ul>
339
- </section>
340
- <section id="koffi-1-3-2">
341
- <h3>Koffi 1.3.2<a class="headerlink" href="#koffi-1-3-2" title="Permalink to this heading">#</a></h3>
342
- <p><strong>Main fixes:</strong></p>
343
- <ul class="simple">
344
- <li><p>Support compilation in C++14 mode (graceful degradation)</p></li>
345
- <li><p>Support older toolchains on Linux (tested on Debian 9)</p></li>
346
- </ul>
347
- </section>
348
- <section id="koffi-1-3-1">
349
- <h3>Koffi 1.3.1<a class="headerlink" href="#koffi-1-3-1" title="Permalink to this heading">#</a></h3>
350
- <p><strong>Main fixes:</strong></p>
351
- <ul class="simple">
352
- <li><p>The prebuilt binary is tested when Koffi is installed, and a rebuild happens if it fails to load</p></li>
353
- </ul>
354
- </section>
355
- <section id="koffi-1-3-0">
356
- <h3>Koffi 1.3.0<a class="headerlink" href="#koffi-1-3-0" title="Permalink to this heading">#</a></h3>
357
- <p><strong>Major changes:</strong></p>
358
- <ul class="simple">
359
- <li><p>Expand and move documentation to <a class="reference external" href="https://koffi.dev/">https://koffi.dev/</a></p></li>
360
- <li><p>Support JS arrays and TypedArrays for pointer arguments (input, output and mixed)</p></li>
361
- </ul>
362
- <p><strong>Other changes:</strong></p>
363
- <ul class="simple">
364
- <li><p>Convert NULL string pointers to null instead of crashing (return values, struct and array members, callbacks)</p></li>
365
- <li><p>Default to ‘string’ array hint for char, char16 and char16_t arrays</p></li>
366
- <li><p>Fix definition of long types on Windows x64 (LLP64 model)</p></li>
367
- <li><p>Restrict automatic string conversion to signed char types</p></li>
368
- <li><p>Detect floating-point ABI before using prebuilt binaries (ARM32, RISC-V)</p></li>
369
- <li><p>Forbid duplicate member names in struct types</p></li>
370
- </ul>
371
- </section>
372
- <section id="koffi-1-2-4">
373
- <h3>Koffi 1.2.4<a class="headerlink" href="#koffi-1-2-4" title="Permalink to this heading">#</a></h3>
374
- <p><strong>New features:</strong></p>
375
- <ul class="simple">
376
- <li><p>Windows ARM64 is now supported</p></li>
377
- </ul>
378
- </section>
379
- <section id="koffi-1-2-3">
380
- <h3>Koffi 1.2.3<a class="headerlink" href="#koffi-1-2-3" title="Permalink to this heading">#</a></h3>
381
- <p><strong>New features:</strong></p>
382
- <ul class="simple">
383
- <li><p>A prebuilt binary for macOS ARM64 (M1) is now included</p></li>
384
- </ul>
385
- </section>
386
- <section id="koffi-1-2-1">
387
- <h3>Koffi 1.2.1<a class="headerlink" href="#koffi-1-2-1" title="Permalink to this heading">#</a></h3>
388
- <p>This entry documents changes since version 1.1.0.</p>
389
- <p><strong>New features:</strong></p>
390
- <ul class="simple">
391
- <li><p>JS functions can be used as C callbacks (cdecl, stdcall) on all platforms</p></li>
392
- <li><p>RISC-V 64 LP64D ABI is supported (LP64 is untested)</p></li>
393
- <li><p>Expose settings for memory usage of synchronous and asynchronous calls</p></li>
394
- <li><p>Transparent conversion between C buffers and strings</p></li>
395
- <li><p>Tentative support for Windows ARM64 (untested)</p></li>
396
- </ul>
397
- <p><strong>Main fixes:</strong></p>
398
- <ul class="simple">
399
- <li><p>Fix excessive stack alignment of structs on x86 platforms</p></li>
400
- <li><p>Fix potential problems with big int64_t/uint64_t values</p></li>
401
- <li><p>Fix possible struct layout errors in push/pop code</p></li>
402
- <li><p>Fix alignment issues in ARM32 push code</p></li>
403
- <li><p>Fix incomplete/buggy support for HFA structs on ARM32 and ARM64</p></li>
404
- <li><p>Fix crashes on OpenBSD caused by missing MAP_STACK flag</p></li>
405
- <li><p>Fix non-sense “duplicate array type” errors</p></li>
406
- <li><p>Fix value <code class="docutils literal notranslate"><span class="pre">koffi.internal</span></code> to false in module (normal) builds</p></li>
407
- <li><p>Make sure we have a redzone below the stack for all architectures</p></li>
408
- <li><p>Use slower allocation for big objects instead of failing</p></li>
409
- </ul>
410
- </section>
411
- </section>
412
- <section id="migration-guide">
413
- <h2>Migration guide<a class="headerlink" href="#migration-guide" title="Permalink to this heading">#</a></h2>
414
- <section id="koffi-1-x-to-2-x">
415
- <h3>Koffi 1.x to 2.x<a class="headerlink" href="#koffi-1-x-to-2-x" title="Permalink to this heading">#</a></h3>
416
- <p>The API was changed in 2.x in a few ways, in order to reduce some excessively “magic” behavior and reduce the syntax differences between C and the C-like prototypes.</p>
417
- <p>You may need to change your code if you use:</p>
418
- <ul class="simple">
419
- <li><p>Callback functions</p></li>
420
- <li><p>Opaque handles</p></li>
421
- <li><p><code class="docutils literal notranslate"><span class="pre">koffi.introspect()</span></code></p></li>
422
- </ul>
423
- <section id="callback-types">
424
- <h4>Callback types<a class="headerlink" href="#callback-types" title="Permalink to this heading">#</a></h4>
425
- <p>In Koffi 1.x, callbacks were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer. Now, you must use them through a pointer: <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">CallIt(CallbackType</span> <span class="pre">func)</span></code> in Koffi 1.x becomes <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">CallIt(CallbackType</span> <span class="pre">*func)</span></code> in version 2.0 and newer.</p>
426
- <p>Given the following C code:</p>
427
- <div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;string.h&gt;</span><span class="cp"></span>
428
- <span class="linenos">2</span>
429
- <span class="linenos">3</span><span class="kt">int</span><span class="w"> </span><span class="nf">TransferToJS</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">cb</span><span class="p">)(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">str</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">))</span><span class="w"></span>
430
- <span class="linenos">4</span><span class="p">{</span><span class="w"></span>
431
- <span class="linenos">5</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">64</span><span class="p">];</span><span class="w"></span>
432
- <span class="linenos">6</span><span class="w"> </span><span class="n">snprintf</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">),</span><span class="w"> </span><span class="s">&quot;Hello %s!&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">str</span><span class="p">);</span><span class="w"></span>
433
- <span class="linenos">7</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">cb</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span><span class="w"> </span><span class="n">age</span><span class="p">);</span><span class="w"></span>
434
- <span class="linenos">8</span><span class="p">}</span><span class="w"></span>
435
- </pre></div>
436
- </div>
437
- <p>The two versions below illustrate the API difference between Koffi 1.x and Koffi 2.x:</p>
438
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
439
- <span class="linenos"> 2</span>
440
- <span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">TransferCallback</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">&#39;int TransferCallback(const char *str, int age)&#39;</span><span class="p">);</span>
441
- <span class="linenos"> 4</span>
442
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">TransferToJS</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;TransferToJS&#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;str&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="nx">TransferCallback</span><span class="p">]);</span>
443
- <span class="linenos"> 6</span><span class="c1">// Equivalent to: const TransferToJS = lib.func(&#39;int TransferToJS(str s, int x, TransferCallback cb)&#39;);</span>
444
- <span class="linenos"> 7</span>
445
- <span class="linenos"> 8</span><span class="kd">let</span> <span class="nx">ret</span> <span class="o">=</span> <span class="nx">TransferToJS</span><span class="p">(</span><span class="s1">&#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>
446
- <span class="linenos"> 9</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span>
447
- <span class="linenos">10</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Your age is:&#39;</span><span class="p">,</span> <span class="nx">age</span><span class="p">);</span>
448
- <span class="linenos">11</span> <span class="k">return</span> <span class="mf">42</span><span class="p">;</span>
449
- <span class="linenos">12</span><span class="p">});</span>
450
- <span class="linenos">13</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ret</span><span class="p">);</span>
451
- </pre></div>
452
- </div>
453
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.x</span>
454
- <span class="linenos"> 2</span>
455
- <span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">TransferCallback</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">callback</span><span class="p">(</span><span class="s1">&#39;int TransferCallback(const char *str, int age)&#39;</span><span class="p">);</span>
456
- <span class="linenos"> 4</span>
457
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">TransferToJS</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;TransferToJS&#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;str&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">pointer</span><span class="p">(</span><span class="nx">TransferCallback</span><span class="p">)]);</span>
458
- <span class="linenos"> 6</span><span class="c1">// Equivalent to: const TransferToJS = lib.func(&#39;int TransferToJS(str s, int x, TransferCallback *cb)&#39;);</span>
459
- <span class="linenos"> 7</span>
460
- <span class="linenos"> 8</span><span class="kd">let</span> <span class="nx">ret</span> <span class="o">=</span> <span class="nx">TransferToJS</span><span class="p">(</span><span class="s1">&#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>
461
- <span class="linenos"> 9</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span>
462
- <span class="linenos">10</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Your age is:&#39;</span><span class="p">,</span> <span class="nx">age</span><span class="p">);</span>
463
- <span class="linenos">11</span> <span class="k">return</span> <span class="mf">42</span><span class="p">;</span>
464
- <span class="linenos">12</span><span class="p">});</span>
465
- <span class="linenos">13</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ret</span><span class="p">);</span>
466
- </pre></div>
467
- </div>
468
- <p>Koffi 1.x only supported <a class="reference internal" href="functions#javascript-callbacks"><span class="std std-doc">transient callbacks</span></a>, you must use Koffi 2.x for registered callbacks.</p>
469
- </section>
470
- <section id="opaque-handles">
471
- <h4>Opaque handles<a class="headerlink" href="#opaque-handles" title="Permalink to this heading">#</a></h4>
472
- <p>In Koffi 1.x, opaque handles were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer. Now, you must use them through a pointer, and use an array for output parameters.</p>
473
- <p>For functions that return handles or pass them by parameter:</p>
474
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
475
- <span class="linenos"> 2</span>
476
- <span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">FILE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;FILE&#39;</span><span class="p">);</span>
477
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">fopen</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;FILE fopen(const char *path, const char *mode)&#39;</span><span class="p">);</span>
478
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">fclose</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int fclose(FILE stream)&#39;</span><span class="p">);</span>
479
- <span class="linenos"> 6</span>
480
- <span class="linenos"> 7</span><span class="kd">let</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="s1">&#39;touch&#39;</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">);</span>
481
- <span class="linenos"> 8</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fp</span><span class="p">)</span>
482
- <span class="linenos"> 9</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to open file&#39;</span><span class="p">);</span>
483
- <span class="linenos">10</span><span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
484
- </pre></div>
485
- </div>
486
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.x</span>
487
- <span class="linenos"> 2</span>
488
- <span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">FILE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;FILE&#39;</span><span class="p">);</span>
489
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">fopen</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;FILE *fopen(const char *path, const char *mode)&#39;</span><span class="p">);</span>
490
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">fclose</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int fclose(FILE *stream)&#39;</span><span class="p">);</span>
491
- <span class="linenos"> 6</span>
492
- <span class="linenos"> 7</span><span class="kd">let</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="s1">&#39;touch&#39;</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">);</span>
493
- <span class="linenos"> 8</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fp</span><span class="p">)</span>
494
- <span class="linenos"> 9</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to open file&#39;</span><span class="p">);</span>
495
- <span class="linenos">10</span><span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
496
- </pre></div>
497
- </div>
498
- <p>For functions that set opaque handles through output parameters (such as <code class="docutils literal notranslate"><span class="pre">sqlite3_open_v2</span></code>), you must now use a single element array as shown below:</p>
499
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
500
- <span class="linenos"> 2</span>
501
- <span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">sqlite3_db</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;sqlite3_db&#39;</span><span class="p">);</span>
502
- <span class="linenos"> 4</span>
503
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">sqlite3_open_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#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;str&#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">sqlite3_db</span><span class="p">),</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="s1">&#39;str&#39;</span><span class="p">]);</span>
504
- <span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">sqlite3_close_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;sqlite3_close_v2&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="nx">sqlite3_db</span><span class="p">]);</span>
505
- <span class="linenos"> 7</span>
506
- <span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">=</span> <span class="mh">0x2</span><span class="p">;</span>
507
- <span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_CREATE</span> <span class="o">=</span> <span class="mh">0x4</span><span class="p">;</span>
508
- <span class="linenos">10</span>
509
- <span class="linenos">11</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="p">{};</span>
510
- <span class="linenos">12</span>
511
- <span class="linenos">13</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">&#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>
512
- <span class="linenos">14</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to open database&#39;</span><span class="p">);</span>
513
- <span class="linenos">15</span>
514
- <span class="linenos">16</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
515
- </pre></div>
516
- </div>
517
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.x</span>
518
- <span class="linenos"> 2</span>
519
- <span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">sqlite3_db</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;sqlite3_db&#39;</span><span class="p">);</span>
520
- <span class="linenos"> 4</span>
521
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">sqlite3_open_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#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;str&#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="mf">2</span><span class="p">)),</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="s1">&#39;str&#39;</span><span class="p">]);</span>
522
- <span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">sqlite3_close_v2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;sqlite3_close_v2&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">pointer</span><span class="p">(</span><span class="nx">sqlite3_db</span><span class="p">)]);</span>
523
- <span class="linenos"> 7</span>
524
- <span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">=</span> <span class="mh">0x2</span><span class="p">;</span>
525
- <span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_CREATE</span> <span class="o">=</span> <span class="mh">0x4</span><span class="p">;</span>
526
- <span class="linenos">10</span>
527
- <span class="linenos">11</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
528
- <span class="linenos">12</span>
529
- <span class="linenos">13</span><span class="kd">let</span> <span class="nx">ptr</span> <span class="o">=</span> <span class="p">[</span><span class="kc">null</span><span class="p">];</span>
530
- <span class="linenos">14</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">&#39;:memory:&#39;</span><span class="p">,</span> <span class="nx">ptr</span><span class="p">,</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">|</span> <span class="nx">SQLITE_OPEN_CREATE</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">)</span>
531
- <span class="linenos">15</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to open database&#39;</span><span class="p">);</span>
532
- <span class="linenos">16</span><span class="nx">db</span> <span class="o">=</span> <span class="nx">ptr</span><span class="p">[</span><span class="mf">0</span><span class="p">];</span>
533
- <span class="linenos">17</span>
534
- <span class="linenos">18</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
535
- </pre></div>
536
- </div>
537
- </section>
538
- <section id="koffi-introspect">
539
- <h4>koffi.introspect()<a class="headerlink" href="#koffi-introspect" title="Permalink to this heading">#</a></h4>
540
- <p>In Koffi 1.x, <code class="docutils literal notranslate"><span class="pre">koffi.introspect()</span></code> would only work with struct types, and return the object passed to <code class="docutils literal notranslate"><span class="pre">koffi.struct()</span></code> to initialize the type. Now this function works with all types.</p>
541
- <p>You can still get the list of struct members:</p>
542
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">StructType</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;StructType&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">dummy</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span> <span class="p">});</span>
543
- <span class="linenos">2</span>
544
- <span class="linenos">3</span><span class="c1">// Koffi 1.x</span>
545
- <span class="linenos">4</span><span class="kd">let</span> <span class="nx">members</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">introspect</span><span class="p">(</span><span class="nx">StructType</span><span class="p">);</span>
546
- <span class="linenos">5</span>
547
- <span class="linenos">6</span><span class="c1">// Koffi 2.x</span>
548
- <span class="linenos">7</span><span class="kd">let</span> <span class="nx">members</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">introspect</span><span class="p">(</span><span class="nx">StructType</span><span class="p">).</span><span class="nx">members</span><span class="p">;</span>
549
- </pre></div>
550
- </div>
551
- </section>
552
- </section>
553
- </section>
554
- </section>
555
-
556
- </article>
557
- </div>
558
- <footer>
559
-
560
- <div class="related-pages">
561
-
562
- <a class="prev-page" href="contribute">
563
- <svg><use href="#svg-arrow-right"></use></svg>
564
- <div class="page-info">
565
- <div class="context">
566
- <span>Previous</span>
567
- </div>
568
-
569
- <div class="title">Contributing</div>
570
-
571
- </div>
572
- </a>
573
- </div>
574
- <div class="bottom-of-page">
575
- <div class="left-details">
576
- <div class="copyright">
577
- Copyright &#169; 2022, Niels Martignène
578
- </div>
579
- Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
580
-
581
- <a href="https://github.com/pradyunsg/furo">Furo</a>
582
-
583
- </div>
584
- <div class="right-details">
585
- <div class="icons">
586
-
587
- </div>
588
- </div>
589
- </div>
590
-
591
- </footer>
592
- </div>
593
- <aside class="toc-drawer">
594
-
595
-
596
- <div class="toc-sticky toc-scroll">
597
- <div class="toc-title-container">
598
- <span class="toc-title">
599
- Contents
600
- </span>
601
- </div>
602
- <div class="toc-tree-container">
603
- <div class="toc-tree">
604
- <ul>
605
- <li><a class="reference internal" href="#">Changelog</a><ul>
606
- <li><a class="reference internal" href="#history">History</a><ul>
607
- <li><a class="reference internal" href="#koffi-2-0-0">Koffi 2.0.0</a></li>
608
- <li><a class="reference internal" href="#koffi-1-3-12">Koffi 1.3.12</a></li>
609
- <li><a class="reference internal" href="#koffi-1-3-11">Koffi 1.3.11</a></li>
610
- <li><a class="reference internal" href="#koffi-1-3-10">Koffi 1.3.10</a></li>
611
- <li><a class="reference internal" href="#koffi-1-3-9">Koffi 1.3.9</a></li>
612
- <li><a class="reference internal" href="#koffi-1-3-8">Koffi 1.3.8</a></li>
613
- <li><a class="reference internal" href="#koffi-1-3-7">Koffi 1.3.7</a></li>
614
- <li><a class="reference internal" href="#koffi-1-3-6">Koffi 1.3.6</a></li>
615
- <li><a class="reference internal" href="#koffi-1-3-5">Koffi 1.3.5</a></li>
616
- <li><a class="reference internal" href="#koffi-1-3-4">Koffi 1.3.4</a></li>
617
- <li><a class="reference internal" href="#koffi-1-3-3">Koffi 1.3.3</a></li>
618
- <li><a class="reference internal" href="#koffi-1-3-2">Koffi 1.3.2</a></li>
619
- <li><a class="reference internal" href="#koffi-1-3-1">Koffi 1.3.1</a></li>
620
- <li><a class="reference internal" href="#koffi-1-3-0">Koffi 1.3.0</a></li>
621
- <li><a class="reference internal" href="#koffi-1-2-4">Koffi 1.2.4</a></li>
622
- <li><a class="reference internal" href="#koffi-1-2-3">Koffi 1.2.3</a></li>
623
- <li><a class="reference internal" href="#koffi-1-2-1">Koffi 1.2.1</a></li>
624
- </ul>
625
- </li>
626
- <li><a class="reference internal" href="#migration-guide">Migration guide</a><ul>
627
- <li><a class="reference internal" href="#koffi-1-x-to-2-x">Koffi 1.x to 2.x</a><ul>
628
- <li><a class="reference internal" href="#callback-types">Callback types</a></li>
629
- <li><a class="reference internal" href="#opaque-handles">Opaque handles</a></li>
630
- <li><a class="reference internal" href="#koffi-introspect">koffi.introspect()</a></li>
631
- </ul>
632
- </li>
633
- </ul>
634
- </li>
635
- </ul>
636
- </li>
637
- </ul>
638
-
639
- </div>
640
- </div>
641
- </div>
642
-
643
-
644
- </aside>
645
- </div>
646
- </div><script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
647
- <script src="_static/jquery.js"></script>
648
- <script src="_static/underscore.js"></script>
649
- <script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
650
- <script src="_static/doctools.js"></script>
651
- <script src="_static/scripts/furo.js"></script>
652
- </body>
653
- </html>