|
@@ -260,17 +260,15 @@ static ResultType callCFunction(LinkValue *function_value, Argument *arg, long i
|
|
|
|
|
|
static bool makeFFIReturn(enum ArgumentFFIType af, void **re_v) {
|
|
|
switch (af) {
|
|
|
+ case af_char:
|
|
|
case af_int:
|
|
|
- *re_v = memCalloc(1, sizeof(int));
|
|
|
+ *re_v = memCalloc(1, sizeof(int64_t)); // 无论是int32或者是int64,都申请int64_t的内存 (否则libffi会提升类型,导致内存溢出)
|
|
|
break;
|
|
|
case af_double:
|
|
|
- *re_v = memCalloc(1, sizeof(double));
|
|
|
+ *re_v = memCalloc(1, sizeof(long double)); // 理由同上
|
|
|
break;
|
|
|
case af_str:
|
|
|
- *re_v = memCalloc(1, sizeof(char *));
|
|
|
- break;
|
|
|
- case af_char:
|
|
|
- *re_v = memCalloc(1, sizeof(char));
|
|
|
+ *re_v = memCalloc(1, sizeof(void *)); // 所有指针数据大小都相同
|
|
|
break;
|
|
|
case af_void:
|
|
|
*re_v = NULL;
|
|
@@ -284,10 +282,10 @@ static bool makeFFIReturn(enum ArgumentFFIType af, void **re_v) {
|
|
|
static bool FFIReturnValue(enum ArgumentFFIType aft, void *re_v, fline line, char *file, FUNC_NT) {
|
|
|
switch (aft) { // 应用返回值函数
|
|
|
case af_int:
|
|
|
- makeIntValue(*(int *)re_v, line, file, CNEXT_NT);
|
|
|
+ makeIntValue((vint)*(int64_t *)re_v, line, file, CNEXT_NT); // 先以(int64_t)读取void *类型的数据, 再转换成(vint)类型 (避免大端和小端模式的行为不同)
|
|
|
break;
|
|
|
case af_double:
|
|
|
- makeDouValue(*(double *)re_v, line, file, CNEXT_NT);
|
|
|
+ makeDouValue((vdou)*(long double *)re_v, line, file, CNEXT_NT);
|
|
|
break;
|
|
|
case af_str: {
|
|
|
wchar_t *tmp = memStrToWcs(re_v, false);
|