koffi 1.0.2 → 1.0.5
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/README.md +24 -21
- package/build/qemu/1.0.5/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.0.5/koffi_win32_x64.tar.gz +0 -0
- package/package.json +1 -1
- package/src/abi_arm32.cc +119 -211
- package/src/abi_arm64.cc +92 -113
- package/src/abi_x64_sysv.cc +106 -131
- package/src/abi_x64_win.cc +78 -94
- package/src/abi_x86.cc +80 -95
- package/src/call.cc +144 -19
- package/src/call.hh +39 -3
- package/src/ffi.cc +11 -2
- package/src/ffi.hh +6 -12
- package/src/util.cc +0 -127
- package/src/util.hh +0 -16
- package/test/misc.c +66 -0
- package/test/misc.js +47 -0
- package/vendor/libcc/libcc.hh +1 -1
- package/build/qemu/1.0.2/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.0.2/koffi_win32_x64.tar.gz +0 -0
package/src/util.cc
CHANGED
|
@@ -126,131 +126,4 @@ bool CheckValueTag(const InstanceData *instance, Napi::Value value, const void *
|
|
|
126
126
|
return match;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
void PopObject(Napi::Object obj, const uint8_t *ptr, const TypeInfo *type)
|
|
130
|
-
{
|
|
131
|
-
Napi::Env env = obj.Env();
|
|
132
|
-
InstanceData *instance = env.GetInstanceData<InstanceData>();
|
|
133
|
-
|
|
134
|
-
RG_ASSERT(type->primitive == PrimitiveKind::Record);
|
|
135
|
-
|
|
136
|
-
for (const RecordMember &member: type->members) {
|
|
137
|
-
ptr = AlignUp(ptr, member.align);
|
|
138
|
-
|
|
139
|
-
switch (member.type->primitive) {
|
|
140
|
-
case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
|
|
141
|
-
|
|
142
|
-
case PrimitiveKind::Bool: {
|
|
143
|
-
bool b = *(bool *)ptr;
|
|
144
|
-
obj.Set(member.name, Napi::Boolean::New(env, b));
|
|
145
|
-
} break;
|
|
146
|
-
case PrimitiveKind::Int8: {
|
|
147
|
-
double d = (double)*(int8_t *)ptr;
|
|
148
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
149
|
-
} break;
|
|
150
|
-
case PrimitiveKind::UInt8: {
|
|
151
|
-
double d = (double)*(uint8_t *)ptr;
|
|
152
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
153
|
-
} break;
|
|
154
|
-
case PrimitiveKind::Int16: {
|
|
155
|
-
double d = (double)*(int16_t *)ptr;
|
|
156
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
157
|
-
} break;
|
|
158
|
-
case PrimitiveKind::UInt16: {
|
|
159
|
-
double d = (double)*(uint16_t *)ptr;
|
|
160
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
161
|
-
} break;
|
|
162
|
-
case PrimitiveKind::Int32: {
|
|
163
|
-
double d = (double)*(int32_t *)ptr;
|
|
164
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
165
|
-
} break;
|
|
166
|
-
case PrimitiveKind::UInt32: {
|
|
167
|
-
double d = (double)*(uint32_t *)ptr;
|
|
168
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
169
|
-
} break;
|
|
170
|
-
case PrimitiveKind::Int64: {
|
|
171
|
-
int64_t v = *(int64_t *)ptr;
|
|
172
|
-
obj.Set(member.name, Napi::BigInt::New(env, v));
|
|
173
|
-
} break;
|
|
174
|
-
case PrimitiveKind::UInt64: {
|
|
175
|
-
uint64_t v = *(uint64_t *)ptr;
|
|
176
|
-
obj.Set(member.name, Napi::BigInt::New(env, v));
|
|
177
|
-
} break;
|
|
178
|
-
case PrimitiveKind::Float32: {
|
|
179
|
-
float f;
|
|
180
|
-
memcpy(&f, ptr, 4);
|
|
181
|
-
obj.Set(member.name, Napi::Number::New(env, (double)f));
|
|
182
|
-
} break;
|
|
183
|
-
case PrimitiveKind::Float64: {
|
|
184
|
-
double d;
|
|
185
|
-
memcpy(&d, ptr, 8);
|
|
186
|
-
obj.Set(member.name, Napi::Number::New(env, d));
|
|
187
|
-
} break;
|
|
188
|
-
case PrimitiveKind::String: {
|
|
189
|
-
const char *str = *(const char **)ptr;
|
|
190
|
-
obj.Set(member.name, Napi::String::New(env, str));
|
|
191
|
-
} break;
|
|
192
|
-
case PrimitiveKind::String16: {
|
|
193
|
-
const char16_t *str16 = *(const char16_t **)ptr;
|
|
194
|
-
obj.Set(member.name, Napi::String::New(env, str16));
|
|
195
|
-
} break;
|
|
196
|
-
case PrimitiveKind::Pointer: {
|
|
197
|
-
void *ptr2 = *(void **)ptr;
|
|
198
|
-
|
|
199
|
-
Napi::External<void> external = Napi::External<void>::New(env, ptr2);
|
|
200
|
-
SetValueTag(instance, external, member.type);
|
|
201
|
-
|
|
202
|
-
obj.Set(member.name, external);
|
|
203
|
-
} break;
|
|
204
|
-
|
|
205
|
-
case PrimitiveKind::Record: {
|
|
206
|
-
Napi::Object obj2 = PopObject(env, ptr, member.type);
|
|
207
|
-
obj.Set(member.name, obj2);
|
|
208
|
-
} break;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
ptr += member.type->size;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
void PopOutArguments(Span<const OutObject> objects)
|
|
216
|
-
{
|
|
217
|
-
for (const OutObject &obj: objects) {
|
|
218
|
-
PopObject(obj.obj, obj.ptr, obj.type);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
static void DumpMemory(const char *type, Span<const uint8_t> bytes)
|
|
223
|
-
{
|
|
224
|
-
if (bytes.len) {
|
|
225
|
-
PrintLn(stderr, "%1 at 0x%2 (%3):", type, bytes.ptr, FmtMemSize(bytes.len));
|
|
226
|
-
|
|
227
|
-
for (const uint8_t *ptr = bytes.begin(); ptr < bytes.end();) {
|
|
228
|
-
Print(stderr, " [0x%1 %2 %3] ", FmtArg(ptr).Pad0(-16),
|
|
229
|
-
FmtArg((ptr - bytes.begin()) / sizeof(void *)).Pad(-4),
|
|
230
|
-
FmtArg(ptr - bytes.begin()).Pad(-4));
|
|
231
|
-
for (int i = 0; ptr < bytes.end() && i < (int)sizeof(void *); i++, ptr++) {
|
|
232
|
-
Print(stderr, " %1", FmtHex(*ptr).Pad0(-2));
|
|
233
|
-
}
|
|
234
|
-
PrintLn(stderr);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
void CallData::DumpDebug() const
|
|
240
|
-
{
|
|
241
|
-
PrintLn(stderr, "%!..+---- %1 (%2) ----%!0", func->name, CallConventionNames[(int)func->convention]);
|
|
242
|
-
|
|
243
|
-
if (func->parameters.len) {
|
|
244
|
-
PrintLn(stderr, "Parameters:");
|
|
245
|
-
for (Size i = 0; i < func->parameters.len; i++) {
|
|
246
|
-
const ParameterInfo ¶m = func->parameters[i];
|
|
247
|
-
PrintLn(stderr, " %1 = %2 (%3)", i, param.type->name, FmtMemSize(param.type->size));
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
PrintLn(stderr, "Return: %1 (%2)", func->ret.type->name, FmtMemSize(func->ret.type->size));
|
|
251
|
-
|
|
252
|
-
DumpMemory("Stack", GetStack());
|
|
253
|
-
DumpMemory("Heap", GetHeap());
|
|
254
|
-
}
|
|
255
|
-
|
|
256
129
|
}
|
package/src/util.hh
CHANGED
|
@@ -89,20 +89,4 @@ T CopyNumber(const Napi::Value &value)
|
|
|
89
89
|
RG_UNREACHABLE();
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
void PopObject(Napi::Object obj, const uint8_t *ptr, const TypeInfo *type);
|
|
93
|
-
static inline Napi::Object PopObject(Napi::Env env, const uint8_t *ptr, const TypeInfo *type)
|
|
94
|
-
{
|
|
95
|
-
Napi::Object obj = Napi::Object::New(env);
|
|
96
|
-
PopObject(obj, ptr, type);
|
|
97
|
-
return obj;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
struct OutObject {
|
|
101
|
-
Napi::Object obj;
|
|
102
|
-
const uint8_t *ptr;
|
|
103
|
-
const TypeInfo *type;
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
void PopOutArguments(Span<const OutObject> objects);
|
|
107
|
-
|
|
108
92
|
}
|
package/test/misc.c
CHANGED
|
@@ -54,6 +54,26 @@ typedef struct Pack3 {
|
|
|
54
54
|
int c;
|
|
55
55
|
} Pack3;
|
|
56
56
|
|
|
57
|
+
typedef struct Float2 {
|
|
58
|
+
float a;
|
|
59
|
+
float b;
|
|
60
|
+
} Float2;
|
|
61
|
+
typedef struct Float3 {
|
|
62
|
+
float a;
|
|
63
|
+
float b;
|
|
64
|
+
float c;
|
|
65
|
+
} Float3;
|
|
66
|
+
|
|
67
|
+
typedef struct Double2 {
|
|
68
|
+
double a;
|
|
69
|
+
double b;
|
|
70
|
+
} Double2;
|
|
71
|
+
typedef struct Double3 {
|
|
72
|
+
double a;
|
|
73
|
+
double b;
|
|
74
|
+
double c;
|
|
75
|
+
} Double3;
|
|
76
|
+
|
|
57
77
|
typedef struct IJK1 { int8_t i; int8_t j; int8_t k; } IJK1;
|
|
58
78
|
typedef struct IJK4 { int32_t i; int32_t j; int32_t k; } IJK4;
|
|
59
79
|
typedef struct IJK8 { int64_t i; int64_t j; int64_t k; } IJK8;
|
|
@@ -149,6 +169,52 @@ EXPORT void FASTCALL AddPack3(int a, int b, int c, Pack3 *p)
|
|
|
149
169
|
p->c += c;
|
|
150
170
|
}
|
|
151
171
|
|
|
172
|
+
EXPORT Float2 PackFloat2(float a, float b, Float2 *out)
|
|
173
|
+
{
|
|
174
|
+
Float2 ret;
|
|
175
|
+
|
|
176
|
+
ret.a = a;
|
|
177
|
+
ret.b = b;
|
|
178
|
+
*out = ret;
|
|
179
|
+
|
|
180
|
+
return ret;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
EXPORT Float3 PackFloat3(float a, float b, float c, Float3 *out)
|
|
184
|
+
{
|
|
185
|
+
Float3 ret;
|
|
186
|
+
|
|
187
|
+
ret.a = a;
|
|
188
|
+
ret.b = b;
|
|
189
|
+
ret.c = c;
|
|
190
|
+
*out = ret;
|
|
191
|
+
|
|
192
|
+
return ret;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
EXPORT Double2 PackDouble2(double a, double b, Double2 *out)
|
|
196
|
+
{
|
|
197
|
+
Double2 ret;
|
|
198
|
+
|
|
199
|
+
ret.a = a;
|
|
200
|
+
ret.b = b;
|
|
201
|
+
*out = ret;
|
|
202
|
+
|
|
203
|
+
return ret;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
EXPORT Double3 PackDouble3(double a, double b, double c, Double3 *out)
|
|
207
|
+
{
|
|
208
|
+
Double3 ret;
|
|
209
|
+
|
|
210
|
+
ret.a = a;
|
|
211
|
+
ret.b = b;
|
|
212
|
+
ret.c = c;
|
|
213
|
+
*out = ret;
|
|
214
|
+
|
|
215
|
+
return ret;
|
|
216
|
+
}
|
|
217
|
+
|
|
152
218
|
EXPORT int64_t ConcatenateToInt1(int8_t a, int8_t b, int8_t c, int8_t d, int8_t e, int8_t f,
|
|
153
219
|
int8_t g, int8_t h, int8_t i, int8_t j, int8_t k, int8_t l)
|
|
154
220
|
{
|
package/test/misc.js
CHANGED
|
@@ -30,6 +30,26 @@ const Pack3 = koffi.struct('Pack3', {
|
|
|
30
30
|
c: 'int'
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
+
const Float2 = koffi.struct('Float2', {
|
|
34
|
+
a: 'float',
|
|
35
|
+
b: 'float'
|
|
36
|
+
});
|
|
37
|
+
const Float3 = koffi.struct('Float3', {
|
|
38
|
+
a: 'float',
|
|
39
|
+
b: 'float',
|
|
40
|
+
c: 'float'
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const Double2 = koffi.struct('Double2', {
|
|
44
|
+
a: 'double',
|
|
45
|
+
b: 'double'
|
|
46
|
+
});
|
|
47
|
+
const Double3 = koffi.struct('Double3', {
|
|
48
|
+
a: 'double',
|
|
49
|
+
b: 'double',
|
|
50
|
+
c: 'double'
|
|
51
|
+
});
|
|
52
|
+
|
|
33
53
|
const BFG = koffi.struct('BFG', {
|
|
34
54
|
a: 'int8_t',
|
|
35
55
|
b: 'int64_t',
|
|
@@ -78,6 +98,10 @@ async function test() {
|
|
|
78
98
|
const FillPack3 = lib.func('FillPack3', 'void', ['int', 'int', 'int', koffi.out(koffi.pointer(Pack3))]);
|
|
79
99
|
const RetPack3 = lib.func('RetPack3', Pack3, ['int', 'int', 'int']);
|
|
80
100
|
const AddPack3 = lib.fastcall('AddPack3', 'void', ['int', 'int', 'int', koffi.inout(koffi.pointer(Pack3))]);
|
|
101
|
+
const PackFloat2 = lib.func('Float2 PackFloat2(float a, float b, _Out_ Float2 *out)');
|
|
102
|
+
const PackFloat3 = lib.func('Float3 PackFloat3(float a, float b, float c, _Out_ Float3 *out)');
|
|
103
|
+
const PackDouble2 = lib.func('Double2 PackDouble2(double a, double b, _Out_ Double2 *out)');
|
|
104
|
+
const PackDouble3 = lib.func('Double3 PackDouble3(double a, double b, double c, _Out_ Double3 *out)');
|
|
81
105
|
const ConcatenateToInt1 = lib.func('ConcatenateToInt1', 'int64_t', Array(12).fill('int8_t'));
|
|
82
106
|
const ConcatenateToInt4 = lib.func('ConcatenateToInt4', 'int64_t', Array(12).fill('int32_t'));
|
|
83
107
|
const ConcatenateToInt8 = lib.func('ConcatenateToInt8', 'int64_t', Array(12).fill('int64_t'));
|
|
@@ -134,6 +158,29 @@ async function test() {
|
|
|
134
158
|
assert.deepEqual(p, { a: 7, b: 11, c: -9 });
|
|
135
159
|
}
|
|
136
160
|
|
|
161
|
+
// HFA tests
|
|
162
|
+
{
|
|
163
|
+
let f2p = {};
|
|
164
|
+
let f2 = PackFloat2(1.5, 3.0, f2p);
|
|
165
|
+
assert.deepEqual(f2, { a: 1.5, b: 3.0 });
|
|
166
|
+
assert.deepEqual(f2, f2p);
|
|
167
|
+
|
|
168
|
+
let f3p = {};
|
|
169
|
+
let f3 = PackFloat3(20.0, 30.0, 40.0, f3p);
|
|
170
|
+
assert.deepEqual(f3, { a: 20.0, b: 30.0, c: 40.0 });
|
|
171
|
+
assert.deepEqual(f3, f3p);
|
|
172
|
+
|
|
173
|
+
let d2p = {};
|
|
174
|
+
let d2 = PackDouble2(1.0, 2.0, d2p);
|
|
175
|
+
assert.deepEqual(d2, { a: 1.0, b: 2.0 });
|
|
176
|
+
assert.deepEqual(d2, d2p);
|
|
177
|
+
|
|
178
|
+
let d3p = {};
|
|
179
|
+
let d3 = PackDouble3(0.5, 10.0, 5.0, d3p);
|
|
180
|
+
assert.deepEqual(d3, { a: 0.5, b: 10.0, c: 5.0 });
|
|
181
|
+
assert.deepEqual(d3, d3p);
|
|
182
|
+
}
|
|
183
|
+
|
|
137
184
|
// Many parameters
|
|
138
185
|
{
|
|
139
186
|
assert.equal(ConcatenateToInt1(5, 6, 1, 2, 3, 9, 4, 4, 0, 6, 8, 7), 561239440687n);
|
package/vendor/libcc/libcc.hh
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|