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 +1 -1
- package/src/call_arm64.cc +2 -4
- package/src/ffi.cc +44 -49
- package/src/util.cc +0 -2
- package/test/test.js +1 -1
- package/test/tests/misc.c +61 -1
- package/test/tests/misc.js +25 -3
package/package.json
CHANGED
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
|
|
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
|
-
|
|
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,
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
513
|
-
RegisterPrimitiveType(instance, "
|
|
514
|
-
RegisterPrimitiveType(instance, "
|
|
515
|
-
RegisterPrimitiveType(instance, "
|
|
516
|
-
|
|
517
|
-
RegisterPrimitiveType(instance, "
|
|
518
|
-
RegisterPrimitiveType(instance, "
|
|
519
|
-
RegisterPrimitiveType(instance, "
|
|
520
|
-
|
|
521
|
-
RegisterPrimitiveType(instance, "
|
|
522
|
-
RegisterPrimitiveType(instance, "
|
|
523
|
-
RegisterPrimitiveType(instance, "
|
|
524
|
-
RegisterPrimitiveType(instance, "
|
|
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
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 <
|
|
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
|
+
}
|
package/test/tests/misc.js
CHANGED
|
@@ -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),
|
|
57
|
-
assert.equal(ConcatenateToInt4(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7),
|
|
58
|
-
assert.equal(ConcatenateToInt8(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7),
|
|
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
|
}
|