From 42a0342109ae0f55f55ddfd0e505926f92d8ee1e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 3 Dec 2012 10:40:28 -0700 Subject: [PATCH] ffi: use newer prim-closure representation for foreign functions Cuts 1/3 of the time off a call for a micro-benchmark, since the path from JIT-generated code to C code is faster. --- src/foreign/foreign.c | 13 ++++++++----- src/foreign/foreign.rktc | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/foreign/foreign.c b/src/foreign/foreign.c index ba085986ec..37466cfa41 100644 --- a/src/foreign/foreign.c +++ b/src/foreign/foreign.c @@ -3041,9 +3041,10 @@ static void finish_ffi_call(ffi_cif *cif, void *c_func, intptr_t cfoff, ffi_call(cif, (VoidFun)W_OFFSET(c_func, cfoff), p, avalues); } -Scheme_Object *ffi_do_call(void *data, int argc, Scheme_Object *argv[]) +Scheme_Object *ffi_do_call(int argc, Scheme_Object *argv[], Scheme_Object *self) /* data := {name, c-function, itypes, otype, cif} */ { + Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0]; const char *name = SCHEME_BYTE_STR_VAL(SCHEME_VEC_ELS(data)[0]); void *c_func = (void*)(SCHEME_VEC_ELS(data)[1]); Scheme_Object *itypes = SCHEME_VEC_ELS(data)[2]; @@ -3174,7 +3175,7 @@ static Scheme_Object *foreign_ffi_call(int argc, Scheme_Object *argv[]) { Scheme_Object *itypes = argv[1]; Scheme_Object *otype = argv[2]; - Scheme_Object *obj, *data, *p, *base, *cp, *name; + Scheme_Object *obj, *data, *p, *base, *cp, *name, *a[1]; ffi_abi abi; intptr_t ooff; GC_CAN_IGNORE ffi_type *rtype, **atypes; @@ -3247,9 +3248,11 @@ static Scheme_Object *foreign_ffi_call(int argc, Scheme_Object *argv[]) SCHEME_VEC_ELS(data)[7] = (orig_place ? scheme_true : scheme_false); # endif /* MZ_USE_PLACES */ scheme_register_finalizer(data, free_fficall_data, cif, NULL, NULL); - return scheme_make_closed_prim_w_arity(ffi_do_call, (void*)data, - SCHEME_BYTE_STR_VAL(name), - nargs, nargs); + a[0] = data; + return scheme_make_prim_closure_w_arity(ffi_do_call, + 1, a, + SCHEME_BYTE_STR_VAL(name), + nargs, nargs); } #undef MYNAME diff --git a/src/foreign/foreign.rktc b/src/foreign/foreign.rktc index e70e2a423c..0058582fd1 100755 --- a/src/foreign/foreign.rktc +++ b/src/foreign/foreign.rktc @@ -2397,9 +2397,10 @@ static void finish_ffi_call(ffi_cif *cif, void *c_func, intptr_t cfoff, ffi_call(cif, (VoidFun)W_OFFSET(c_func, cfoff), p, avalues); } -Scheme_Object *ffi_do_call(void *data, int argc, Scheme_Object *argv[]) +Scheme_Object *ffi_do_call(int argc, Scheme_Object *argv[], Scheme_Object *self) /* data := {name, c-function, itypes, otype, cif} */ { + Scheme_Object *data = SCHEME_PRIM_CLOSURE_ELS(self)[0]; const char *name = SCHEME_BYTE_STR_VAL(SCHEME_VEC_ELS(data)[0]); void *c_func = (void*)(SCHEME_VEC_ELS(data)[1]); Scheme_Object *itypes = SCHEME_VEC_ELS(data)[2]; @@ -2528,7 +2529,7 @@ static Scheme_Object *ffi_name = NULL; @cdefine[ffi-call 3 6]{ Scheme_Object *itypes = argv[1]; Scheme_Object *otype = argv[2]; - Scheme_Object *obj, *data, *p, *base, *cp, *name; + Scheme_Object *obj, *data, *p, *base, *cp, *name, *a[1]; ffi_abi abi; intptr_t ooff; GC_CAN_IGNORE ffi_type *rtype, **atypes; @@ -2601,9 +2602,11 @@ static Scheme_Object *ffi_name = NULL; SCHEME_VEC_ELS(data)[7] = (orig_place ? scheme_true : scheme_false); } scheme_register_finalizer(data, free_fficall_data, cif, NULL, NULL); - return scheme_make_closed_prim_w_arity(ffi_do_call, (void*)data, - SCHEME_BYTE_STR_VAL(name), - nargs, nargs); + a[0] = data; + return scheme_make_prim_closure_w_arity(ffi_do_call, + 1, a, + SCHEME_BYTE_STR_VAL(name), + nargs, nargs); } /*****************************************************************************/