ffi: fix recording of foreign function names

The internal change to a curried mode caused a generic name to be
used.
This commit is contained in:
Matthew Flatt 2019-07-21 15:47:58 -06:00
parent 0f6cd01489
commit ab9a5d261e
2 changed files with 13 additions and 7 deletions

View File

@ -3549,7 +3549,7 @@ static Scheme_Object *ffi_do_call(int argc, Scheme_Object *argv[], Scheme_Object
{ {
Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0]; Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0];
int curried = !SCHEME_VEC_ELS(data)[1] && !SCHEME_INT_VAL(SCHEME_VEC_ELS(data)[5]); int curried = !SCHEME_VEC_ELS(data)[1] && !SCHEME_INT_VAL(SCHEME_VEC_ELS(data)[5]);
const char *name = SCHEME_BYTE_STR_VAL(SCHEME_VEC_ELS(data)[0]); const char *name = ((Scheme_Primitive_Closure *)self)->p.name;
void *c_func = (curried void *c_func = (curried
? (void*)SCHEME_PRIM_CLOSURE_ELS(self)[1] ? (void*)SCHEME_PRIM_CLOSURE_ELS(self)[1]
: (void*)(SCHEME_VEC_ELS(data)[1])); : (void*)(SCHEME_VEC_ELS(data)[1]));
@ -3724,6 +3724,7 @@ static Scheme_Object *make_ffi_call_from_curried(int argc, Scheme_Object *argv[]
{ {
Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0]; Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0];
Scheme_Object *a[3], *name, *itypes, *obj, *cp; Scheme_Object *a[3], *name, *itypes, *obj, *cp;
const char *name_str;
intptr_t ooff; intptr_t ooff;
int nargs; int nargs;
@ -3737,7 +3738,9 @@ static Scheme_Object *make_ffi_call_from_curried(int argc, Scheme_Object *argv[]
name = SCHEME_VEC_ELS(data)[0]; name = SCHEME_VEC_ELS(data)[0];
if (SCHEME_FFIOBJP(cp)) if (SCHEME_FFIOBJP(cp))
name = scheme_make_byte_string(((ffi_obj_struct*)(cp))->name); name_str = ((ffi_obj_struct*)(cp))->name;
else
name_str = SCHEME_BYTE_STR_VAL(name);
itypes = SCHEME_VEC_ELS(data)[2]; itypes = SCHEME_VEC_ELS(data)[2];
@ -3749,7 +3752,7 @@ static Scheme_Object *make_ffi_call_from_curried(int argc, Scheme_Object *argv[]
return scheme_make_prim_closure_w_arity(ffi_do_call_after_stack_check, return scheme_make_prim_closure_w_arity(ffi_do_call_after_stack_check,
3, a, 3, a,
SCHEME_BYTE_STR_VAL(name), name_str,
nargs, nargs); nargs, nargs);
} }

View File

@ -2720,7 +2720,7 @@ static Scheme_Object *ffi_do_call(int argc, Scheme_Object *argv[], Scheme_Object
{ {
Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0]; Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0];
int curried = !SCHEME_VEC_ELS(data)[1] && !SCHEME_INT_VAL(SCHEME_VEC_ELS(data)[5]); int curried = !SCHEME_VEC_ELS(data)[1] && !SCHEME_INT_VAL(SCHEME_VEC_ELS(data)[5]);
const char *name = SCHEME_BYTE_STR_VAL(SCHEME_VEC_ELS(data)[0]); const char *name = ((Scheme_Primitive_Closure *)self)->p.name;
void *c_func = (curried void *c_func = (curried
? (void*)SCHEME_PRIM_CLOSURE_ELS(self)[1] ? (void*)SCHEME_PRIM_CLOSURE_ELS(self)[1]
: (void*)(SCHEME_VEC_ELS(data)[1])); : (void*)(SCHEME_VEC_ELS(data)[1]));
@ -2895,6 +2895,7 @@ static Scheme_Object *make_ffi_call_from_curried(int argc, Scheme_Object *argv[]
{ {
Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0]; Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0];
Scheme_Object *a[3], *name, *itypes, *obj, *cp; Scheme_Object *a[3], *name, *itypes, *obj, *cp;
const char *name_str;
intptr_t ooff; intptr_t ooff;
int nargs; int nargs;
@ -2908,7 +2909,9 @@ static Scheme_Object *make_ffi_call_from_curried(int argc, Scheme_Object *argv[]
name = SCHEME_VEC_ELS(data)[0]; name = SCHEME_VEC_ELS(data)[0];
if (SCHEME_FFIOBJP(cp)) if (SCHEME_FFIOBJP(cp))
name = scheme_make_byte_string(((ffi_obj_struct*)(cp))->name); name_str = ((ffi_obj_struct*)(cp))->name;
else
name_str = SCHEME_BYTE_STR_VAL(name);
itypes = SCHEME_VEC_ELS(data)[2]; itypes = SCHEME_VEC_ELS(data)[2];
@ -2920,7 +2923,7 @@ static Scheme_Object *make_ffi_call_from_curried(int argc, Scheme_Object *argv[]
return scheme_make_prim_closure_w_arity(ffi_do_call_after_stack_check, return scheme_make_prim_closure_w_arity(ffi_do_call_after_stack_check,
3, a, 3, a,
SCHEME_BYTE_STR_VAL(name), name_str,
nargs, nargs); nargs, nargs);
} }