koffi 2.1.5 → 2.2.1
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/ChangeLog.md +21 -1
- package/doc/Makefile +1 -1
- package/doc/callbacks.md +175 -0
- package/doc/changes.md +2 -3
- package/doc/conf.py +29 -6
- package/doc/functions.md +39 -124
- package/doc/index.rst +1 -0
- package/doc/make.bat +1 -1
- package/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.1/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.2.1/koffi_win32_x64.tar.gz +0 -0
- package/src/koffi/qemu/qemu.js +3 -1
- package/src/koffi/src/abi_arm32.cc +26 -23
- package/src/koffi/src/abi_arm64.cc +25 -22
- package/src/koffi/src/abi_riscv64.cc +21 -18
- package/src/koffi/src/abi_x64_sysv.cc +20 -17
- package/src/koffi/src/abi_x64_win.cc +19 -16
- package/src/koffi/src/abi_x86.cc +23 -20
- package/src/koffi/src/call.cc +222 -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 +89 -0
- package/src/koffi/test/misc.c +78 -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.5/koffi_darwin_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_darwin_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_freebsd_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_freebsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_freebsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_linux_arm32hf.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_linux_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_linux_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_linux_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_openbsd_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_openbsd_x64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_win32_arm64.tar.gz +0 -0
- package/src/koffi/build/2.1.5/koffi_win32_ia32.tar.gz +0 -0
- package/src/koffi/build/2.1.5/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: {
|
|
@@ -474,6 +474,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
474
474
|
|
|
475
475
|
void CallData::Execute()
|
|
476
476
|
{
|
|
477
|
+
RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
|
|
477
478
|
exec_call = this;
|
|
478
479
|
|
|
479
480
|
#define PERFORM_CALL(Suffix) \
|
|
@@ -574,7 +575,7 @@ Napi::Value CallData::Complete()
|
|
|
574
575
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
575
576
|
: (const uint8_t *)&result.buf;
|
|
576
577
|
|
|
577
|
-
Napi::Object obj =
|
|
578
|
+
Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
|
|
578
579
|
return obj;
|
|
579
580
|
} break;
|
|
580
581
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -611,7 +612,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
611
612
|
return;
|
|
612
613
|
}
|
|
613
614
|
|
|
614
|
-
LocalArray<napi_value, MaxParameters> arguments;
|
|
615
|
+
LocalArray<napi_value, MaxParameters + 1> arguments;
|
|
616
|
+
|
|
617
|
+
arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
|
|
615
618
|
|
|
616
619
|
// Convert to JS arguments
|
|
617
620
|
for (Size i = 0; i < proto->parameters.len; i++) {
|
|
@@ -775,12 +778,12 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
775
778
|
}
|
|
776
779
|
}
|
|
777
780
|
|
|
778
|
-
Napi::Object obj =
|
|
781
|
+
Napi::Object obj = DecodeObject(env, (const uint8_t *)buf, param.type);
|
|
779
782
|
arguments.Append(obj);
|
|
780
783
|
} else if (param.use_memory) {
|
|
781
784
|
args_ptr = AlignUp(args_ptr, param.type->align);
|
|
782
785
|
|
|
783
|
-
Napi::Object obj =
|
|
786
|
+
Napi::Object obj = DecodeObject(env, (const uint8_t *)args_ptr, param.type);
|
|
784
787
|
arguments.Append(obj);
|
|
785
788
|
|
|
786
789
|
args_ptr += (param.type->size + 7) / 8;
|
|
@@ -808,7 +811,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
808
811
|
|
|
809
812
|
// Make the call
|
|
810
813
|
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); });
|
|
814
|
+
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
|
|
812
815
|
Napi::Value value(env, ret);
|
|
813
816
|
|
|
814
817
|
if (RG_UNLIKELY(env.IsExceptionPending()))
|
|
@@ -821,7 +824,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
821
824
|
return; \
|
|
822
825
|
} \
|
|
823
826
|
\
|
|
824
|
-
CType v =
|
|
827
|
+
CType v = GetNumber<CType>(value); \
|
|
825
828
|
out_reg->rax = (uint64_t)v; \
|
|
826
829
|
} while (false)
|
|
827
830
|
#define RETURN_INTEGER_SWAP(CType) \
|
|
@@ -831,7 +834,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
831
834
|
return; \
|
|
832
835
|
} \
|
|
833
836
|
\
|
|
834
|
-
CType v =
|
|
837
|
+
CType v = GetNumber<CType>(value); \
|
|
835
838
|
out_reg->rax = (uint64_t)ReverseBytes(v); \
|
|
836
839
|
} while (false)
|
|
837
840
|
|
|
@@ -863,14 +866,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
863
866
|
case PrimitiveKind::UInt64S: { RETURN_INTEGER_SWAP(uint64_t); } break;
|
|
864
867
|
case PrimitiveKind::String: {
|
|
865
868
|
const char *str;
|
|
866
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
869
|
+
if (RG_UNLIKELY(!PushString(value, 1, &str)))
|
|
867
870
|
return;
|
|
868
871
|
|
|
869
872
|
out_reg->rax = (uint64_t)str;
|
|
870
873
|
} break;
|
|
871
874
|
case PrimitiveKind::String16: {
|
|
872
875
|
const char16_t *str16;
|
|
873
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
876
|
+
if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
|
|
874
877
|
return;
|
|
875
878
|
|
|
876
879
|
out_reg->rax = (uint64_t)str16;
|
|
@@ -937,7 +940,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
937
940
|
return;
|
|
938
941
|
}
|
|
939
942
|
|
|
940
|
-
float f =
|
|
943
|
+
float f = GetNumber<float>(value);
|
|
941
944
|
|
|
942
945
|
memset((uint8_t *)&out_reg->xmm0 + 4, 0, 4);
|
|
943
946
|
memcpy(&out_reg->xmm0, &f, 4);
|
|
@@ -948,7 +951,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
948
951
|
return;
|
|
949
952
|
}
|
|
950
953
|
|
|
951
|
-
double d =
|
|
954
|
+
double d = GetNumber<double>(value);
|
|
952
955
|
out_reg->xmm0 = d;
|
|
953
956
|
} break;
|
|
954
957
|
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: {
|
|
@@ -285,6 +285,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
285
285
|
|
|
286
286
|
void CallData::Execute()
|
|
287
287
|
{
|
|
288
|
+
RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
|
|
288
289
|
exec_call = this;
|
|
289
290
|
|
|
290
291
|
#define PERFORM_CALL(Suffix) \
|
|
@@ -370,7 +371,7 @@ Napi::Value CallData::Complete()
|
|
|
370
371
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
371
372
|
: (const uint8_t *)&result.buf;
|
|
372
373
|
|
|
373
|
-
Napi::Object obj =
|
|
374
|
+
Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
|
|
374
375
|
return obj;
|
|
375
376
|
} break;
|
|
376
377
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -406,7 +407,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
406
407
|
return;
|
|
407
408
|
}
|
|
408
409
|
|
|
409
|
-
LocalArray<napi_value, MaxParameters> arguments;
|
|
410
|
+
LocalArray<napi_value, MaxParameters + 1> arguments;
|
|
411
|
+
|
|
412
|
+
arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
|
|
410
413
|
|
|
411
414
|
// Convert to JS arguments
|
|
412
415
|
for (Size i = 0, j = !!return_ptr; i < proto->parameters.len; i++, j++) {
|
|
@@ -574,7 +577,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
574
577
|
}
|
|
575
578
|
args_ptr += (j >= 4);
|
|
576
579
|
|
|
577
|
-
Napi::Object obj2 =
|
|
580
|
+
Napi::Object obj2 = DecodeObject(env, ptr, param.type);
|
|
578
581
|
arguments.Append(obj2);
|
|
579
582
|
} break;
|
|
580
583
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -601,7 +604,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
601
604
|
|
|
602
605
|
// Make the call
|
|
603
606
|
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); });
|
|
607
|
+
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
|
|
605
608
|
Napi::Value value(env, ret);
|
|
606
609
|
|
|
607
610
|
if (RG_UNLIKELY(env.IsExceptionPending()))
|
|
@@ -614,7 +617,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
614
617
|
return; \
|
|
615
618
|
} \
|
|
616
619
|
\
|
|
617
|
-
CType v =
|
|
620
|
+
CType v = GetNumber<CType>(value); \
|
|
618
621
|
out_reg->rax = (uint64_t)v; \
|
|
619
622
|
} while (false)
|
|
620
623
|
#define RETURN_INTEGER_SWAP(CType) \
|
|
@@ -624,7 +627,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
624
627
|
return; \
|
|
625
628
|
} \
|
|
626
629
|
\
|
|
627
|
-
CType v =
|
|
630
|
+
CType v = GetNumber<CType>(value); \
|
|
628
631
|
out_reg->rax = (uint64_t)ReverseBytes(v); \
|
|
629
632
|
} while (false)
|
|
630
633
|
|
|
@@ -655,14 +658,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
655
658
|
case PrimitiveKind::UInt64S: { RETURN_INTEGER_SWAP(uint64_t); } break;
|
|
656
659
|
case PrimitiveKind::String: {
|
|
657
660
|
const char *str;
|
|
658
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
661
|
+
if (RG_UNLIKELY(!PushString(value, 1, &str)))
|
|
659
662
|
return;
|
|
660
663
|
|
|
661
664
|
out_reg->rax = (uint64_t)str;
|
|
662
665
|
} break;
|
|
663
666
|
case PrimitiveKind::String16: {
|
|
664
667
|
const char16_t *str16;
|
|
665
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
668
|
+
if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
|
|
666
669
|
return;
|
|
667
670
|
|
|
668
671
|
out_reg->rax = (uint64_t)str16;
|
|
@@ -711,7 +714,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
711
714
|
return;
|
|
712
715
|
}
|
|
713
716
|
|
|
714
|
-
float f =
|
|
717
|
+
float f = GetNumber<float>(value);
|
|
715
718
|
|
|
716
719
|
memset((uint8_t *)&out_reg->xmm0 + 4, 0, 4);
|
|
717
720
|
memcpy(&out_reg->xmm0, &f, 4);
|
|
@@ -722,7 +725,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
722
725
|
return;
|
|
723
726
|
}
|
|
724
727
|
|
|
725
|
-
double d =
|
|
728
|
+
double d = GetNumber<double>(value);
|
|
726
729
|
out_reg->xmm0 = d;
|
|
727
730
|
} break;
|
|
728
731
|
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;
|
|
@@ -366,6 +366,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
|
|
|
366
366
|
|
|
367
367
|
void CallData::Execute()
|
|
368
368
|
{
|
|
369
|
+
RG_DEFER_C(prev_call = exec_call) { exec_call = prev_call; };
|
|
369
370
|
exec_call = this;
|
|
370
371
|
|
|
371
372
|
#define PERFORM_CALL(Suffix) \
|
|
@@ -452,7 +453,7 @@ Napi::Value CallData::Complete()
|
|
|
452
453
|
const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
|
|
453
454
|
: (const uint8_t *)&result.buf;
|
|
454
455
|
|
|
455
|
-
Napi::Object obj =
|
|
456
|
+
Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
|
|
456
457
|
return obj;
|
|
457
458
|
} break;
|
|
458
459
|
case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
|
|
@@ -502,7 +503,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
502
503
|
return;
|
|
503
504
|
}
|
|
504
505
|
|
|
505
|
-
LocalArray<napi_value, MaxParameters> arguments;
|
|
506
|
+
LocalArray<napi_value, MaxParameters + 1> arguments;
|
|
507
|
+
|
|
508
|
+
arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
|
|
506
509
|
|
|
507
510
|
// Convert to JS arguments
|
|
508
511
|
for (Size i = 0; i < proto->parameters.len; i++) {
|
|
@@ -652,7 +655,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
652
655
|
|
|
653
656
|
uint8_t *ptr = (uint8_t *)args_ptr;
|
|
654
657
|
|
|
655
|
-
Napi::Object obj2 =
|
|
658
|
+
Napi::Object obj2 = DecodeObject(env, ptr, param.type);
|
|
656
659
|
arguments.Append(obj2);
|
|
657
660
|
|
|
658
661
|
args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
|
|
@@ -680,7 +683,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
680
683
|
|
|
681
684
|
// Make the call
|
|
682
685
|
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); });
|
|
686
|
+
[](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
|
|
684
687
|
Napi::Value value(env, ret);
|
|
685
688
|
|
|
686
689
|
if (RG_UNLIKELY(env.IsExceptionPending()))
|
|
@@ -693,7 +696,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
693
696
|
return; \
|
|
694
697
|
} \
|
|
695
698
|
\
|
|
696
|
-
CType v =
|
|
699
|
+
CType v = GetNumber<CType>(value); \
|
|
697
700
|
out_reg->eax = (uint32_t)v; \
|
|
698
701
|
} while (false)
|
|
699
702
|
#define RETURN_INTEGER_32_SWAP(CType) \
|
|
@@ -703,7 +706,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
703
706
|
return; \
|
|
704
707
|
} \
|
|
705
708
|
\
|
|
706
|
-
CType v =
|
|
709
|
+
CType v = GetNumber<CType>(value); \
|
|
707
710
|
out_reg->eax = (uint32_t)ReverseBytes(v); \
|
|
708
711
|
} while (false)
|
|
709
712
|
#define RETURN_INTEGER_64(CType) \
|
|
@@ -713,7 +716,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
713
716
|
return; \
|
|
714
717
|
} \
|
|
715
718
|
\
|
|
716
|
-
CType v =
|
|
719
|
+
CType v = GetNumber<CType>(value); \
|
|
717
720
|
\
|
|
718
721
|
out_reg->eax = (uint32_t)((uint64_t)v >> 32); \
|
|
719
722
|
out_reg->edx = (uint32_t)((uint64_t)v & 0xFFFFFFFFu); \
|
|
@@ -725,7 +728,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
725
728
|
return; \
|
|
726
729
|
} \
|
|
727
730
|
\
|
|
728
|
-
CType v = ReverseBytes(
|
|
731
|
+
CType v = ReverseBytes(GetNumber<CType>(value)); \
|
|
729
732
|
\
|
|
730
733
|
out_reg->eax = (uint32_t)((uint64_t)v >> 32); \
|
|
731
734
|
out_reg->edx = (uint32_t)((uint64_t)v & 0xFFFFFFFFu); \
|
|
@@ -758,14 +761,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
758
761
|
case PrimitiveKind::UInt64S: { RETURN_INTEGER_64_SWAP(uint64_t); } break;
|
|
759
762
|
case PrimitiveKind::String: {
|
|
760
763
|
const char *str;
|
|
761
|
-
if (RG_UNLIKELY(!PushString(value, &str)))
|
|
764
|
+
if (RG_UNLIKELY(!PushString(value, 1, &str)))
|
|
762
765
|
return;
|
|
763
766
|
|
|
764
767
|
out_reg->eax = (uint32_t)str;
|
|
765
768
|
} break;
|
|
766
769
|
case PrimitiveKind::String16: {
|
|
767
770
|
const char16_t *str16;
|
|
768
|
-
if (RG_UNLIKELY(!PushString16(value, &str16)))
|
|
771
|
+
if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
|
|
769
772
|
return;
|
|
770
773
|
|
|
771
774
|
out_reg->eax = (uint32_t)str16;
|
|
@@ -814,7 +817,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
814
817
|
return;
|
|
815
818
|
}
|
|
816
819
|
|
|
817
|
-
out_reg->x87.f =
|
|
820
|
+
out_reg->x87.f = GetNumber<float>(value);
|
|
818
821
|
out_reg->x87_double = false;
|
|
819
822
|
} break;
|
|
820
823
|
case PrimitiveKind::Float64: {
|
|
@@ -823,7 +826,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
|
|
|
823
826
|
return;
|
|
824
827
|
}
|
|
825
828
|
|
|
826
|
-
out_reg->x87.d =
|
|
829
|
+
out_reg->x87.d = GetNumber<double>(value);
|
|
827
830
|
out_reg->x87_double = true;
|
|
828
831
|
} break;
|
|
829
832
|
case PrimitiveKind::Callback: {
|