koffi 2.1.4 → 2.2.0
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/{src/koffi/ChangeLog.md → ChangeLog.md} +21 -1
- package/{src/koffi/LICENSE.txt → LICENSE.txt} +0 -0
- package/{src/koffi/README.md → README.md} +0 -0
- package/{src/koffi/doc → doc}/Makefile +1 -1
- package/{src/koffi/doc → doc}/benchmarks.md +0 -0
- package/{src/koffi/doc → doc}/benchmarks.xlsx +0 -0
- package/doc/callbacks.md +175 -0
- package/{src/koffi/doc → doc}/changes.md +2 -3
- package/{src/koffi/doc → doc}/conf.py +29 -6
- package/{src/koffi/doc → doc}/contribute.md +0 -0
- package/{src/koffi/doc → doc}/functions.md +39 -124
- package/{src/koffi/doc → doc}/index.rst +1 -0
- package/{src/koffi/doc → doc}/make.bat +1 -1
- package/{src/koffi/doc → doc}/memory.md +0 -0
- package/{src/koffi/doc → doc}/platforms.md +0 -0
- package/{src/koffi/doc → doc}/poetry.lock +0 -0
- package/{src/koffi/doc → doc}/pyproject.toml +0 -0
- package/{src/koffi/doc → doc}/start.md +0 -0
- package/{src/koffi/doc → doc}/static/bench_linux.png +0 -0
- package/{src/koffi/doc → doc}/static/bench_windows.png +0 -0
- package/{src/koffi/doc → doc}/static/custom.css +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220623.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220623_2.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220627.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220628.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_linux_20220812.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220623.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220623_2.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220627.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220628.png +0 -0
- package/{src/koffi/doc → doc}/static/perf_windows_20220812.png +0 -0
- package/{src/koffi/doc → doc}/templates/badges.html +0 -0
- package/{src/koffi/doc → doc}/types.md +36 -9
- package/package.json +2 -2
- package/src/core/libcc/libcc.cc +89 -27
- package/src/core/libcc/libcc.hh +74 -39
- package/src/koffi/build/2.2.0/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.0/koffi_win32_x64.tar.gz +0 -0
- package/src/koffi/qemu/qemu.js +17 -7
- package/src/koffi/src/abi_arm32.cc +25 -23
- package/src/koffi/src/abi_arm64.cc +24 -22
- package/src/koffi/src/abi_riscv64.cc +20 -18
- package/src/koffi/src/abi_x64_sysv.cc +19 -17
- package/src/koffi/src/abi_x64_win.cc +18 -16
- package/src/koffi/src/abi_x86.cc +22 -20
- package/src/koffi/src/call.cc +220 -607
- package/src/koffi/src/call.hh +7 -11
- package/src/koffi/src/ffi.cc +229 -29
- package/src/koffi/src/ffi.hh +6 -2
- package/src/koffi/src/parser.cc +3 -9
- package/src/koffi/src/util.cc +546 -8
- package/src/koffi/src/util.hh +8 -2
- package/src/koffi/test/CMakeLists.txt +3 -3
- package/src/koffi/test/callbacks.js +70 -0
- package/src/koffi/test/misc.c +67 -0
- package/src/koffi/test/raylib.js +2 -2
- package/src/koffi/test/sqlite.js +1 -1
- package/src/koffi/test/sync.js +28 -6
- package/vendor/brotli/c/common/platform.h +2 -0
- package/vendor/sqlite3mc/sqlite3.c +243532 -0
- package/vendor/sqlite3mc/sqlite3.h +12887 -0
- package/src/koffi/build/2.1.4/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.4/koffi_win32_x64.tar.gz +0 -0
|
@@ -311,7 +311,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
311
311
|
return false; \
|
|
312
312
|
} \
|
|
313
313
|
\
|
|
314
|
-
CType v =
|
|
314
|
+
CType v = GetNumber<CType>(value); \
|
|
315
315
|
*((param.gpr_count ? gpr_ptr : args_ptr)++) = (uint64_t)v; \
|
|
316
316
|
} while (false)
|
|
317
317
|
#define PUSH_INTEGER_SWAP(CType) \
|
|
@@ -321,7 +321,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
321
321
|
return false; \
|
|
322
322
|
} \
|
|
323
323
|
\
|
|
324
|
-
CType v =
|
|
324
|
+
CType v = GetNumber<CType>(value); \
|
|
325
325
|
*((param.gpr_count ? gpr_ptr : args_ptr)++) = (uint64_t)ReverseBytes(v); \
|
|
326
326
|
} while (false)
|
|
327
327
|
|
|
@@ -360,14 +360,14 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
360
360
|
case PrimitiveKind::UInt64S: { PUSH_INTEGER_SWAP(uint64_t); } break;
|
|
361
361
|
case PrimitiveKind::String: {
|
|
362
362
|
const char *str;
|
|
363
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
363
|
+
if (RG_UNLIKELY(!PushString(value, param.directions, &str)))
|
|
364
364
|
return false;
|
|
365
365
|
|
|
366
366
|
*(const char **)((param.gpr_count ? gpr_ptr : args_ptr)++) = str;
|
|
367
367
|
} break;
|
|
368
368
|
case PrimitiveKind::String16: {
|
|
369
369
|
const char16_t *str16;
|
|
370
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
370
|
+
if (RG_UNLIKELY(!PushString16(value, param.directions, &str16)))
|
|
371
371
|
return false;
|
|
372
372
|
|
|
373
373
|
*(const char16_t **)((param.gpr_count ? gpr_ptr : args_ptr)++) = str16;
|
|
@@ -424,7 +424,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
424
424
|
return false;
|
|
425
425
|
}
|
|
426
426
|
|
|
427
|
-
float f =
|
|
427
|
+
float f = GetNumber<float>(value);
|
|
428
428
|
uint64_t *ptr = (param.xmm_count ? xmm_ptr : args_ptr)++;
|
|
429
429
|
|
|
430
430
|
memset((uint8_t *)ptr + 4, 0, 4);
|
|
@@ -436,7 +436,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
436
436
|
return false;
|
|
437
437
|
}
|
|
438
438
|
|
|
439
|
-
double d =
|
|
439
|
+
double d = GetNumber<double>(value);
|
|
440
440
|
*(double *)((param.xmm_count ? xmm_ptr : args_ptr)++) = d;
|
|
441
441
|
} break;
|
|
442
442
|
case PrimitiveKind::Callback: {
|
|
@@ -574,7 +574,7 @@ Napi::Value CallData::Complete()
|
|
|
574
574
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
575
575
|
: (const uint8_t *)&result.buf;
|
|
576
576
|
|
|
577
|
-
Napi::Object obj =
|
|
577
|
+
Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
|
|
578
578
|
return obj;
|
|
579
579
|
} break;
|
|
580
580
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -611,7 +611,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
611
611
|
return;
|
|
612
612
|
}
|
|
613
613
|
|
|
614
|
-
LocalArray<napi_value, MaxParameters> arguments;
|
|
614
|
+
LocalArray<napi_value, MaxParameters + 1> arguments;
|
|
615
|
+
|
|
616
|
+
arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
|
|
615
617
|
|
|
616
618
|
// Convert to JS arguments
|
|
617
619
|
for (Size i = 0; i < proto->parameters.len; i++) {
|
|
@@ -775,12 +777,12 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
775
777
|
}
|
|
776
778
|
}
|
|
777
779
|
|
|
778
|
-
Napi::Object obj =
|
|
780
|
+
Napi::Object obj = DecodeObject(env, (const uint8_t *)buf, param.type);
|
|
779
781
|
arguments.Append(obj);
|
|
780
782
|
} else if (param.use_memory) {
|
|
781
783
|
args_ptr = AlignUp(args_ptr, param.type->align);
|
|
782
784
|
|
|
783
|
-
Napi::Object obj =
|
|
785
|
+
Napi::Object obj = DecodeObject(env, (const uint8_t *)args_ptr, param.type);
|
|
784
786
|
arguments.Append(obj);
|
|
785
787
|
|
|
786
788
|
args_ptr += (param.type->size + 7) / 8;
|
|
@@ -808,7 +810,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
808
810
|
|
|
809
811
|
// Make the call
|
|
810
812
|
napi_value ret = CallSwitchStack(&func, (size_t)arguments.len, arguments.data, old_sp, &mem->stack,
|
|
811
|
-
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argc, argv); });
|
|
813
|
+
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
|
|
812
814
|
Napi::Value value(env, ret);
|
|
813
815
|
|
|
814
816
|
if (RG_UNLIKELY(env.IsExceptionPending()))
|
|
@@ -821,7 +823,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
821
823
|
return; \
|
|
822
824
|
} \
|
|
823
825
|
\
|
|
824
|
-
CType v =
|
|
826
|
+
CType v = GetNumber<CType>(value); \
|
|
825
827
|
out_reg->rax = (uint64_t)v; \
|
|
826
828
|
} while (false)
|
|
827
829
|
#define RETURN_INTEGER_SWAP(CType) \
|
|
@@ -831,7 +833,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
831
833
|
return; \
|
|
832
834
|
} \
|
|
833
835
|
\
|
|
834
|
-
CType v =
|
|
836
|
+
CType v = GetNumber<CType>(value); \
|
|
835
837
|
out_reg->rax = (uint64_t)ReverseBytes(v); \
|
|
836
838
|
} while (false)
|
|
837
839
|
|
|
@@ -863,14 +865,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
863
865
|
case PrimitiveKind::UInt64S: { RETURN_INTEGER_SWAP(uint64_t); } break;
|
|
864
866
|
case PrimitiveKind::String: {
|
|
865
867
|
const char *str;
|
|
866
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
868
|
+
if (RG_UNLIKELY(!PushString(value, 1, &str)))
|
|
867
869
|
return;
|
|
868
870
|
|
|
869
871
|
out_reg->rax = (uint64_t)str;
|
|
870
872
|
} break;
|
|
871
873
|
case PrimitiveKind::String16: {
|
|
872
874
|
const char16_t *str16;
|
|
873
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
875
|
+
if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
|
|
874
876
|
return;
|
|
875
877
|
|
|
876
878
|
out_reg->rax = (uint64_t)str16;
|
|
@@ -937,7 +939,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
937
939
|
return;
|
|
938
940
|
}
|
|
939
941
|
|
|
940
|
-
float f =
|
|
942
|
+
float f = GetNumber<float>(value);
|
|
941
943
|
|
|
942
944
|
memset((uint8_t *)&out_reg->xmm0 + 4, 0, 4);
|
|
943
945
|
memcpy(&out_reg->xmm0, &f, 4);
|
|
@@ -948,7 +950,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
948
950
|
return;
|
|
949
951
|
}
|
|
950
952
|
|
|
951
|
-
double d =
|
|
953
|
+
double d = GetNumber<double>(value);
|
|
952
954
|
out_reg->xmm0 = d;
|
|
953
955
|
} break;
|
|
954
956
|
case PrimitiveKind::Callback: {
|
|
@@ -142,7 +142,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
142
142
|
return false; \
|
|
143
143
|
} \
|
|
144
144
|
\
|
|
145
|
-
CType v =
|
|
145
|
+
CType v = GetNumber<CType>(value); \
|
|
146
146
|
*(args_ptr++) = (uint64_t)v; \
|
|
147
147
|
} while (false)
|
|
148
148
|
#define PUSH_INTEGER_SWAP(CType) \
|
|
@@ -152,7 +152,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
152
152
|
return false; \
|
|
153
153
|
} \
|
|
154
154
|
\
|
|
155
|
-
CType v =
|
|
155
|
+
CType v = GetNumber<CType>(value); \
|
|
156
156
|
*(args_ptr++) = (uint64_t)ReverseBytes(v); \
|
|
157
157
|
} while (false)
|
|
158
158
|
|
|
@@ -192,14 +192,14 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
192
192
|
case PrimitiveKind::UInt64S: { PUSH_INTEGER_SWAP(uint64_t); } break;
|
|
193
193
|
case PrimitiveKind::String: {
|
|
194
194
|
const char *str;
|
|
195
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
195
|
+
if (RG_UNLIKELY(!PushString(value, param.directions, &str)))
|
|
196
196
|
return false;
|
|
197
197
|
|
|
198
198
|
*(const char **)(args_ptr++) = str;
|
|
199
199
|
} break;
|
|
200
200
|
case PrimitiveKind::String16: {
|
|
201
201
|
const char16_t *str16;
|
|
202
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
202
|
+
if (RG_UNLIKELY(!PushString16(value, param.directions, &str16)))
|
|
203
203
|
return false;
|
|
204
204
|
|
|
205
205
|
*(const char16_t **)(args_ptr++) = str16;
|
|
@@ -236,7 +236,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
236
236
|
return false;
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
-
float f =
|
|
239
|
+
float f = GetNumber<float>(value);
|
|
240
240
|
|
|
241
241
|
memset((uint8_t *)args_ptr + 4, 0, 4);
|
|
242
242
|
*(float *)(args_ptr++) = f;
|
|
@@ -247,7 +247,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
247
247
|
return false;
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
-
double d =
|
|
250
|
+
double d = GetNumber<double>(value);
|
|
251
251
|
*(double *)(args_ptr++) = d;
|
|
252
252
|
} break;
|
|
253
253
|
case PrimitiveKind::Callback: {
|
|
@@ -370,7 +370,7 @@ Napi::Value CallData::Complete()
|
|
|
370
370
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
371
371
|
: (const uint8_t *)&result.buf;
|
|
372
372
|
|
|
373
|
-
Napi::Object obj =
|
|
373
|
+
Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
|
|
374
374
|
return obj;
|
|
375
375
|
} break;
|
|
376
376
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -406,7 +406,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
406
406
|
return;
|
|
407
407
|
}
|
|
408
408
|
|
|
409
|
-
LocalArray<napi_value, MaxParameters> arguments;
|
|
409
|
+
LocalArray<napi_value, MaxParameters + 1> arguments;
|
|
410
|
+
|
|
411
|
+
arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
|
|
410
412
|
|
|
411
413
|
// Convert to JS arguments
|
|
412
414
|
for (Size i = 0, j = !!return_ptr; i < proto->parameters.len; i++, j++) {
|
|
@@ -574,7 +576,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
574
576
|
}
|
|
575
577
|
args_ptr += (j >= 4);
|
|
576
578
|
|
|
577
|
-
Napi::Object obj2 =
|
|
579
|
+
Napi::Object obj2 = DecodeObject(env, ptr, param.type);
|
|
578
580
|
arguments.Append(obj2);
|
|
579
581
|
} break;
|
|
580
582
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -601,7 +603,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
601
603
|
|
|
602
604
|
// Make the call
|
|
603
605
|
napi_value ret = CallSwitchStack(&func, (size_t)arguments.len, arguments.data, old_sp, &mem->stack,
|
|
604
|
-
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argc, argv); });
|
|
606
|
+
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
|
|
605
607
|
Napi::Value value(env, ret);
|
|
606
608
|
|
|
607
609
|
if (RG_UNLIKELY(env.IsExceptionPending()))
|
|
@@ -614,7 +616,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
614
616
|
return; \
|
|
615
617
|
} \
|
|
616
618
|
\
|
|
617
|
-
CType v =
|
|
619
|
+
CType v = GetNumber<CType>(value); \
|
|
618
620
|
out_reg->rax = (uint64_t)v; \
|
|
619
621
|
} while (false)
|
|
620
622
|
#define RETURN_INTEGER_SWAP(CType) \
|
|
@@ -624,7 +626,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
624
626
|
return; \
|
|
625
627
|
} \
|
|
626
628
|
\
|
|
627
|
-
CType v =
|
|
629
|
+
CType v = GetNumber<CType>(value); \
|
|
628
630
|
out_reg->rax = (uint64_t)ReverseBytes(v); \
|
|
629
631
|
} while (false)
|
|
630
632
|
|
|
@@ -655,14 +657,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
655
657
|
case PrimitiveKind::UInt64S: { RETURN_INTEGER_SWAP(uint64_t); } break;
|
|
656
658
|
case PrimitiveKind::String: {
|
|
657
659
|
const char *str;
|
|
658
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
660
|
+
if (RG_UNLIKELY(!PushString(value, 1, &str)))
|
|
659
661
|
return;
|
|
660
662
|
|
|
661
663
|
out_reg->rax = (uint64_t)str;
|
|
662
664
|
} break;
|
|
663
665
|
case PrimitiveKind::String16: {
|
|
664
666
|
const char16_t *str16;
|
|
665
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
667
|
+
if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
|
|
666
668
|
return;
|
|
667
669
|
|
|
668
670
|
out_reg->rax = (uint64_t)str16;
|
|
@@ -711,7 +713,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
711
713
|
return;
|
|
712
714
|
}
|
|
713
715
|
|
|
714
|
-
float f =
|
|
716
|
+
float f = GetNumber<float>(value);
|
|
715
717
|
|
|
716
718
|
memset((uint8_t *)&out_reg->xmm0 + 4, 0, 4);
|
|
717
719
|
memcpy(&out_reg->xmm0, &f, 4);
|
|
@@ -722,7 +724,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
722
724
|
return;
|
|
723
725
|
}
|
|
724
726
|
|
|
725
|
-
double d =
|
|
727
|
+
double d = GetNumber<double>(value);
|
|
726
728
|
out_reg->xmm0 = d;
|
|
727
729
|
} break;
|
|
728
730
|
case PrimitiveKind::Callback: {
|
package/src/koffi/src/abi_x86.cc
CHANGED
|
@@ -198,7 +198,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
198
198
|
return false; \
|
|
199
199
|
} \
|
|
200
200
|
\
|
|
201
|
-
CType v =
|
|
201
|
+
CType v = GetNumber<CType>(value); \
|
|
202
202
|
*((param.fast ? fast_ptr : args_ptr)++) = (uint32_t)v; \
|
|
203
203
|
} while (false)
|
|
204
204
|
#define PUSH_INTEGER_32_SWAP(CType) \
|
|
@@ -208,7 +208,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
208
208
|
return false; \
|
|
209
209
|
} \
|
|
210
210
|
\
|
|
211
|
-
CType v =
|
|
211
|
+
CType v = GetNumber<CType>(value); \
|
|
212
212
|
*((param.fast ? fast_ptr : args_ptr)++) = (uint32_t)ReverseBytes(v); \
|
|
213
213
|
} while (false)
|
|
214
214
|
#define PUSH_INTEGER_64(CType) \
|
|
@@ -218,7 +218,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
218
218
|
return false; \
|
|
219
219
|
} \
|
|
220
220
|
\
|
|
221
|
-
CType v =
|
|
221
|
+
CType v = GetNumber<CType>(value); \
|
|
222
222
|
\
|
|
223
223
|
*(uint64_t *)args_ptr = (uint64_t)v; \
|
|
224
224
|
args_ptr += 2; \
|
|
@@ -230,7 +230,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
230
230
|
return false; \
|
|
231
231
|
} \
|
|
232
232
|
\
|
|
233
|
-
CType v =
|
|
233
|
+
CType v = GetNumber<CType>(value); \
|
|
234
234
|
\
|
|
235
235
|
*(uint64_t *)args_ptr = (uint64_t)ReverseBytes(v); \
|
|
236
236
|
args_ptr += 2; \
|
|
@@ -271,14 +271,14 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
271
271
|
case PrimitiveKind::UInt64S: { PUSH_INTEGER_64_SWAP(uint64_t); } break;
|
|
272
272
|
case PrimitiveKind::String: {
|
|
273
273
|
const char *str;
|
|
274
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
274
|
+
if (RG_UNLIKELY(!PushString(value, param.directions, &str)))
|
|
275
275
|
return false;
|
|
276
276
|
|
|
277
277
|
*(const char **)((param.fast ? fast_ptr : args_ptr)++) = str;
|
|
278
278
|
} break;
|
|
279
279
|
case PrimitiveKind::String16: {
|
|
280
280
|
const char16_t *str16;
|
|
281
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
281
|
+
if (RG_UNLIKELY(!PushString16(value, param.directions, &str16)))
|
|
282
282
|
return false;
|
|
283
283
|
|
|
284
284
|
*(const char16_t **)((param.fast ? fast_ptr : args_ptr)++) = str16;
|
|
@@ -316,7 +316,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
316
316
|
return false;
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
float f =
|
|
319
|
+
float f = GetNumber<float>(value);
|
|
320
320
|
*(float *)((param.fast ? fast_ptr : args_ptr)++) = f;
|
|
321
321
|
} break;
|
|
322
322
|
case PrimitiveKind::Float64: {
|
|
@@ -325,7 +325,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
325
325
|
return false;
|
|
326
326
|
}
|
|
327
327
|
|
|
328
|
-
double d =
|
|
328
|
+
double d = GetNumber<double>(value);
|
|
329
329
|
*(double *)args_ptr = d;
|
|
330
330
|
args_ptr += 2;
|
|
331
331
|
} break;
|
|
@@ -452,7 +452,7 @@ Napi::Value CallData::Complete()
|
|
|
452
452
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
453
453
|
: (const uint8_t *)&result.buf;
|
|
454
454
|
|
|
455
|
-
Napi::Object obj =
|
|
455
|
+
Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
|
|
456
456
|
return obj;
|
|
457
457
|
} break;
|
|
458
458
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -502,7 +502,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
502
502
|
return;
|
|
503
503
|
}
|
|
504
504
|
|
|
505
|
-
LocalArray<napi_value, MaxParameters> arguments;
|
|
505
|
+
LocalArray<napi_value, MaxParameters + 1> arguments;
|
|
506
|
+
|
|
507
|
+
arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
|
|
506
508
|
|
|
507
509
|
// Convert to JS arguments
|
|
508
510
|
for (Size i = 0; i < proto->parameters.len; i++) {
|
|
@@ -652,7 +654,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
652
654
|
|
|
653
655
|
uint8_t *ptr = (uint8_t *)args_ptr;
|
|
654
656
|
|
|
655
|
-
Napi::Object obj2 =
|
|
657
|
+
Napi::Object obj2 = DecodeObject(env, ptr, param.type);
|
|
656
658
|
arguments.Append(obj2);
|
|
657
659
|
|
|
658
660
|
args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
|
|
@@ -680,7 +682,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
680
682
|
|
|
681
683
|
// Make the call
|
|
682
684
|
napi_value ret = CallSwitchStack(&func, (size_t)arguments.len, arguments.data, old_sp, &mem->stack,
|
|
683
|
-
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argc, argv); });
|
|
685
|
+
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
|
|
684
686
|
Napi::Value value(env, ret);
|
|
685
687
|
|
|
686
688
|
if (RG_UNLIKELY(env.IsExceptionPending()))
|
|
@@ -693,7 +695,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
693
695
|
return; \
|
|
694
696
|
} \
|
|
695
697
|
\
|
|
696
|
-
CType v =
|
|
698
|
+
CType v = GetNumber<CType>(value); \
|
|
697
699
|
out_reg->eax = (uint32_t)v; \
|
|
698
700
|
} while (false)
|
|
699
701
|
#define RETURN_INTEGER_32_SWAP(CType) \
|
|
@@ -703,7 +705,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
703
705
|
return; \
|
|
704
706
|
} \
|
|
705
707
|
\
|
|
706
|
-
CType v =
|
|
708
|
+
CType v = GetNumber<CType>(value); \
|
|
707
709
|
out_reg->eax = (uint32_t)ReverseBytes(v); \
|
|
708
710
|
} while (false)
|
|
709
711
|
#define RETURN_INTEGER_64(CType) \
|
|
@@ -713,7 +715,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
713
715
|
return; \
|
|
714
716
|
} \
|
|
715
717
|
\
|
|
716
|
-
CType v =
|
|
718
|
+
CType v = GetNumber<CType>(value); \
|
|
717
719
|
\
|
|
718
720
|
out_reg->eax = (uint32_t)((uint64_t)v >> 32); \
|
|
719
721
|
out_reg->edx = (uint32_t)((uint64_t)v & 0xFFFFFFFFu); \
|
|
@@ -725,7 +727,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
725
727
|
return; \
|
|
726
728
|
} \
|
|
727
729
|
\
|
|
728
|
-
CType v = ReverseBytes(
|
|
730
|
+
CType v = ReverseBytes(GetNumber<CType>(value)); \
|
|
729
731
|
\
|
|
730
732
|
out_reg->eax = (uint32_t)((uint64_t)v >> 32); \
|
|
731
733
|
out_reg->edx = (uint32_t)((uint64_t)v & 0xFFFFFFFFu); \
|
|
@@ -758,14 +760,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
758
760
|
case PrimitiveKind::UInt64S: { RETURN_INTEGER_64_SWAP(uint64_t); } break;
|
|
759
761
|
case PrimitiveKind::String: {
|
|
760
762
|
const char *str;
|
|
761
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
763
|
+
if (RG_UNLIKELY(!PushString(value, 1, &str)))
|
|
762
764
|
return;
|
|
763
765
|
|
|
764
766
|
out_reg->eax = (uint32_t)str;
|
|
765
767
|
} break;
|
|
766
768
|
case PrimitiveKind::String16: {
|
|
767
769
|
const char16_t *str16;
|
|
768
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
770
|
+
if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
|
|
769
771
|
return;
|
|
770
772
|
|
|
771
773
|
out_reg->eax = (uint32_t)str16;
|
|
@@ -814,7 +816,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
814
816
|
return;
|
|
815
817
|
}
|
|
816
818
|
|
|
817
|
-
out_reg->x87.f =
|
|
819
|
+
out_reg->x87.f = GetNumber<float>(value);
|
|
818
820
|
out_reg->x87_double = false;
|
|
819
821
|
} break;
|
|
820
822
|
case PrimitiveKind::Float64: {
|
|
@@ -823,7 +825,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
823
825
|
return;
|
|
824
826
|
}
|
|
825
827
|
|
|
826
|
-
out_reg->x87.d =
|
|
828
|
+
out_reg->x87.d = GetNumber<double>(value);
|
|
827
829
|
out_reg->x87_double = true;
|
|
828
830
|
} break;
|
|
829
831
|
case PrimitiveKind::Callback: {
|