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.
Files changed (84) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/README.md +8 -8
  3. package/build/koffi/darwin_arm64/koffi.node +0 -0
  4. package/build/koffi/darwin_x64/koffi.node +0 -0
  5. package/build/koffi/freebsd_arm64/koffi.node +0 -0
  6. package/build/koffi/freebsd_ia32/koffi.node +0 -0
  7. package/build/koffi/freebsd_x64/koffi.node +0 -0
  8. package/build/koffi/linux_arm64/koffi.node +0 -0
  9. package/build/koffi/linux_ia32/koffi.node +0 -0
  10. package/build/koffi/linux_x64/koffi.node +0 -0
  11. package/build/koffi/musl_arm64/koffi.node +0 -0
  12. package/build/koffi/musl_x64/koffi.node +0 -0
  13. package/build/koffi/openbsd_ia32/koffi.node +0 -0
  14. package/build/koffi/openbsd_x64/koffi.node +0 -0
  15. package/build/koffi/win32_ia32/koffi.node +0 -0
  16. package/build/koffi/win32_x64/koffi.node +0 -0
  17. package/doc/benchmarks.md +33 -33
  18. package/doc/benchmarks.xlsx +0 -0
  19. package/doc/contribute.md +37 -25
  20. package/doc/index.md +8 -8
  21. package/doc/variables.md +1 -1
  22. package/index.d.ts +11 -9
  23. package/index.js +1 -634
  24. package/indirect.js +1 -533
  25. package/lib/native/base/base.cc +63 -85
  26. package/lib/native/base/base.hh +178 -151
  27. package/package.json +3 -4
  28. package/src/build.js +1178 -0
  29. package/src/koffi/CMakeLists.txt +97 -34
  30. package/src/koffi/index.js +359 -0
  31. package/src/koffi/indirect.js +216 -0
  32. package/src/koffi/src/{abi_arm32.cc → abi/arm32.cc} +279 -275
  33. package/src/koffi/src/{abi_arm32_asm.S → abi/arm32_asm.S} +2 -5
  34. package/src/koffi/src/abi/arm64.cc +1511 -0
  35. package/src/koffi/src/{abi_arm64_asm.S → abi/arm64_asm.S} +44 -23
  36. package/src/koffi/src/{abi_arm64_asm.asm → abi/arm64_asm.asm} +32 -25
  37. package/src/koffi/src/{abi_loong64_asm.S → abi/loong64_asm.S} +1 -5
  38. package/src/koffi/src/{abi_riscv64.cc → abi/riscv64.cc} +279 -273
  39. package/src/koffi/src/{abi_riscv64_asm.S → abi/riscv64_asm.S} +1 -4
  40. package/src/koffi/src/abi/x64sysv.cc +1456 -0
  41. package/src/koffi/src/{abi_x64_sysv_asm.S → abi/x64sysv_asm.S} +30 -33
  42. package/src/koffi/src/abi/x64win.cc +1121 -0
  43. package/src/koffi/src/{abi_x64_win_asm.S → abi/x64win_asm.S} +8 -12
  44. package/src/koffi/src/{abi_x64_win_asm.asm → abi/x64win_asm.asm} +11 -14
  45. package/src/koffi/src/abi/x86.cc +1233 -0
  46. package/src/koffi/src/{abi_x86_asm.S → abi/x86_asm.S} +49 -25
  47. package/src/koffi/src/{abi_x86_asm.asm → abi/x86_asm.asm} +11 -14
  48. package/src/koffi/src/call.cc +458 -598
  49. package/src/koffi/src/call.hh +61 -82
  50. package/src/koffi/src/ffi.cc +595 -309
  51. package/src/koffi/src/ffi.hh +103 -89
  52. package/src/koffi/src/parser.cc +0 -4
  53. package/src/koffi/src/primitives.inc +39 -0
  54. package/src/koffi/{tools/write_trampolines.js → src/trampolines.js} +1 -1
  55. package/src/koffi/src/util.cc +503 -446
  56. package/src/koffi/src/util.hh +269 -57
  57. package/src/koffi/src/uv.cc +2 -2
  58. package/src/koffi/src/uv.def +3 -0
  59. package/src/koffi/src/win32.hh +30 -1
  60. package/vendor/node-addon-api/napi-inl.h +4 -0
  61. package/vendor/node-addon-api/napi.h +1 -0
  62. package/build/koffi/linux_armhf/koffi.node +0 -0
  63. package/build/koffi/linux_loong64/koffi.node +0 -0
  64. package/build/koffi/linux_riscv64d/koffi.node +0 -0
  65. package/build/koffi/win32_arm64/koffi.exp +0 -0
  66. package/build/koffi/win32_arm64/koffi.lib +0 -0
  67. package/build/koffi/win32_arm64/koffi.node +0 -0
  68. package/doc/platforms.md +0 -36
  69. package/src/cnoke/LICENSE.txt +0 -22
  70. package/src/cnoke/README.md +0 -99
  71. package/src/cnoke/assets/FindCNoke.cmake +0 -127
  72. package/src/cnoke/assets/toolchains.json +0 -126
  73. package/src/cnoke/assets/win_delay_hook.c +0 -36
  74. package/src/cnoke/cnoke.js +0 -170
  75. package/src/cnoke/package.json +0 -24
  76. package/src/cnoke/src/builder.js +0 -511
  77. package/src/cnoke/src/index.js +0 -10
  78. package/src/cnoke/src/tools.js +0 -407
  79. package/src/koffi/src/abi_arm64.cc +0 -1295
  80. package/src/koffi/src/abi_x64_sysv.cc +0 -939
  81. package/src/koffi/src/abi_x64_win.cc +0 -715
  82. package/src/koffi/src/abi_x86.cc +0 -860
  83. package/src/koffi/src/init.js +0 -105
  84. /package/src/koffi/src/{abi_loong64.cc → abi/loong64.cc} +0 -0
