koffi 2.3.4 → 2.3.6-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/CHANGELOG.md +25 -2
  2. package/doc/changelog.md +4 -0
  3. package/doc/index.rst +1 -2
  4. package/doc/types.md +3 -3
  5. package/package.json +5 -5
  6. package/src/cnoke/cnoke.js +40 -834
  7. package/src/cnoke/package.json +1 -0
  8. package/src/cnoke/src/builder.js +447 -0
  9. package/src/cnoke/src/index.js +20 -0
  10. package/src/cnoke/src/tools.js +401 -0
  11. package/src/core/libcc/libcc.cc +2 -2
  12. package/src/koffi/build/2.3.6-beta.1/koffi_darwin_arm64/koffi.node +0 -0
  13. package/src/koffi/build/2.3.6-beta.1/koffi_darwin_x64/koffi.node +0 -0
  14. package/src/koffi/build/2.3.6-beta.1/koffi_freebsd_arm64/koffi.node +0 -0
  15. package/src/koffi/build/2.3.6-beta.1/koffi_freebsd_ia32/koffi.node +0 -0
  16. package/src/koffi/build/2.3.6-beta.1/koffi_freebsd_x64/koffi.node +0 -0
  17. package/src/koffi/build/2.3.6-beta.1/koffi_linux_arm32hf/koffi.node +0 -0
  18. package/src/koffi/build/2.3.6-beta.1/koffi_linux_arm64/koffi.node +0 -0
  19. package/src/koffi/build/2.3.6-beta.1/koffi_linux_ia32/koffi.node +0 -0
  20. package/src/koffi/build/2.3.6-beta.1/koffi_linux_riscv64hf64/koffi.node +0 -0
  21. package/src/koffi/build/2.3.6-beta.1/koffi_linux_x64/koffi.node +0 -0
  22. package/src/koffi/build/2.3.6-beta.1/koffi_openbsd_ia32/koffi.node +0 -0
  23. package/src/koffi/build/2.3.6-beta.1/koffi_openbsd_x64/koffi.node +0 -0
  24. package/src/koffi/build/2.3.6-beta.1/koffi_win32_arm64/koffi.exp +0 -0
  25. package/src/koffi/build/2.3.6-beta.1/koffi_win32_arm64/koffi.lib +0 -0
  26. package/src/koffi/build/2.3.6-beta.1/koffi_win32_arm64/koffi.node +0 -0
  27. package/src/koffi/build/2.3.6-beta.1/koffi_win32_arm64/koffi.pdb +0 -0
  28. package/src/koffi/build/2.3.6-beta.1/koffi_win32_ia32/koffi.exp +0 -0
  29. package/src/koffi/build/2.3.6-beta.1/koffi_win32_ia32/koffi.lib +0 -0
  30. package/src/koffi/build/2.3.6-beta.1/koffi_win32_ia32/koffi.node +0 -0
  31. package/src/koffi/build/2.3.6-beta.1/koffi_win32_ia32/koffi.pdb +0 -0
  32. package/src/koffi/build/2.3.6-beta.1/koffi_win32_x64/koffi.exp +0 -0
  33. package/src/koffi/build/2.3.6-beta.1/koffi_win32_x64/koffi.lib +0 -0
  34. package/src/koffi/build/2.3.6-beta.1/koffi_win32_x64/koffi.node +0 -0
  35. package/src/koffi/build/2.3.6-beta.1/koffi_win32_x64/koffi.pdb +0 -0
  36. package/src/koffi/src/abi_arm32.cc +43 -14
  37. package/src/koffi/src/abi_arm64.cc +95 -21
  38. package/src/koffi/src/abi_riscv64.cc +125 -64
  39. package/src/koffi/src/abi_x64_sysv.cc +38 -20
  40. package/src/koffi/src/abi_x64_win.cc +11 -5
  41. package/src/koffi/src/abi_x86.cc +14 -7
  42. package/src/koffi/src/call.cc +114 -44
  43. package/src/koffi/src/call.hh +6 -4
  44. package/src/koffi/src/ffi.cc +172 -147
  45. package/src/koffi/src/ffi.hh +18 -10
  46. package/src/koffi/src/index.d.ts +28 -7
  47. package/src/koffi/src/index.js +23 -4
  48. package/src/koffi/src/util.cc +261 -69
  49. package/src/koffi/src/util.hh +34 -8
  50. package/vendor/node-addon-api/CHANGELOG.md +122 -9
  51. package/vendor/node-addon-api/CONTRIBUTING.md +10 -10
  52. package/vendor/node-addon-api/README.md +36 -12
  53. package/vendor/node-addon-api/benchmark/function_args.cc +95 -62
  54. package/vendor/node-addon-api/benchmark/function_args.js +6 -6
  55. package/vendor/node-addon-api/benchmark/index.js +1 -1
  56. package/vendor/node-addon-api/benchmark/property_descriptor.cc +27 -34
  57. package/vendor/node-addon-api/benchmark/property_descriptor.js +5 -4
  58. package/vendor/node-addon-api/doc/async_operations.md +1 -1
  59. package/vendor/node-addon-api/doc/async_worker_variants.md +23 -2
  60. package/vendor/node-addon-api/doc/cmake-js.md +1 -1
  61. package/vendor/node-addon-api/doc/error_handling.md +3 -3
  62. package/vendor/node-addon-api/doc/external.md +7 -0
  63. package/vendor/node-addon-api/doc/handle_scope.md +14 -0
  64. package/vendor/node-addon-api/doc/hierarchy.md +1 -1
  65. package/vendor/node-addon-api/doc/object.md +27 -0
  66. package/vendor/node-addon-api/index.js +3 -3
  67. package/vendor/node-addon-api/napi-inl.deprecated.h +121 -127
  68. package/vendor/node-addon-api/napi-inl.h +1178 -1144
  69. package/vendor/node-addon-api/napi.h +2786 -2675
  70. package/vendor/node-addon-api/package.json +42 -1
  71. package/vendor/node-addon-api/test/addon.cc +8 -6
  72. package/vendor/node-addon-api/test/addon_build/index.js +9 -9
  73. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +2 -1
  74. package/vendor/node-addon-api/test/addon_build/tpl/index.js +4 -4
  75. package/vendor/node-addon-api/test/addon_data.cc +12 -13
  76. package/vendor/node-addon-api/test/array_buffer.js +3 -2
  77. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +13 -3
  78. package/vendor/node-addon-api/test/async_progress_queue_worker.js +5 -5
  79. package/vendor/node-addon-api/test/async_progress_worker.cc +65 -9
  80. package/vendor/node-addon-api/test/async_progress_worker.js +14 -9
  81. package/vendor/node-addon-api/test/async_worker.cc +236 -3
  82. package/vendor/node-addon-api/test/async_worker.js +122 -37
  83. package/vendor/node-addon-api/test/async_worker_nocallback.js +9 -3
  84. package/vendor/node-addon-api/test/async_worker_persistent.js +2 -2
  85. package/vendor/node-addon-api/test/basic_types/array.js +3 -4
  86. package/vendor/node-addon-api/test/basic_types/boolean.cc +4 -2
  87. package/vendor/node-addon-api/test/basic_types/boolean.js +1 -2
  88. package/vendor/node-addon-api/test/basic_types/number.cc +12 -6
  89. package/vendor/node-addon-api/test/basic_types/number.js +19 -18
  90. package/vendor/node-addon-api/test/basic_types/value.cc +52 -1
  91. package/vendor/node-addon-api/test/basic_types/value.js +44 -21
  92. package/vendor/node-addon-api/test/bigint.cc +2 -1
  93. package/vendor/node-addon-api/test/binding.cc +11 -5
  94. package/vendor/node-addon-api/test/binding.gyp +3 -1
  95. package/vendor/node-addon-api/test/buffer.cc +46 -38
  96. package/vendor/node-addon-api/test/buffer.js +12 -12
  97. package/vendor/node-addon-api/test/callbackInfo.cc +27 -0
  98. package/vendor/node-addon-api/test/callbackInfo.js +9 -0
  99. package/vendor/node-addon-api/test/callbackscope.cc +19 -2
  100. package/vendor/node-addon-api/test/callbackscope.js +20 -20
  101. package/vendor/node-addon-api/test/common/index.js +37 -4
  102. package/vendor/node-addon-api/test/dataview/dataview.js +5 -5
  103. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +14 -12
  104. package/vendor/node-addon-api/test/date.cc +2 -1
  105. package/vendor/node-addon-api/test/date.js +2 -2
  106. package/vendor/node-addon-api/test/env_cleanup.cc +12 -0
  107. package/vendor/node-addon-api/test/env_cleanup.js +38 -39
  108. package/vendor/node-addon-api/test/error.cc +6 -5
  109. package/vendor/node-addon-api/test/error_terminating_environment.js +64 -60
  110. package/vendor/node-addon-api/test/external.cc +36 -32
  111. package/vendor/node-addon-api/test/external.js +43 -46
  112. package/vendor/node-addon-api/test/function.cc +58 -44
  113. package/vendor/node-addon-api/test/function.js +4 -0
  114. package/vendor/node-addon-api/test/function_reference.cc +15 -13
  115. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +50 -53
  116. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +33 -34
  117. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +38 -40
  118. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +47 -49
  119. package/vendor/node-addon-api/test/handlescope.cc +29 -3
  120. package/vendor/node-addon-api/test/handlescope.js +5 -3
  121. package/vendor/node-addon-api/test/index.js +1 -5
  122. package/vendor/node-addon-api/test/maybe/check.cc +49 -3
  123. package/vendor/node-addon-api/test/maybe/index.js +19 -7
  124. package/vendor/node-addon-api/test/memory_management.cc +9 -8
  125. package/vendor/node-addon-api/test/memory_management.js +2 -2
  126. package/vendor/node-addon-api/test/movable_callbacks.js +2 -2
  127. package/vendor/node-addon-api/test/name.js +3 -3
  128. package/vendor/node-addon-api/test/napi_child.js +2 -2
  129. package/vendor/node-addon-api/test/object/delete_property.js +7 -7
  130. package/vendor/node-addon-api/test/object/finalizer.cc +13 -12
  131. package/vendor/node-addon-api/test/object/finalizer.js +2 -2
  132. package/vendor/node-addon-api/test/object/get_property.js +6 -6
  133. package/vendor/node-addon-api/test/object/has_own_property.js +3 -3
  134. package/vendor/node-addon-api/test/object/has_property.js +4 -4
  135. package/vendor/node-addon-api/test/object/object.cc +191 -111
  136. package/vendor/node-addon-api/test/object/object.js +53 -52
  137. package/vendor/node-addon-api/test/object/object_deprecated.cc +24 -20
  138. package/vendor/node-addon-api/test/object/object_deprecated.js +3 -8
  139. package/vendor/node-addon-api/test/object/object_freeze_seal.js +54 -54
  140. package/vendor/node-addon-api/test/object/object_type_tag.cc +39 -0
  141. package/vendor/node-addon-api/test/object/object_type_tag.js +55 -0
  142. package/vendor/node-addon-api/test/object/subscript_operator.js +2 -2
  143. package/vendor/node-addon-api/test/object_reference.js +100 -100
  144. package/vendor/node-addon-api/test/objectwrap.cc +41 -34
  145. package/vendor/node-addon-api/test/objectwrap.js +23 -19
  146. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +5 -5
  147. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +1 -1
  148. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +7 -7
  149. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +1 -1
  150. package/vendor/node-addon-api/test/objectwrap_removewrap.js +24 -32
  151. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +5 -4
  152. package/vendor/node-addon-api/test/promise.cc +7 -0
  153. package/vendor/node-addon-api/test/promise.js +3 -1
  154. package/vendor/node-addon-api/test/reference.cc +1 -1
  155. package/vendor/node-addon-api/test/reference.js +2 -2
  156. package/vendor/node-addon-api/test/run_script.cc +1 -1
  157. package/vendor/node-addon-api/test/symbol.js +59 -66
  158. package/vendor/node-addon-api/test/testUtil.js +6 -6
  159. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +64 -29
  160. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +71 -34
  161. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +111 -19
  162. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +2 -1
  163. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +36 -26
  164. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +5 -5
  165. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +3 -2
  166. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +1 -1
  167. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +47 -32
  168. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +3 -3
  169. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +22 -9
  170. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +76 -31
  171. package/vendor/node-addon-api/test/thunking_manual.cc +61 -74
  172. package/vendor/node-addon-api/test/thunking_manual.js +6 -7
  173. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +20 -20
  174. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +19 -19
  175. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +57 -5
  176. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +2 -0
  177. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +5 -5
  178. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +5 -1
  179. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +4 -3
  180. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +3 -3
  181. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +14 -0
  182. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +76 -31
  183. package/vendor/node-addon-api/test/typedarray-bigint.js +2 -2
  184. package/vendor/node-addon-api/test/typedarray.cc +263 -70
  185. package/vendor/node-addon-api/test/typedarray.js +44 -10
  186. package/vendor/node-addon-api/test/version_management.cc +16 -15
  187. package/vendor/node-addon-api/test/version_management.js +18 -20
  188. package/vendor/node-addon-api/tools/check-napi.js +13 -14
  189. package/vendor/node-addon-api/tools/conversion.js +161 -169
  190. package/vendor/node-addon-api/tools/eslint-format.js +9 -1
  191. package/vendor/node-addon-api/unit-test/README.md +4 -4
  192. package/src/koffi/build/2.3.4/koffi_darwin_arm64.tar.gz +0 -0
  193. package/src/koffi/build/2.3.4/koffi_darwin_x64.tar.gz +0 -0
  194. package/src/koffi/build/2.3.4/koffi_freebsd_arm64.tar.gz +0 -0
  195. package/src/koffi/build/2.3.4/koffi_freebsd_ia32.tar.gz +0 -0
  196. package/src/koffi/build/2.3.4/koffi_freebsd_x64.tar.gz +0 -0
  197. package/src/koffi/build/2.3.4/koffi_linux_arm32hf.tar.gz +0 -0
  198. package/src/koffi/build/2.3.4/koffi_linux_arm64.tar.gz +0 -0
  199. package/src/koffi/build/2.3.4/koffi_linux_ia32.tar.gz +0 -0
  200. package/src/koffi/build/2.3.4/koffi_linux_riscv64hf64.tar.gz +0 -0
  201. package/src/koffi/build/2.3.4/koffi_linux_x64.tar.gz +0 -0
  202. package/src/koffi/build/2.3.4/koffi_openbsd_ia32.tar.gz +0 -0
  203. package/src/koffi/build/2.3.4/koffi_openbsd_x64.tar.gz +0 -0
  204. package/src/koffi/build/2.3.4/koffi_win32_arm64.tar.gz +0 -0
  205. package/src/koffi/build/2.3.4/koffi_win32_ia32.tar.gz +0 -0
  206. package/src/koffi/build/2.3.4/koffi_win32_x64.tar.gz +0 -0
