koffi 0.9.22 → 0.9.23

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koffi",
3
- "version": "0.9.22",
3
+ "version": "0.9.23",
4
4
  "description": "Fast and simple FFI (foreign function interface) for Node.js",
5
5
  "keywords": [
6
6
  "foreign",
package/src/call_arm64.cc CHANGED
@@ -123,7 +123,7 @@ Napi::Function::Callback AnalyseFunction(InstanceData *, FunctionInfo *func)
123
123
  } else {
124
124
  gpr_avail = 0;
125
125
  }
126
- } else if (gpr_avail) {
126
+ } else {
127
127
  // Big types (more than 16 bytes) are replaced by a pointer
128
128
  if (gpr_avail) {
129
129
  param.gpr_count = 1;
@@ -400,9 +400,7 @@ static Napi::Value TranslateCall(const Napi::CallbackInfo &info)
400
400
  return env.Null();
401
401
  gpr_ptr += param.gpr_count;
402
402
  } else if (param.type->size) {
403
- int16_t align = (param.type->align <= 4) ? 4 : 8;
404
-
405
- args_ptr = AlignUp(args_ptr, align);
403
+ args_ptr = AlignUp(args_ptr, 8);
406
404
  if (!call.PushObject(obj, param.type, args_ptr))
407
405
  return env.Null();
408
406
  args_ptr += AlignLen(param.type->size, 8);
package/src/ffi.cc CHANGED
@@ -461,7 +461,8 @@ void LibraryHolder::Unref()
461
461
  }
462
462
  }
463
463
 