@@ -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
- // This Allocator design should allow efficient and mostly-transparent use of memory
173
- // arenas and simple pointer-bumping allocator. This will be implemented later, for
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
- class MallocAllocator: public Allocator {
177
- protected:
178
- void *Allocate(Size size, unsigned int flags) override
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
- if ((flags & (int)AllocFlag::Zero) && new_size > old_size) {
201
- MemSet((uint8_t *)new_ptr + old_size, 0, new_size - old_size);
202
- }
180
+ return ptr;
181
+ }
203
182
 
204
- ptr = new_ptr;
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
- return ptr;
193
+ ptr = new_ptr;
208
194
  }
209
195
 
210
- void Release(const void *ptr, Size) override
211
- {
212
- free((void *)ptr);
213
- }
214
- };
196
+ return ptr;
197
+ }
215
198
 
216
- class NullAllocator: public Allocator {
217
- protected:
218
- void *Allocate(Size, unsigned int) override { K_UNREACHABLE(); }
219
- void *Resize(void *, Size, Size, unsigned int) override { K_UNREACHABLE(); }
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
- Allocator *GetDefaultAllocator()
204
+ K_DEFAULT_ALLOCATOR *GetDefaultAllocator()
224
205
  {
225
- static Allocator *default_allocator = new K_DEFAULT_ALLOCATOR;
226
- return default_allocator;
206
+ return &default_allocator;
227
207
  }
228
208
 
229
209
  Allocator *GetNullAllocator()
230
210
  {
231
- static Allocator *null_allocator = new NullAllocator;
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
- ReleaseRaw(allocator, bucket, -1);
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
- ReleaseRaw(allocator, bucket, -1);
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, unsigned int flags)
258
+ void *LinkedAllocator::Allocate(Size size)
280
259
  {
281
- Bucket *bucket = (Bucket *)AllocateRaw(allocator, K_SIZE(Bucket) + size, flags);
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, unsigned int flags)
281
+ void *LinkedAllocator::Resize(void *ptr, Size old_size, Size new_size)
297
282
  {
298
283
  if (!ptr) {
299
- ptr = Allocate(new_size, flags);
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 *)ResizeRaw(allocator, bucket, K_SIZE(Bucket) + old_size,
308
- K_SIZE(Bucket) + new_size, flags);
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
- ReleaseRaw(allocator, bucket, K_SIZE(Bucket) + size);
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, unsigned int flags)
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 *)AllocateRaw(&allocator, size, flags);
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 *)AllocateRaw(&allocator, K_SIZE(Bucket) + block_size,
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, unsigned int flags)
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 = ResizeRaw(&allocator, ptr, old_size, new_size, flags);
440
+ ptr = allocator.Resize(ptr, old_size, new_size);
456
441
  } else {
457
- void *new_ptr = Allocate(new_size, flags & ~(int)AllocFlag::Zero);
458
-
459
- if (new_size > old_size) {
460
- MemCpy(new_ptr, ptr, old_size);
442
+ void *new_ptr = Allocate(new_size);
461
443
 
462
- if (flags & (int)AllocFlag::Zero) {
463
- MemSet((uint8_t *)ptr + old_size, 0, new_size - old_size);
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
- ReleaseRaw(&allocator, current_bucket, K_SIZE(Bucket) + block_size);
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
- ReleaseRaw(&allocator, ptr, size);
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
  }