@@ -0,0 +1,401 @@
1
+ // This program is free software: you can redistribute it and/or modify
2
+ // it under the terms of the GNU Lesser General Public License as published by
3
+ // the Free Software Foundation, either version 3 of the License, or
4
+ // (at your option) any later version.
5
+ //
6
+ // This program is distributed in the hope that it will be useful,
7
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
+ // GNU Lesser General Public License for more details.
10
+ //
11
+ // You should have received a copy of the GNU Lesser General Public License
12
+ // along with this program. If not, see https://www.gnu.org/licenses/.
13
+
14
+ 'use strict';
15
+
16
+ const crypto = require('crypto');
17
+ const fs = require('fs');
18
+ const http = require('https');
19
+ const path = require('path');
20
+ const zlib = require('zlib');
21
+
22
+ async function download_http(url, dest) {
23
+ if (Array.isArray(url)) {
24
+ let urls = url;
25
+
26
+ for (let url of urls) {
27
+ try {
28
+ await download_http(url, dest);
29
+ return;
30
+ } catch (err) {
31
+ if (err.code != 404)
32
+ throw err;
33
+ }
34
+ }
35
+
36
+ throw new Error('All URLs returned error 404');
37
+ }
38
+
39
+ console.log('>> Downloading ' + url);
40
+
41
+ let [tmp_name, file] = open_temporary_stream(dest);
42
+
43
+ try {
44
+ await new Promise((resolve, reject) => {
45
+ let request = http.get(url, response => {
46
+ if (response.statusCode != 200) {
47
+ let err = new Error(`Download failed: ${response.statusMessage} [${response.statusCode}]`);
48
+ err.code = response.statusCode;
49
+
50
+ reject(err);
51
+
52
+ return;
53
+ }
54
+
55
+ response.pipe(file);
56
+
57
+ file.on('finish', () => file.close(() => {
58
+ try {
59
+ fs.renameSync(file.path, dest);
60
+ } catch (err) {
61
+ if (err.code != 'EBUSY')
62
+ reject(err);
63
+ }
64
+
65
+ resolve();
66
+ }));
67
+ });
68
+
69
+ request.on('error', reject);
70
+ file.on('error', reject);
71
+ });
72
+ } catch (err) {
73
+ file.close();
74
+
75
+ try {
76
+ fs.unlinkSync(tmp_name);
77
+ } catch (err) {
78
+ if (err.code != 'ENOENT')
79
+ throw err;
80
+ }
81
+
82
+ throw err;
83
+ }
84
+ }
85
+
86
+ function open_temporary_stream(prefix) {
87
+ let buf = Buffer.allocUnsafe(4);
88
+
89
+ for (;;) {
90
+ try {
91
+ crypto.randomFillSync(buf);
92
+
93
+ let suffix = buf.toString('hex').padStart(8, '0');
94
+ let filename = `${prefix}.${suffix}`;
95
+
96
+ let file = fs.createWriteStream(filename, { flags: 'wx', mode: 0o644 });
97
+ return [filename, file];
98
+ } catch (err) {
99
+ if (err.code != 'EEXIST')
100
+ throw err;
101
+ }
102
+ }
103
+ }
104
+
105
+ function extract_targz(filename, dest_dir, strip = 0) {
106
+ let reader = fs.createReadStream(filename).pipe(zlib.createGunzip());
107
+
108
+ return new Promise((resolve, reject) => {
109
+ let header = null;
110
+ let extended = {};
111
+
112
+ reader.on('readable', () => {
113
+ try {
114
+ for (;;) {
115
+ if (header == null) {
116
+ let buf = reader.read(512);
117
+ if (buf == null)
118
+ break;
119
+
120
+ // Two zeroed 512-byte blocks end the stream
121
+ if (!buf[0])
122
+ continue;
123
+
124
+ header = {
125
+ filename: buf.toString('utf-8', 0, 100).replace(/\0/g, ''),
126
+ mode: parseInt(buf.toString('ascii', 100, 109), 8),
127
+ size: parseInt(buf.toString('ascii', 124, 137), 8),
128
+ type: String.fromCharCode(buf[156])
129
+ };
130
+
131
+ // UStar filename prefix
132
+ /*if (buf.toString('ascii', 257, 263) == 'ustar\0') {
133
+ let prefix = buf.toString('utf-8', 345, 500).replace(/\0/g, '');
134
+ console.log(prefix);
135
+ header.filename = prefix ? (prefix + '/' + header.filename) : header.filename;
136
+ }*/
137
+
138
+ Object.assign(header, extended);
139
+ extended = {};
140
+
141
+ // Safety checks
142
+ header.filename = header.filename.replace(/\\/g, '/');
143
+ if (!header.filename.length)
144
+ throw new Error(`Insecure empty filename inside TAR archive`);
145
+ if (path_is_absolute(header.filename[0]))
146
+ throw new Error(`Insecure filename starting with / inside TAR archive`);
147
+ if (path_has_dotdot(header.filename))
148
+ throw new Error(`Insecure filename containing '..' inside TAR archive`);
149
+
150
+ for (let i = 0; i < strip; i++)
151
+ header.filename = header.filename.substr(header.filename.indexOf('/') + 1);
152
+ }
153
+
154
+ let aligned = Math.floor((header.size + 511) / 512) * 512;
155
+ let data = header.size ? reader.read(aligned) : null;
156
+ if (data == null) {
157
+ if (header.size)
158
+ break;
159
+ data = Buffer.alloc(0);
160
+ }
161
+ data = data.subarray(0, header.size);
162
+
163
+ if (header.type == '0' || header.type == '7') {
164
+ let filename = dest_dir + '/' + header.filename;
165
+ let dirname = path.dirname(filename);
166
+
167
+ fs.mkdirSync(dirname, { recursive: true, mode: 0o755 });
168
+ fs.writeFileSync(filename, data, { mode: header.mode });
169
+ } else if (header.type == '5') {
170
+ let filename = dest_dir + '/' + header.filename;
171
+ fs.mkdirSync(filename, { recursive: true, mode: header.mode });
172
+ } else if (header.type == 'L') { // GNU tar
173
+ extended.filename = data.toString('utf-8').replace(/\0/g, '');
174
+ } else if (header.type == 'x') { // PAX entry
175
+ let str = data.toString('utf-8');
176
+
177
+ try {
178
+ while (str.length) {
179
+ let matches = str.match(/^([0-9]+) ([a-zA-Z0-9\._]+)=(.*)\n/);
180
+
181
+ let skip = parseInt(matches[1], 10);
182
+ let key = matches[2];
183
+ let value = matches[3];
184
+
185
+ switch (key) {
186
+ case 'path': { extended.filename = value; } break;
187
+ case 'size': { extended.size = parseInt(value, 10); } break;
188
+ }
189
+
190
+ str = str.substr(skip).trimStart();
191
+ }
192
+ } catch (err) {
193
+ throw new Error('Malformed PAX entry');
194
+ }
195
+ }
196
+
197
+ header = null;
198
+ }
199
+ } catch (err) {
200
+ reject(err);
201
+ }
202
+ });
203
+
204
+ reader.on('error', reject);
205
+ reader.on('end', resolve);
206
+ });
207
+ }
208
+
209
+ function path_is_absolute(path) {
210
+ if (process.platform == 'win32' && path.match(/^[a-zA-Z]:/))
211
+ path = path.substr(2);
212
+ return is_path_separator(path[0]);
213
+ }
214
+
215
+ function path_has_dotdot(path) {
216
+ let start = 0;
217
+
218
+ for (;;) {
219
+ let offset = path.indexOf('..', start);
220
+ if (offset < 0)
221
+ break;
222
+ start = offset + 2;
223
+
224
+ if (offset && !is_path_separator(path[offset - 1]))
225
+ continue;
226
+ if (offset + 2 < path.length && !is_path_separator(path[offset + 2]))
227
+ continue;
228
+
229
+ return true;
230
+ }
231
+
232
+ return false;
233
+ }
234
+
235
+ function is_path_separator(c) {
236
+ if (c == '/')
237
+ return true;
238
+ if (process.platform == 'win32' && c == '\\')
239
+ return true;
240
+
241
+ return false;
242
+ }
243
+
244
+ function determine_arch() {
245
+ let arch = process.arch;
246
+
247
+ if (arch == 'riscv32' || arch == 'riscv64') {
248
+ let buf = read_file_header(process.execPath, 512);
249
+ let header = decode_elf_header(buf);
250
+ let float_abi = (header.e_flags & 0x6) >> 1;
251
+
252
+ switch (float_abi) {
253
+ case 0: { arch += 'sf'; } break;
254
+ case 1: { arch += 'hf32'; } break;
255
+ case 2: { arch += 'hf64'; } break;
256
+ case 3: { arch += 'hf128'; } break;
257
+ }
258
+ } else if (arch == 'arm') {
259
+ arch = 'arm32';
260
+
261
+ let buf = read_file_header(process.execPath, 512);
262
+ let header = decode_elf_header(buf);
263
+
264
+ if (header.e_flags & 0x400) {
265
+ arch += 'hf';
266
+ } else if (header.e_flags & 0x200) {
267
+ arch += 'sf';
268
+ } else {
269
+ throw new Error('Unknown ARM floating-point ABI');
270
+ }
271
+ }
272
+
273
+ return arch;
274
+ }
275
+
276
+ function read_file_header(filename, read) {
277
+ let fd = null;
278
+
279
+ try {
280
+ let fd = fs.openSync(filename);
281
+
282
+ let buf = Buffer.allocUnsafe(read);
283
+ let len = fs.readSync(fd, buf);
284
+
285
+ return buf.subarray(0, len);
286
+ } finally {
287
+ if (fd != null)
288
+ fs.closeSync(fd);
289
+ }
290
+ }
291
+
292
+ function decode_elf_header(buf) {
293
+ let header = {};
294
+
295
+ if (buf.length < 16)
296
+ throw new Error('Truncated header');
297
+ if (buf[0] != 0x7F || buf[1] != 69 || buf[2] != 76 || buf[3] != 70)
298
+ throw new Error('Invalid magic number');
299
+ if (buf[6] != 1)
300
+ throw new Error('Invalid ELF version');
301
+ if (buf[5] != 1)
302
+ throw new Error('Big-endian architectures are not supported');
303
+
304
+ let machine = buf.readUInt16LE(18);
305
+
306
+ switch (machine) {
307
+ case 3: { header.e_machine = 'ia32'; } break;
308
+ case 40: { header.e_machine = 'arm'; } break;
309
+ case 62: { header.e_machine = 'amd64'; } break;
310
+ case 183: { header.e_machine = 'arm64'; } break;
311
+ case 243: {
312
+ switch (buf[4]) {
313
+ case 1: { header.e_machine = 'riscv32'; } break;
314
+ case 2: { header.e_machine = 'riscv64'; } break;
315
+ }
316
+ } break;
317
+ default: throw new Error('Unknown ELF machine type');
318
+ }
319
+
320
+ switch (buf[4]) {
321
+ case 1: { // 32 bit
322
+ buf = buf.subarray(0, 68);
323
+ if (buf.length < 68)
324
+ throw new Error('Truncated ELF header');
325
+
326
+ header.ei_class = 32;
327
+ header.e_flags = buf.readUInt32LE(36);
328
+ } break;
329
+ case 2: { // 64 bit
330
+ buf = buf.subarray(0, 120);
331
+ if (buf.length < 120)
332
+ throw new Error('Truncated ELF header');
333
+
334
+ header.ei_class = 64;
335
+ header.e_flags = buf.readUInt32LE(48);
336
+ } break;
337
+ default: throw new Error('Invalid ELF class');
338
+ }
339
+
340
+ return header;
341
+ }
342
+
343
+ function unlink_recursive(path) {
344
+ try {
345
+ if (fs.rmSync != null) {
346
+ fs.rmSync(path, { recursive: true, maxRetries: process.platform == 'win32' ? 3 : 0 });
347
+ } else {
348
+ fs.rmdirSync(path, { recursive: true, maxRetries: process.platform == 'win32' ? 3 : 0 });
349
+ }
350
+ } catch (err) {
351
+ if (err.code !== 'ENOENT')
352
+ throw err;
353
+ }
354
+ }
355
+
356
+ function get_napi_version(napi, major) {
357
+ if (napi > 8)
358
+ return null;
359
+
360
+ // https://nodejs.org/api/n-api.html#node-api-version-matrix
361
+ const support = {
362
+ 6: ['6.14.2', '6.14.2', '6.14.2'],
363
+ 8: ['8.6.0', '8.10.0', '8.11.2'],
364
+ 9: ['9.0.0', '9.3.0', '9.11.0'],
365
+ 10: ['10.0.0', '10.0.0', '10.0.0', '10.16.0', '10.17.0', '10.20.0', '10.23.0'],
366
+ 11: ['11.0.0', '11.0.0', '11.0.0', '11.8.0'],
367
+ 12: ['12.0.0', '12.0.0', '12.0.0', '12.0.0', '12.11.0', '12.17.0', '12.19.0', '12.22.0'],
368
+ 13: ['13.0.0', '13.0.0', '13.0.0', '13.0.0', '13.0.0'],
369
+ 14: ['14.0.0', '14.0.0', '14.0.0', '14.0.0', '14.0.0', '14.0.0', '14.12.0', '14.17.0'],
370
+ 15: ['15.0.0', '15.0.0', '15.0.0', '15.0.0', '15.0.0', '15.0.0', '15.0.0', '15.12.0']
371
+ };
372
+ const max = Math.max(...Object.keys(support).map(k => parseInt(k, 10)));
373
+
374
+ if (major > max)
375
+ return major + '.0.0';
376
+ if (support[major] == null)
377
+ return null;
378
+
379
+ let required = support[major][napi - 1] || null;
380
+ return required;
381
+ }
382
+
383
+ // Ignores prerelease suffixes
384
+ function cmp_version(ver1, ver2) {
385
+ ver1 = String(ver1).replace(/-.*$/, '').split('.').reduce((acc, v, idx) => acc + parseInt(v, 10) * Math.pow(10, 2 * (5 - idx)), 0);
386
+ ver2 = String(ver2).replace(/-.*$/, '').split('.').reduce((acc, v, idx) => acc + parseInt(v, 10) * Math.pow(10, 2 * (5 - idx)), 0);
387
+
388
+ let cmp = Math.min(Math.max(ver1 - ver2, -1), 1);
389
+ return cmp;
390
+ }
391
+
392
+ module.exports = {
393
+ download_http,
394
+ extract_targz,
395
+ path_is_absolute,
396
+ path_has_dotdot,
397
+ determine_arch,
398
+ unlink_recursive,
399
+ get_napi_version,
400
+ cmp_version
401
+ };
@@ -4048,8 +4048,8 @@ static void DefaultSignalHandler(int signal)
4048
4048
 
