koffi 2.16.1 → 3.0.0-alpha.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.
- package/CHANGELOG.md +2 -2
- package/README.md +8 -8
- package/build/koffi/darwin_arm64/koffi.node +0 -0
- package/build/koffi/darwin_x64/koffi.node +0 -0
- package/build/koffi/freebsd_arm64/koffi.node +0 -0
- package/build/koffi/freebsd_ia32/koffi.node +0 -0
- package/build/koffi/freebsd_x64/koffi.node +0 -0
- package/build/koffi/linux_arm64/koffi.node +0 -0
- package/build/koffi/linux_ia32/koffi.node +0 -0
- package/build/koffi/linux_x64/koffi.node +0 -0
- package/build/koffi/musl_arm64/koffi.node +0 -0
- package/build/koffi/musl_x64/koffi.node +0 -0
- package/build/koffi/openbsd_ia32/koffi.node +0 -0
- package/build/koffi/openbsd_x64/koffi.node +0 -0
- package/build/koffi/win32_ia32/koffi.node +0 -0
- package/build/koffi/win32_x64/koffi.node +0 -0
- package/doc/benchmarks.md +33 -33
- package/doc/benchmarks.xlsx +0 -0
- package/doc/contribute.md +37 -25
- package/doc/index.md +8 -8
- package/doc/variables.md +1 -1
- package/index.d.ts +11 -9
- package/index.js +1 -634
- package/indirect.js +1 -533
- package/lib/native/base/base.cc +63 -85
- package/lib/native/base/base.hh +178 -151
- package/package.json +3 -4
- package/src/build.js +1178 -0
- package/src/koffi/CMakeLists.txt +97 -34
- package/src/koffi/index.js +359 -0
- package/src/koffi/indirect.js +216 -0
- package/src/koffi/src/{abi_arm32.cc → abi/arm32.cc} +279 -275
- package/src/koffi/src/{abi_arm32_asm.S → abi/arm32_asm.S} +2 -5
- package/src/koffi/src/abi/arm64.cc +1511 -0
- package/src/koffi/src/{abi_arm64_asm.S → abi/arm64_asm.S} +44 -23
- package/src/koffi/src/{abi_arm64_asm.asm → abi/arm64_asm.asm} +32 -25
- package/src/koffi/src/{abi_loong64_asm.S → abi/loong64_asm.S} +1 -5
- package/src/koffi/src/{abi_riscv64.cc → abi/riscv64.cc} +279 -273
- package/src/koffi/src/{abi_riscv64_asm.S → abi/riscv64_asm.S} +1 -4
- package/src/koffi/src/abi/x64sysv.cc +1456 -0
- package/src/koffi/src/{abi_x64_sysv_asm.S → abi/x64sysv_asm.S} +30 -33
- package/src/koffi/src/abi/x64win.cc +1121 -0
- package/src/koffi/src/{abi_x64_win_asm.S → abi/x64win_asm.S} +8 -12
- package/src/koffi/src/{abi_x64_win_asm.asm → abi/x64win_asm.asm} +11 -14
- package/src/koffi/src/abi/x86.cc +1233 -0
- package/src/koffi/src/{abi_x86_asm.S → abi/x86_asm.S} +49 -25
- package/src/koffi/src/{abi_x86_asm.asm → abi/x86_asm.asm} +11 -14
- package/src/koffi/src/call.cc +458 -598
- package/src/koffi/src/call.hh +61 -82
- package/src/koffi/src/ffi.cc +595 -309
- package/src/koffi/src/ffi.hh +103 -89
- package/src/koffi/src/parser.cc +0 -4
- package/src/koffi/src/primitives.inc +39 -0
- package/src/koffi/{tools/write_trampolines.js → src/trampolines.js} +1 -1
- package/src/koffi/src/util.cc +503 -446
- package/src/koffi/src/util.hh +269 -57
- package/src/koffi/src/uv.cc +2 -2
- package/src/koffi/src/uv.def +3 -0
- package/src/koffi/src/win32.hh +30 -1
- package/vendor/node-addon-api/napi-inl.h +4 -0
- package/vendor/node-addon-api/napi.h +1 -0
- package/build/koffi/linux_armhf/koffi.node +0 -0
- package/build/koffi/linux_loong64/koffi.node +0 -0
- package/build/koffi/linux_riscv64d/koffi.node +0 -0
- package/build/koffi/win32_arm64/koffi.exp +0 -0
- package/build/koffi/win32_arm64/koffi.lib +0 -0
- package/build/koffi/win32_arm64/koffi.node +0 -0
- package/doc/platforms.md +0 -36
- package/src/cnoke/LICENSE.txt +0 -22
- package/src/cnoke/README.md +0 -99
- package/src/cnoke/assets/FindCNoke.cmake +0 -127
- package/src/cnoke/assets/toolchains.json +0 -126
- package/src/cnoke/assets/win_delay_hook.c +0 -36
- package/src/cnoke/cnoke.js +0 -170
- package/src/cnoke/package.json +0 -24
- package/src/cnoke/src/builder.js +0 -511
- package/src/cnoke/src/index.js +0 -10
- package/src/cnoke/src/tools.js +0 -407
- package/src/koffi/src/abi_arm64.cc +0 -1295
- package/src/koffi/src/abi_x64_sysv.cc +0 -939
- package/src/koffi/src/abi_x64_win.cc +0 -715
- package/src/koffi/src/abi_x86.cc +0 -860
- package/src/koffi/src/init.js +0 -105
- /package/src/koffi/src/{abi_loong64.cc → abi/loong64.cc} +0 -0
package/lib/native/base/base.cc
CHANGED
|
@@ -169,67 +169,46 @@ void *MemMem(const void *src, Size src_len, const void *needle, Size needle_len)
|
|
|
169
169
|
// Memory / Allocator
|
|
170
170
|
// ------------------------------------------------------------------------
|
|
171
171
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
// now it's just a doubly linked list of malloc() memory blocks.
|
|
172
|
+
static K_DEFAULT_ALLOCATOR default_allocator;
|
|
173
|
+
static NullAllocator null_allocator;
|
|
175
174
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
void *
|
|
179
|
-
|
|
180
|
-
void *ptr = malloc((size_t)size);
|
|
181
|
-
K_CRITICAL(ptr, "Failed to allocate %1 of memory", FmtMemSize(size));
|
|
182
|
-
|
|
183
|
-
if (flags & (int)AllocFlag::Zero) {
|
|
184
|
-
MemSet(ptr, 0, size);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return ptr;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
void *Resize(void *ptr, Size old_size, Size new_size, unsigned int flags) override
|
|
191
|
-
{
|
|
192
|
-
if (!new_size) {
|
|
193
|
-
Release(ptr, old_size);
|
|
194
|
-
ptr = nullptr;
|
|
195
|
-
} else {
|
|
196
|
-
void *new_ptr = realloc(ptr, (size_t)new_size);
|
|
197
|
-
K_CRITICAL(new_ptr || !new_size, "Failed to resize %1 memory block to %2",
|
|
198
|
-
FmtMemSize(old_size), FmtMemSize(new_size));
|
|
175
|
+
void *MallocAllocator::Allocate(Size size)
|
|
176
|
+
{
|
|
177
|
+
void *ptr = malloc((size_t)size);
|
|
178
|
+
K_CRITICAL(ptr, "Failed to allocate %1 of memory", FmtMemSize(size));
|
|
199
179
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
180
|
+
return ptr;
|
|
181
|
+
}
|
|
203
182
|
|
|
204
|
-
|
|
205
|
-
|
|
183
|
+
void *MallocAllocator::Resize(void *ptr, Size old_size, Size new_size)
|
|
184
|
+
{
|
|
185
|
+
if (!new_size) {
|
|
186
|
+
Release(ptr, old_size);
|
|
187
|
+
ptr = nullptr;
|
|
188
|
+
} else {
|
|
189
|
+
void *new_ptr = realloc(ptr, (size_t)new_size);
|
|
190
|
+
K_CRITICAL(new_ptr || !new_size, "Failed to resize %1 memory block to %2",
|
|
191
|
+
FmtMemSize(old_size), FmtMemSize(new_size));
|
|
206
192
|
|
|
207
|
-
|
|
193
|
+
ptr = new_ptr;
|
|
208
194
|
}
|
|
209
195
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
free((void *)ptr);
|
|
213
|
-
}
|
|
214
|
-
};
|
|
196
|
+
return ptr;
|
|
197
|
+
}
|
|
215
198
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
void *
|
|
219
|
-
|
|
220
|
-
void Release(const void *, Size) override {}
|
|
221
|
-
};
|
|
199
|
+
void MallocAllocator::Release(const void *ptr, Size)
|
|
200
|
+
{
|
|
201
|
+
free((void *)ptr);
|
|
202
|
+
}
|
|
222
203
|
|
|
223
|
-
|
|
204
|
+
K_DEFAULT_ALLOCATOR *GetDefaultAllocator()
|
|
224
205
|
{
|
|
225
|
-
|
|
226
|
-
return default_allocator;
|
|
206
|
+
return &default_allocator;
|
|
227
207
|
}
|
|
228
208
|
|
|
229
209
|
Allocator *GetNullAllocator()
|
|
230
210
|
{
|
|
231
|
-
|
|
232
|
-
return null_allocator;
|
|
211
|
+
return &null_allocator;
|
|
233
212
|
}
|
|
234
213
|
|
|
235
214
|
LinkedAllocator& LinkedAllocator::operator=(LinkedAllocator &&other)
|
|
@@ -250,7 +229,7 @@ void LinkedAllocator::ReleaseAll()
|
|
|
250
229
|
|
|
251
230
|
do {
|
|
252
231
|
Bucket *next = bucket->next;
|
|
253
|
-
|
|
232
|
+
allocator->Release(bucket, -1);
|
|
254
233
|
bucket = next;
|
|
255
234
|
} while (bucket != list);
|
|
256
235
|
|
|
@@ -266,7 +245,7 @@ void LinkedAllocator::ReleaseAllExcept(void *ptr)
|
|
|
266
245
|
|
|
267
246
|
while (bucket != keep) {
|
|
268
247
|
Bucket *next = bucket->next;
|
|
269
|
-
|
|
248
|
+
allocator->Release(bucket, -1);
|
|
270
249
|
bucket = next;
|
|
271
250
|
}
|
|
272
251
|
|
|
@@ -276,9 +255,15 @@ void LinkedAllocator::ReleaseAllExcept(void *ptr)
|
|
|
276
255
|
keep->next = keep;
|
|
277
256
|
}
|
|
278
257
|
|
|
279
|
-
void *LinkedAllocator::Allocate(Size size
|
|
258
|
+
void *LinkedAllocator::Allocate(Size size)
|
|
280
259
|
{
|
|
281
|
-
|
|
260
|
+
K_ASSERT(size >= 0 && size <= K_SIZE_MAX - K_SIZE(Bucket));
|
|
261
|
+
|
|
262
|
+
Bucket *bucket = (Bucket *)allocator->Allocate(K_SIZE(Bucket) + size);
|
|
263
|
+
|
|
264
|
+
#if defined(K_DEBUG)
|
|
265
|
+
bucket->size = size;
|
|
266
|
+
#endif
|
|
282
267
|
|
|
283
268
|
bucket->prev = bucket;
|
|
284
269
|
bucket->next = bucket;
|
|
@@ -293,10 +278,10 @@ void *LinkedAllocator::Allocate(Size size, unsigned int flags)
|
|
|
293
278
|
return (void *)bucket->data;
|
|
294
279
|
}
|
|
295
280
|
|
|
296
|
-
void *LinkedAllocator::Resize(void *ptr, Size old_size, Size new_size
|
|
281
|
+
void *LinkedAllocator::Resize(void *ptr, Size old_size, Size new_size)
|
|
297
282
|
{
|
|
298
283
|
if (!ptr) {
|
|
299
|
-
ptr = Allocate(new_size
|
|
284
|
+
ptr = Allocate(new_size);
|
|
300
285
|
} else if (!new_size) {
|
|
301
286
|
Release(ptr, old_size);
|
|
302
287
|
ptr = nullptr;
|
|
@@ -304,8 +289,13 @@ void *LinkedAllocator::Resize(void *ptr, Size old_size, Size new_size, unsigned
|
|
|
304
289
|
Bucket *bucket = PointerToBucket(ptr);
|
|
305
290
|
bool single = (bucket->next == bucket);
|
|
306
291
|
|
|
307
|
-
bucket = (Bucket *)
|
|
308
|
-
|
|
292
|
+
bucket = (Bucket *)allocator->Resize(bucket, K_SIZE(Bucket) + old_size,
|
|
293
|
+
K_SIZE(Bucket) + new_size);
|
|
294
|
+
|
|
295
|
+
#if defined(K_DEBUG)
|
|
296
|
+
K_ASSERT(bucket->size == old_size);
|
|
297
|
+
bucket->size = new_size;
|
|
298
|
+
#endif
|
|
309
299
|
|
|
310
300
|
list = bucket;
|
|
311
301
|
|
|
@@ -323,7 +313,7 @@ void *LinkedAllocator::Resize(void *ptr, Size old_size, Size new_size, unsigned
|
|
|
323
313
|
return ptr;
|
|
324
314
|
}
|
|
325
315
|
|
|
326
|
-
void LinkedAllocator::Release(const void *ptr, Size size)
|
|
316
|
+
void LinkedAllocator::Release(const void *ptr, [[maybe_unused]] Size size)
|
|
327
317
|
{
|
|
328
318
|
if (!ptr)
|
|
329
319
|
return;
|
|
@@ -331,12 +321,16 @@ void LinkedAllocator::Release(const void *ptr, Size size)
|
|
|
331
321
|
Bucket *bucket = PointerToBucket((void *)ptr);
|
|
332
322
|
bool single = (bucket->next == bucket);
|
|
333
323
|
|
|
324
|
+
#if defined(K_DEBUG)
|
|
325
|
+
K_ASSERT(bucket->size == size);
|
|
326
|
+
#endif
|
|
327
|
+
|
|
334
328
|
list = single ? nullptr : bucket->next;
|
|
335
329
|
|
|
336
330
|
bucket->prev->next = bucket->next;
|
|
337
331
|
bucket->next->prev = bucket->prev;
|
|
338
332
|
|
|
339
|
-
|
|
333
|
+
allocator->Release(bucket, -1);
|
|
340
334
|
}
|
|
341
335
|
|
|
342
336
|
void LinkedAllocator::GiveTo(LinkedAllocator *alloc)
|
|
@@ -396,7 +390,7 @@ void BlockAllocator::ReleaseAll()
|
|
|
396
390
|
allocator.ReleaseAll();
|
|
397
391
|
}
|
|
398
392
|
|
|
399
|
-
void *BlockAllocator::Allocate(Size size
|
|
393
|
+
void *BlockAllocator::Allocate(Size size)
|
|
400
394
|
{
|
|
401
395
|
K_ASSERT(size >= 0);
|
|
402
396
|
|
|
@@ -404,28 +398,23 @@ void *BlockAllocator::Allocate(Size size, unsigned int flags)
|
|
|
404
398
|
Size aligned_size = AlignLen(size, 8);
|
|
405
399
|
|
|
406
400
|
if (AllocateSeparately(aligned_size)) {
|
|
407
|
-
uint8_t *ptr = (uint8_t *)
|
|
401
|
+
uint8_t *ptr = (uint8_t *)allocator.Allocate(size);
|
|
408
402
|
return ptr;
|
|
409
403
|
} else {
|
|
410
404
|
if (!current_bucket || (current_bucket->used + aligned_size) > block_size) {
|
|
411
|
-
current_bucket = (Bucket *)
|
|
412
|
-
flags & ~(int)AllocFlag::Zero);
|
|
405
|
+
current_bucket = (Bucket *)allocator.Allocate(K_SIZE(Bucket) + block_size);
|
|
413
406
|
current_bucket->used = 0;
|
|
414
407
|
}
|
|
415
408
|
|
|
416
409
|
uint8_t *ptr = current_bucket->data + current_bucket->used;
|
|
417
410
|
current_bucket->used += aligned_size;
|
|
418
411
|
|
|
419
|
-
if (flags & (int)AllocFlag::Zero) {
|
|
420
|
-
MemSet(ptr, 0, size);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
412
|
last_alloc = ptr;
|
|
424
413
|
return ptr;
|
|
425
414
|
}
|
|
426
415
|
}
|
|
427
416
|
|
|
428
|
-
void *BlockAllocator::Resize(void *ptr, Size old_size, Size new_size
|
|
417
|
+
void *BlockAllocator::Resize(void *ptr, Size old_size, Size new_size)
|
|
429
418
|
{
|
|
430
419
|
K_ASSERT(old_size >= 0);
|
|
431
420
|
K_ASSERT(new_size >= 0);
|
|
@@ -447,24 +436,13 @@ void *BlockAllocator::Resize(void *ptr, Size old_size, Size new_size, unsigned i
|
|
|
447
436
|
(current_bucket->used + aligned_delta) <= block_size &&
|
|
448
437
|
!AllocateSeparately(aligned_new_size)) {
|
|
449
438
|
current_bucket->used += aligned_delta;
|
|
450
|
-
|
|
451
|
-
if ((flags & (int)AllocFlag::Zero) && new_size > old_size) {
|
|
452
|
-
MemSet((uint8_t *)ptr + old_size, 0, new_size - old_size);
|
|
453
|
-
}
|
|
454
439
|
} else if (AllocateSeparately(aligned_old_size)) {
|
|
455
|
-
ptr =
|
|
440
|
+
ptr = allocator.Resize(ptr, old_size, new_size);
|
|
456
441
|
} else {
|
|
457
|
-
void *new_ptr = Allocate(new_size
|
|
458
|
-
|
|
459
|
-
if (new_size > old_size) {
|
|
460
|
-
MemCpy(new_ptr, ptr, old_size);
|
|
442
|
+
void *new_ptr = Allocate(new_size);
|
|
461
443
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
}
|
|
465
|
-
} else {
|
|
466
|
-
MemCpy(new_ptr, ptr, new_size);
|
|
467
|
-
}
|
|
444
|
+
Size copy = std::min(old_size, new_size);
|
|
445
|
+
MemCpy(new_ptr, ptr, copy);
|
|
468
446
|
|
|
469
447
|
ptr = new_ptr;
|
|
470
448
|
}
|
|
@@ -484,13 +462,13 @@ void BlockAllocator::Release(const void *ptr, Size size)
|
|
|
484
462
|
current_bucket->used -= aligned_size;
|
|
485
463
|
|
|
486
464
|
if (!current_bucket->used) {
|
|
487
|
-
|
|
465
|
+
allocator.Release(current_bucket, K_SIZE(Bucket) + block_size);
|
|
488
466
|
current_bucket = nullptr;
|
|
489
467
|
}
|
|
490
468
|
|
|
491
469
|
last_alloc = nullptr;
|
|
492
470
|
} else if (AllocateSeparately(aligned_size)) {
|
|
493
|
-
|
|
471
|
+
allocator.Release(ptr, size);
|
|
494
472
|
}
|
|
495
473
|
}
|
|
496
474
|
}
|
|
@@ -4272,7 +4250,7 @@ bool FlushFile(int fd, const char *filename)
|
|
|
4272
4250
|
if (!FlushFileBuffers(h)) {
|
|
4273
4251
|
DWORD err = GetLastError();
|
|
4274
4252
|
|
|
4275
|
-
if (err != ERROR_INVALID_HANDLE) {
|
|
4253
|
+
if (err != ERROR_INVALID_FUNCTION && err != ERROR_INVALID_HANDLE) {
|
|
4276
4254
|
LogError("Failed to sync '%1': %2", filename, GetWin32ErrorString(err));
|
|
4277
4255
|
return false;
|
|
4278
4256
|
}
|