464
- static void RegisterPrimitiveType(InstanceData *instance, const char *name, PrimitiveKind primitive, int16_t size)
464
+ static void RegisterPrimitiveType(InstanceData *instance, const char *name, PrimitiveKind primitive,
465
+ int16_t size, int16_t align)
465
466
  {
466
467
  TypeInfo *type = instance->types.AppendDefault();
467
468
 
@@ -469,7 +470,7 @@ static void RegisterPrimitiveType(InstanceData *instance, const char *name, Prim
469
470
 
470
471
  type->primitive = primitive;
471
472
  type->size = size;
472
- type->align = size;
473
+ type->align = align;
473
474
 
474
475
  RG_ASSERT(!instance->types_map.Find(name));
475
476
  instance->types_map.Set(type);
@@ -481,53 +482,47 @@ static Napi::Object InitBaseTypes(Napi::Env env)
481
482
 
482
483
  RG_ASSERT(!instance->types.len);
483
484
 
484
- RegisterPrimitiveType(instance, "void", PrimitiveKind::Void, 0);
485
- RegisterPrimitiveType(instance, "void *", PrimitiveKind::Pointer, RG_SIZE(void *));
486
- RegisterPrimitiveType(instance, "bool", PrimitiveKind::Bool, 1);
487
- RegisterPrimitiveType(instance, "int8", PrimitiveKind::Int8, 1);
488
- RegisterPrimitiveType(instance, "int8_t", PrimitiveKind::Int8, 1);
489
- RegisterPrimitiveType(instance, "uint8", PrimitiveKind::UInt8, 1);
490
- RegisterPrimitiveType(instance, "uint8_t", PrimitiveKind::UInt8, 1);
491
- RegisterPrimitiveType(instance, "char", PrimitiveKind::Int8, 1);
492
- RegisterPrimitiveType(instance, "uchar", PrimitiveKind::UInt8, 1);
493
- RegisterPrimitiveType(instance, "unsigned char", PrimitiveKind::UInt8, 1);
494
- RegisterPrimitiveType(instance, "int16", PrimitiveKind::Int16, 2);
495
- RegisterPrimitiveType(instance, "int16_t", PrimitiveKind::Int16, 2);
496
- RegisterPrimitiveType(instance, "uint16", PrimitiveKind::UInt16, 2);
497
- RegisterPrimitiveType(instance, "uint16_t", PrimitiveKind::UInt16, 2);
498
- RegisterPrimitiveType(instance, "short", PrimitiveKind::Int16, 2);
499
- RegisterPrimitiveType(instance, "ushort", PrimitiveKind::UInt16, 2);
500
- RegisterPrimitiveType(instance, "unsigned short", PrimitiveKind::UInt16, 2);
501
- RegisterPrimitiveType(instance, "int32", PrimitiveKind::Int32, 4);
502
- RegisterPrimitiveType(instance, "int32_t", PrimitiveKind::Int32, 4);
503
- RegisterPrimitiveType(instance, "uint32", PrimitiveKind::UInt32, 4);
504
- RegisterPrimitiveType(instance, "uint32_t", PrimitiveKind::UInt32, 4);
505
- RegisterPrimitiveType(instance, "int", PrimitiveKind::Int32, 4);
506
- RegisterPrimitiveType(instance, "uint", PrimitiveKind::UInt32, 4);
507
- RegisterPrimitiveType(instance, "unsigned int", PrimitiveKind::UInt32, 4);
508
- RegisterPrimitiveType(instance, "int64", PrimitiveKind::Int64, 8);
509
- RegisterPrimitiveType(instance, "int64_t", PrimitiveKind::Int64, 8);
510
- RegisterPrimitiveType(instance, "uint64", PrimitiveKind::UInt64, 8);
511
- RegisterPrimitiveType(instance, "uint64_t", PrimitiveKind::UInt64, 8);
512
- #if ULONG_MAX == UINT64_MAX
513
- RegisterPrimitiveType(instance, "long", PrimitiveKind::Int64, 8);
514
- RegisterPrimitiveType(instance, "ulong", PrimitiveKind::UInt64, 8);
515
- RegisterPrimitiveType(instance, "unsigned long", PrimitiveKind::UInt64, 8);
516
- #else
517
- RegisterPrimitiveType(instance, "long", PrimitiveKind::Int32, 4);
518
- RegisterPrimitiveType(instance, "ulong", PrimitiveKind::UInt32, 4);
519
- RegisterPrimitiveType(instance, "unsigned long", PrimitiveKind::UInt64, 4);
520
- #endif
521
- RegisterPrimitiveType(instance, "longlong", PrimitiveKind::Int64, 8);
522
- RegisterPrimitiveType(instance, "long long", PrimitiveKind::Int64, 8);
523
- RegisterPrimitiveType(instance, "ulonglong", PrimitiveKind::UInt64, 8);
524
- RegisterPrimitiveType(instance, "unsigned long long", PrimitiveKind::UInt64, 8);
525
- RegisterPrimitiveType(instance, "float32", PrimitiveKind::Float32, 4);
526
- RegisterPrimitiveType(instance, "float64", PrimitiveKind::Float64, 8);
527
- RegisterPrimitiveType(instance, "float", PrimitiveKind::Float32, 4);
528
- RegisterPrimitiveType(instance, "double", PrimitiveKind::Float64, 8);
529
- RegisterPrimitiveType(instance, "string", PrimitiveKind::String, RG_SIZE(void *));
530
- RegisterPrimitiveType(instance, "str", PrimitiveKind::String, RG_SIZE(void *));
485
+ RegisterPrimitiveType(instance, "void", PrimitiveKind::Void, 0, 0);
486
+ RegisterPrimitiveType(instance, "void *", PrimitiveKind::Pointer, RG_SIZE(void *), alignof(void *));
487
+ RegisterPrimitiveType(instance, "bool", PrimitiveKind::Bool, RG_SIZE(bool), alignof(bool));
488
+ RegisterPrimitiveType(instance, "int8", PrimitiveKind::Int8, 1, 1);
489
+ RegisterPrimitiveType(instance, "int8_t", PrimitiveKind::Int8, 1, 1);
490
+ RegisterPrimitiveType(instance, "uint8", PrimitiveKind::UInt8, 1, 1);
491
+ RegisterPrimitiveType(instance, "uint8_t", PrimitiveKind::UInt8, 1, 1);
492
+ RegisterPrimitiveType(instance, "char", PrimitiveKind::Int8, 1, 1);
493
+ RegisterPrimitiveType(instance, "uchar", PrimitiveKind::UInt8, 1, 1);
494
+ RegisterPrimitiveType(instance, "unsigned char", PrimitiveKind::UInt8, 1, 1);
495
+ RegisterPrimitiveType(instance, "int16", PrimitiveKind::Int16, 2, 2);
496
+ RegisterPrimitiveType(instance, "int16_t", PrimitiveKind::Int16, 2, 2);
497
+ RegisterPrimitiveType(instance, "uint16", PrimitiveKind::UInt16, 2, 2);
498
+ RegisterPrimitiveType(instance, "uint16_t", PrimitiveKind::UInt16, 2, 2);
499
+ RegisterPrimitiveType(instance, "short", PrimitiveKind::Int16, 2, 2);
500
+ RegisterPrimitiveType(instance, "ushort", PrimitiveKind::UInt16, 2, 2);
501
+ RegisterPrimitiveType(instance, "unsigned short", PrimitiveKind::UInt16, 2, 2);
502
+ RegisterPrimitiveType(instance, "int32", PrimitiveKind::Int32, 4, 4);
503
+ RegisterPrimitiveType(instance, "int32_t", PrimitiveKind::Int32, 4, 4);
504
+ RegisterPrimitiveType(instance, "uint32", PrimitiveKind::UInt32, 4, 4);
505
+ RegisterPrimitiveType(instance, "uint32_t", PrimitiveKind::UInt32, 4, 4);
506
+ RegisterPrimitiveType(instance, "int", PrimitiveKind::Int32, 4, 4);
507
+ RegisterPrimitiveType(instance, "uint", PrimitiveKind::UInt32, 4, 4);
508
+ RegisterPrimitiveType(instance, "unsigned int", PrimitiveKind::UInt32, 4, 4);
509
+ RegisterPrimitiveType(instance, "int64", PrimitiveKind::Int64, 8, alignof(int64_t));
510
+ RegisterPrimitiveType(instance, "int64_t", PrimitiveKind::Int64, 8, alignof(int64_t));
511
+ RegisterPrimitiveType(instance, "uint64", PrimitiveKind::UInt64, 8, alignof(int64_t));
512
+ RegisterPrimitiveType(instance, "uint64_t", PrimitiveKind::UInt64, 8, alignof(int64_t));
513
+ RegisterPrimitiveType(instance, "long", PrimitiveKind::Int64, RG_SIZE(long), alignof(long));
514
+ RegisterPrimitiveType(instance, "ulong", PrimitiveKind::UInt64, RG_SIZE(long), alignof(long));
515
+ RegisterPrimitiveType(instance, "unsigned long", PrimitiveKind::UInt64, RG_SIZE(long), alignof(long));
516
+ RegisterPrimitiveType(instance, "longlong", PrimitiveKind::Int64, RG_SIZE(long long), alignof(long long));
517
+ RegisterPrimitiveType(instance, "long long", PrimitiveKind::Int64, RG_SIZE(long long), alignof(long long));
518
+ RegisterPrimitiveType(instance, "ulonglong", PrimitiveKind::UInt64, RG_SIZE(long long), alignof(long long));
519
+ RegisterPrimitiveType(instance, "unsigned long long", PrimitiveKind::UInt64, RG_SIZE(long long), alignof(long long));
520
+ RegisterPrimitiveType(instance, "float32", PrimitiveKind::Float32, 4, alignof(float));
521
+ RegisterPrimitiveType(instance, "float64", PrimitiveKind::Float64, 8, alignof(double));
522
+ RegisterPrimitiveType(instance, "float", PrimitiveKind::Float32, 4, alignof(float));
523
+ RegisterPrimitiveType(instance, "double", PrimitiveKind::Float64, 8, alignof(double));
524
+ RegisterPrimitiveType(instance, "string", PrimitiveKind::String, RG_SIZE(void *), alignof(void *));
525
+ RegisterPrimitiveType(instance, "str", PrimitiveKind::String, RG_SIZE(void *), alignof(void *));
531
526
 
532
527
  Napi::Object types = Napi::Object::New(env);
533
528
  for (TypeInfo &type: instance->types) {
package/src/util.cc CHANGED
@@ -215,8 +215,6 @@ void PopObject(Napi::Object obj, const uint8_t *ptr, const TypeInfo *type)
215
215
 
216
216
  RG_ASSERT(type->primitive == PrimitiveKind::Record);
217
217
 
218
- ptr = AlignUp(ptr, type->align);
219
-
220
218
  for (const RecordMember &member: type->members) {
221
219
  ptr = AlignUp(ptr, member.type->align);
222
220
 
package/test/test.js CHANGED
@@ -353,7 +353,7 @@ async function test() {
353
353
 
354
354
  success = false;
355
355
 
356
- if (name == 'Build')
356
+ if (name in test.build)
357
357
  break;
358
358
  }
359
359
  }
package/test/tests/misc.c CHANGED
@@ -12,7 +12,7 @@
12
12
  // along with this program. If not, see https://www.gnu.org/licenses/.
13
13
 
14
14
  #include <stdio.h>
15
- #include <stdint.h>
15
+ #include <inttypes.h>
16
16
 
17
17
  #ifdef _WIN32
18
18
  #define EXPORT __declspec(dllexport)
@@ -22,11 +22,14 @@
22
22
  #if defined(_M_IX86) || defined(__i386__)
23
23
  #ifdef _MSC_VER
24
24
  #define FASTCALL __fastcall
25
+ #define STDCALL __stdcall
25
26
  #else
26
27
  #define FASTCALL __attribute__((fastcall))
28
+ #define STDCALL __attribute__((stdcall))
27
29
  #endif
28
30
  #else
29
31
  #define FASTCALL
32
+ #define STDCALL
30
33
  #endif
31
34
 
32
35
  typedef struct Pack3 {
@@ -35,6 +38,22 @@ typedef struct Pack3 {
35
38
  int c;
36
39
  } Pack3;
37
40
 
41
+ typedef struct IJK1 { int8_t i; int8_t j; int8_t k; } IJK1;
42
+ typedef struct IJK4 { int32_t i; int32_t j; int32_t k; } IJK4;
43
+ typedef struct IJK8 { int64_t i; int64_t j; int64_t k; } IJK8;
44
+
45
+ typedef struct BFG {
46
+ int8_t a;
47
+ int64_t b;
48
+ signed char c;
49
+ const char *d;
50
+ short e;
51
+ struct {
52
+ float f;
53
+ double g;
54
+ } inner;
55
+ } BFG;
56
+
38
57
  EXPORT void FillPack3(int a, int b, int c, Pack3 *p)
39
58
  {
40
59
  p->a = a;
@@ -78,3 +97,44 @@ EXPORT int64_t ConcatenateToInt8(int64_t a, int64_t b, int64_t c, int64_t d, int
78
97
  100ull * j + 10ull * k + 1ull * l;
79
98
  return ret;
80
99
  }
100
+
101
+ EXPORT const char *ConcatenateToStr1(int8_t a, int8_t b, int8_t c, int8_t d, int8_t e, int8_t f,
102
+ int8_t g, int8_t h, IJK1 ijk, int8_t l)
103
+ {
104
+ static char buf[128];
105
+ snprintf(buf, sizeof(buf), "%d%d%d%d%d%d%d%d%d%d%d%d", a, b, c, d, e, f, g, h, ijk.i, ijk.j, ijk.k, l);
106
+ return buf;
107
+ }
108
+
109
+ EXPORT const char *ConcatenateToStr4(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f,
110
+ int32_t g, int32_t h, IJK4 *ijk, int32_t l)
111
+ {
112
+ static char buf[128];
113
+ snprintf(buf, sizeof(buf), "%d%d%d%d%d%d%d%d%d%d%d%d", a, b, c, d, e, f, g, h, ijk->i, ijk->j, ijk->k, l);
114
+ return buf;
115
+ }
116
+
117
+ EXPORT const char *ConcatenateToStr8(int64_t a, int64_t b, int64_t c, int64_t d, int64_t e, int64_t f,
118
+ int64_t g, int64_t h, IJK8 ijk, int64_t l)
119
+ {
120
+ static char buf[128];
121
+ snprintf(buf, sizeof(buf), "%" PRIi64 "%" PRIi64 "%" PRIi64 "%" PRIi64 "%" PRIi64 "%" PRIi64
122
+ "%" PRIi64 "%" PRIi64 "%" PRIi64 "%" PRIi64 "%" PRIi64 "%" PRIi64,
123
+ a, b, c, d, e, f, g, h, ijk.i, ijk.j, ijk.k, l);
124
+ return buf;
125
+ }
126
+
127
+ EXPORT BFG STDCALL MakeBFG(int x, double y)
128
+ {
129
+ BFG bfg;
130
+
131
+ bfg.a = x;
132
+ bfg.b = x * 2;
133
+ bfg.c = x - 27;
134
+ bfg.d = "Hello";
135
+ bfg.e = x * 27;
136
+ bfg.inner.f = (float)y * x;
137
+ bfg.inner.g = (double)y - x;
138
+
139
+ return bfg;
140
+ }
@@ -23,6 +23,18 @@ const Pack3 = koffi.struct('Pack3', {
23
23
  c: 'int'
24
24
  });
25
25
 
26
+ const BFG = koffi.struct('BFG', {
27
+ a: 'int8_t',
28
+ b: 'int64_t',
29
+ c: 'char',
30
+ d: 'string',
31
+ e: 'short',
32
+ inner: koffi.struct('BFG.inner', {
33
+ f: 'float',
34
+ g: 'double'
35
+ })
36
+ });
37
+
26
38
  main();
27
39
 
28
40
  async function main() {
@@ -44,6 +56,10 @@ async function test() {
44
56
  const ConcatenateToInt1 = lib.cdecl('ConcatenateToInt1', 'int64_t', Array(12).fill('int8_t'));
45
57
  const ConcatenateToInt4 = lib.cdecl('ConcatenateToInt4', 'int64_t', Array(12).fill('int32_t'));
46
58
  const ConcatenateToInt8 = lib.cdecl('ConcatenateToInt8', 'int64_t', Array(12).fill('int64_t'));
59
+ const ConcatenateToStr1 = lib.cdecl('ConcatenateToStr1', 'string', [...Array(8).fill('int8_t'), koffi.struct('IJK1', {i: 'int8_t', j: 'int8_t', k: 'int8_t'}), 'int8_t']);
60
+ const ConcatenateToStr4 = lib.cdecl('ConcatenateToStr4', 'string', [...Array(8).fill('int32_t'), koffi.pointer(koffi.struct('IJK4', {i: 'int32_t', j: 'int32_t', k: 'int32_t'})), 'int32_t']);
61
+ const ConcatenateToStr8 = lib.cdecl('ConcatenateToStr8', 'string', [...Array(8).fill('int64_t'), koffi.struct('IJK8', {i: 'int64_t', j: 'int64_t', k: 'int64_t'}), 'int64_t']);
62
+ const MakeBFG = lib.stdcall('MakeBFG', BFG, ['int', 'double']);
47
63
 
48
64
  let p = {};
49
65
 
@@ -53,7 +69,13 @@ async function test() {
53
69
  AddPack3(6, 9, -12, p);
54
70
  assert.deepEqual(p, { a: 7, b: 11, c: -9 });
55
71
 
56
- assert.equal(ConcatenateToInt1(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687);
57
- assert.equal(ConcatenateToInt4(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687);
58
- assert.equal(ConcatenateToInt8(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687);
72
+ assert.equal(ConcatenateToInt1(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687n);
73
+ assert.equal(ConcatenateToInt4(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687n);
74
+ assert.equal(ConcatenateToInt8(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687n);
75
+ assert.equal(ConcatenateToStr1(5, 6, 1, 2, 3, 9, 4, 4, {i: 0, j: 6, k: 8}, 7), '561239440687');
76
+ assert.equal(ConcatenateToStr4(5, 6, 1, 2, 3, 9, 4, 4, {i: 0, j: 6, k: 8}, 7), '561239440687');
77
+ assert.equal(ConcatenateToStr8(5, 6, 1, 2, 3, 9, 4, 4, {i: 0, j: 6, k: 8}, 7), '561239440687');
78
+
79
+ let bfg = MakeBFG(2, 7);
80
+ assert.deepEqual(bfg, { a: 2, b: 4, c: -25, d: 'Hello', e: 54, inner: { f: 14, g: 5 } });
59
81
  }