projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
prepare varargs calls
[m6w6/ext-psi]
/
src
/
libffi.c
diff --git
a/src/libffi.c
b/src/libffi.c
index d802bd1f293ee09aafabb82ff66a4bd4e02abcc0..257fb48521b73f965a9534410daedf595da5a1e0 100644
(file)
--- a/
src/libffi.c
+++ b/
src/libffi.c
@@
-1,4
+1,11
@@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include "php.h"
#include "php.h"
+
+#ifdef HAVE_LIBFFI
+
#include "php_psi.h"
#include "libffi.h"
#include "php_psi.h"
#include "libffi.h"
@@
-120,6
+127,8
@@
static inline PSI_LibffiCall *PSI_LibffiCallAlloc(PSI_Context *C, decl *decl) {
call->params[c] = NULL;
decl->call.info = call;
call->params[c] = NULL;
decl->call.info = call;
+ decl->call.rval = decl->func->ptr;
+ decl->call.argc = c;
decl->call.args = (void **) &call->params[c+1];
rc = ffi_prep_cif(&call->signature, psi_ffi_abi(decl->abi->convention),
decl->call.args = (void **) &call->params[c+1];
rc = ffi_prep_cif(&call->signature, psi_ffi_abi(decl->abi->convention),
@@
-145,7
+154,7
@@
static inline void PSI_LibffiCallInitClosure(PSI_Context *C, PSI_LibffiCall *cal
call->code);
#elif PSI_HAVE_FFI_PREP_CLOSURE
call->code);
#elif PSI_HAVE_FFI_PREP_CLOSURE
- rc = ffi_prep_closure(
data->code, &context->signature, psi_ffi_handler, data
);
+ rc = ffi_prep_closure(
call->code, &context->signature, psi_ffi_handler, impl
);
#else
# error "Neither ffi_prep_closure() nor ffi_prep_closure_loc() available"
#endif
#else
# error "Neither ffi_prep_closure() nor ffi_prep_closure_loc() available"
#endif
@@
-185,14
+194,17
@@
static void psi_ffi_init(PSI_Context *C)
C->context = PSI_LibffiContextInit(NULL);
}
C->context = PSI_LibffiContextInit(NULL);
}
-static void psi_ffi_dtor(PSI_Context *C) {
- size_t i;
+static void psi_ffi_dtor(PSI_Context *C)
+{
+ if (C->decls) {
+ size_t i;
- for (i = 0; i < C->decls->count; ++i) {
- decl *decl = C->decls->list[i];
+
for (i = 0; i < C->decls->count; ++i) {
+
decl *decl = C->decls->list[i];
- if (decl->call.info) {
- PSI_LibffiCallFree(decl->call.info);
+ if (decl->call.info) {
+ PSI_LibffiCallFree(decl->call.info);
+ }
}
}
free(C->context);
}
}
free(C->context);
@@
-240,10
+252,10
@@
static zend_function_entry *psi_ffi_compile(PSI_Context *C)
return zfe;
}
return zfe;
}
-static void psi_ffi_call(PSI_Context *C,
impl_val *ret_val, decl *dec
l) {
- PSI_LibffiCall *call = decl
->call.
info;
+static void psi_ffi_call(PSI_Context *C,
decl_callinfo *decl_cal
l) {
+ PSI_LibffiCall *call = decl
_call->
info;
- ffi_call(&call->signature, FFI_FN(decl
->call.sym), ret_val, decl->call.
args);
+ ffi_call(&call->signature, FFI_FN(decl
_call->sym), decl_call->rval, decl_call->
args);
}
static PSI_ContextOps ops = {
}
static PSI_ContextOps ops = {
@@
-257,3
+269,5
@@
PSI_ContextOps *PSI_Libffi(void)
{
return &ops;
}
{
return &ops;
}
+
+#endif /* HAVE_LIBFFI */