4049
4049
  RG_INIT(SetupDefaultHandlers)
4050
4050
  {
4051
- int ret = setpgid(0, 0);
4052
- RG_ASSERT(!ret);
4051
+ // Best effort
4052
+ setpgid(0, 0);
4053
4053
 
4054
4054
  SetSignalHandler(SIGINT, DefaultSignalHandler);
4055
4055
  SetSignalHandler(SIGTERM, DefaultSignalHandler);
@@ -54,12 +54,32 @@ extern "C" napi_value CallSwitchStack(Napi::Function *func, size_t argc, napi_va
54
54
 
55
55
  #include "abi_trampolines.inc"
56
56
 
57
- static inline int IsHFA(const TypeInfo *type)
57
+ static int IsHFA(const TypeInfo *type)
58
58
  {
59
59
  #ifdef __ARM_PCS_VFP
60
- return IsHFA(type, 1, 4);
60
+ bool float32 = false;
61
+ bool float64 = false;
62
+ int count = 0;
63
+
64
+ count = AnalyseFlat(type, [&](const TypeInfo *type, int, int) {
65
+ if (type->primitive == PrimitiveKind::Float32) {
66
+ float32 = true;
67
+ } else if (type->primitive == PrimitiveKind::Float64) {
68
+ float64 = true;
69
+ } else {
70
+ float32 = true;
71
+ float64 = true;
72
+ }
73
+ });
74
+
75
+ if (count < 1 || count > 4)
76
+ return 0;
77
+ if (float32 && float64)
78
+ return 0;
79
+
80
+ return count;
61
81
  #else
62
- return false;
82
+ return 0;
63
83
  #endif
64
84
  }
65
85
 
@@ -67,9 +87,11 @@ bool AnalyseFunction(Napi::Env, InstanceData *, FunctionInfo *func)
67
87
  {
68
88
  if (int hfa = IsHFA(func->ret.type); hfa) {
69
89
  func->ret.vec_count = hfa;
70
- } else if (func->ret.type->primitive != PrimitiveKind::Record ||
71
- func->ret.type->size <= 4) {
90
+ } else if (func->ret.type->primitive != PrimitiveKind::Record &&
91
+ func->ret.type->primitive != PrimitiveKind::Union) {
72
92
  func->ret.gpr_count = (func->ret.type->size > 4) ? 2 : 1;
93
+ } else if (func->ret.type->size <= 4) {
94
+ func->ret.gpr_count = 1;
73
95
  } else {
74
96
  func->ret.use_memory = true;
75
97
  }
@@ -118,7 +140,8 @@ bool AnalyseFunction(Napi::Env, InstanceData *, FunctionInfo *func)
118
140
  started_stack = true;
119
141
  }
120
142
  } break;
121
- case PrimitiveKind::Record: {
143
+ case PrimitiveKind::Record:
144
+ case PrimitiveKind::Union: {
122
145
  int hfa = IsHFA(param.type);
123
146
 
124
147
  if (hfa) {
@@ -319,7 +342,8 @@ bool CallData::Prepare(const FunctionInfo *func, const Napi::CallbackInfo &info)
319
342
 
320
343
  *(void **)((param.gpr_count ? gpr_ptr : args_ptr)++) = ptr;
321
344
  } break;
322
- case PrimitiveKind::Record: {
345
+ case PrimitiveKind::Record:
346
+ case PrimitiveKind::Union: {
323
347
  if (RG_UNLIKELY(!IsObject(value))) {
324
348
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected object", GetValueType(instance, value));
325
349
  return false;
@@ -455,7 +479,8 @@ void CallData::Execute(const FunctionInfo *func)
455
479
  case PrimitiveKind::String16:
456
480
  case PrimitiveKind::Pointer:
457
481
  case PrimitiveKind::Callback: { result.u64 = PERFORM_CALL(GG); } break;
458
- case PrimitiveKind::Record: {
482
+ case PrimitiveKind::Record:
483
+ case PrimitiveKind::Union: {
459
484
  if (func->ret.vec_count) {
460
485
  HfaRet ret = PERFORM_CALL(DDDD);
461
486
  memcpy(&result.buf, &ret, RG_SIZE(ret));
@@ -513,7 +538,8 @@ Napi::Value CallData::Complete(const FunctionInfo *func)
513
538
  return env.Null();
514
539
  }
515
540
  } break;
516
- case PrimitiveKind::Record: {
541
+ case PrimitiveKind::Record:
542
+ case PrimitiveKind::Union: {
517
543
  const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
518
544
  : (const uint8_t *)&result.buf;
519
545
 
@@ -709,7 +735,8 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool async,
709
735
  param.type->dispose(env, param.type, ptr2);
710
736
  }
711
737
  } break;
712
- case PrimitiveKind::Record: {
738
+ case PrimitiveKind::Record:
739
+ case PrimitiveKind::Union: {
713
740
  if (param.vec_count) {
714
741
  Napi::Object obj = DecodeObject(env, (const uint8_t *)vec_ptr, param.type);
715
742
  arguments.Append(obj);
@@ -893,7 +920,8 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool async,
893
920
 
894
921
  if (CheckValueTag(instance, value, type->ref.marker)) {
895
922
  ptr = value.As<Napi::External<uint8_t>>().Data();
896
- } else if (IsObject(value) && type->ref.type->primitive == PrimitiveKind::Record) {
923
+ } else if (IsObject(value) && (type->ref.type->primitive == PrimitiveKind::Record ||
924
+ type->ref.type->primitive == PrimitiveKind::Union)) {
897
925
  Napi::Object obj = value.As<Napi::Object>();
898
926
 
899
927
  ptr = AllocHeap(type->ref.type->size, 16);
@@ -909,7 +937,8 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool async,
909
937
 
910
938
  out_reg->r0 = (uint32_t)ptr;
911
939
  } break;
912
- case PrimitiveKind::Record: {
940
+ case PrimitiveKind::Record:
941
+ case PrimitiveKind::Union: {
913
942
  if (RG_UNLIKELY(!IsObject(value))) {
914
943
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value, expected object", GetValueType(instance, value));
915
944
  return;
@@ -921,8 +950,8 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, bool async,
921
950
  if (!PushObject(obj, type, return_ptr))
922
951
  return;
923
952
  out_reg->r0 = (uint32_t)return_ptr;
924
- } else if (proto->ret.vec_count) { // HFA
925
- PushObject(obj, type, (uint8_t *)&out_reg->d0, 8);
953
+ } else if (proto->ret.vec_count) {
954
+ PushObject(obj, type, (uint8_t *)&out_reg->d0);
926
955
  } else {
927
956
  PushObject(obj, type, (uint8_t *)&out_reg->r0);
928
957
  }