projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
flush
[m6w6/ext-psi]
/
src
/
libffi.c
diff --git
a/src/libffi.c
b/src/libffi.c
index 2c68fbf0ee4bb34834dd51b910bdb1ec39e3f3e5..e50ca0f56f9da2e16be3d55df99bab1879597bf0 100644
(file)
--- a/
src/libffi.c
+++ b/
src/libffi.c
@@
-2,6
+2,13
@@
#include "php_psi.h"
#include "libffi.h"
#include "php_psi.h"
#include "libffi.h"
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+
#include <ffi.h>
#ifndef PSI_HAVE_FFI_CLOSURE_ALLOC
#include <ffi.h>
#ifndef PSI_HAVE_FFI_CLOSURE_ALLOC
@@
-41,7
+48,7
@@
static void psi_ffi_closure_free(void *c)
#endif
}
#endif
}
-static void handler(ffi_cif *signature, void *_result, void **_args, void *_data);
+static void
psi_ffi_
handler(ffi_cif *signature, void *_result, void **_args, void *_data);
static inline ffi_abi psi_ffi_abi(const char *convention) {
return FFI_DEFAULT_ABI;
static inline ffi_abi psi_ffi_abi(const char *convention) {
return FFI_DEFAULT_ABI;
@@
-53,32
+60,26
@@
static inline ffi_type *psi_ffi_type(token_t t) {
/* no break */
case PSI_T_VOID:
return &ffi_type_void;
/* no break */
case PSI_T_VOID:
return &ffi_type_void;
- case PSI_T_
S
INT8:
+ case PSI_T_INT8:
return &ffi_type_sint8;
case PSI_T_UINT8:
return &ffi_type_uint8;
return &ffi_type_sint8;
case PSI_T_UINT8:
return &ffi_type_uint8;
- case PSI_T_
S
INT16:
+ case PSI_T_INT16:
return &ffi_type_sint16;
case PSI_T_UINT16:
return &ffi_type_uint16;
return &ffi_type_sint16;
case PSI_T_UINT16:
return &ffi_type_uint16;
- case PSI_T_
S
INT32:
+ case PSI_T_INT32:
return &ffi_type_sint32;
case PSI_T_UINT32:
return &ffi_type_uint32;
return &ffi_type_sint32;
case PSI_T_UINT32:
return &ffi_type_uint32;
- case PSI_T_
S
INT64:
+ case PSI_T_INT64:
return &ffi_type_sint64;
case PSI_T_UINT64:
return &ffi_type_uint64;
case PSI_T_BOOL:
return &ffi_type_uchar;
return &ffi_type_sint64;
case PSI_T_UINT64:
return &ffi_type_uint64;
case PSI_T_BOOL:
return &ffi_type_uchar;
- case PSI_T_CHAR:
- return &ffi_type_schar;
- case PSI_T_SHORT:
- return &ffi_type_sshort;
case PSI_T_INT:
return &ffi_type_sint;
case PSI_T_INT:
return &ffi_type_sint;
- case PSI_T_LONG:
- return &ffi_type_slong;
case PSI_T_FLOAT:
return &ffi_type_float;
case PSI_T_DOUBLE:
case PSI_T_FLOAT:
return &ffi_type_float;
case PSI_T_DOUBLE:
@@
-117,7
+118,7
@@
typedef struct PSI_LibffiData {
static inline PSI_LibffiData *PSI_LibffiDataAlloc(PSI_LibffiContext *context, impl *impl) {
ffi_status rc;
static inline PSI_LibffiData *PSI_LibffiDataAlloc(PSI_LibffiContext *context, impl *impl) {
ffi_status rc;
- size_t i, c = impl->decl->args
->count
;
+ size_t i, c = impl->decl->args
? impl->decl->args->count : 0
;
PSI_LibffiData *data = malloc(sizeof(*data) + c * sizeof(ffi_type *));
data->context = context;
PSI_LibffiData *data = malloc(sizeof(*data) + c * sizeof(ffi_type *));
data->context = context;
@@
-142,12
+143,12
@@
static inline PSI_LibffiData *PSI_LibffiDataAlloc(PSI_LibffiContext *context, im
rc = ffi_prep_closure_loc(
data->closure,
&context->signature,
rc = ffi_prep_closure_loc(
data->closure,
&context->signature,
- handler,
+
psi_ffi_
handler,
data,
data->code);
ZEND_ASSERT(FFI_OK == rc);
#elif PSI_HAVE_FFI_PREP_CLOSURE
data,
data->code);
ZEND_ASSERT(FFI_OK == rc);
#elif PSI_HAVE_FFI_PREP_CLOSURE
- rc = ffi_prep_closure(data->code, &context->signature, handler, data);
+ rc = ffi_prep_closure(data->code, &context->signature,
psi_ffi_
handler, data);
ZEND_ASSERT(FFI_OK == rc);
#else
# error "Neither ffi_prep_closure() nor ffi_prep_closure_loc() available"
ZEND_ASSERT(FFI_OK == rc);
#else
# error "Neither ffi_prep_closure() nor ffi_prep_closure_loc() available"
@@
-200,40
+201,37
@@
static inline void PSI_LibffiContextFree(PSI_LibffiContext **L) {
}
}
}
}
-static void handler(ffi_cif *_sig, void *_result, void **_args, void *_data)
+static void
psi_ffi_
handler(ffi_cif *_sig, void *_result, void **_args, void *_data)
{
PSI_LibffiData *data = _data;
size_t i;
{
PSI_LibffiData *data = _data;
size_t i;
- void **arg_p
tr = NULL, **arg_p
rm = NULL;
+ void **arg_prm = NULL;
impl_val ret_val;
if (SUCCESS != psi_parse_args(*(zend_execute_data **)_args[0], data->impl)) {
return;
}
impl_val ret_val;
if (SUCCESS != psi_parse_args(*(zend_execute_data **)_args[0], data->impl)) {
return;
}
- if (data->impl->decl->args->count) {
- arg_ptr = malloc(data->impl->decl->args->count * sizeof(*arg_ptr));
+ if (data->impl->decl->args) {
arg_prm = malloc(data->impl->decl->args->count * sizeof(*arg_prm));
for (i = 0; i < data->impl->decl->args->count; ++i) {
decl_arg *darg = data->impl->decl->args->args[i];
arg_prm = malloc(data->impl->decl->args->count * sizeof(*arg_prm));
for (i = 0; i < data->impl->decl->args->count; ++i) {
decl_arg *darg = data->impl->decl->args->args[i];
- arg_ptr[i] = psi_do_let(darg);
- arg_prm[i] = (darg->let->val && darg->let->val->is_reference)
- ? &arg_ptr[i] : arg_ptr[i];
-
- darg->let->ptr = arg_ptr[i];
+ arg_prm[i] = psi_do_let(darg);
}
}
ffi_call(&data->signature, FFI_FN(data->impl->decl->dlptr), &ret_val, arg_prm);
}
}
ffi_call(&data->signature, FFI_FN(data->impl->decl->dlptr), &ret_val, arg_prm);
- psi_do_return(data->impl, &ret_val, *(zval **)_args[1]);
+ psi_do_return(data->impl
->stmts->ret.list[0]
, &ret_val, *(zval **)_args[1]);
for (i = 0; i < data->impl->stmts->set.count; ++i) {
set_stmt *set = data->impl->stmts->set.list[i];
for (i = 0; i < data->impl->stmts->set.count; ++i) {
set_stmt *set = data->impl->stmts->set.list[i];
- psi_do_set(set->arg->_zv, set->val->func, set->val->vars);
+ if (set->arg->_zv) {
+ psi_do_set(set->arg->_zv, set->val);
+ }
}
for (i = 0; i < data->impl->stmts->fre.count; ++i) {
}
for (i = 0; i < data->impl->stmts->fre.count; ++i) {
@@
-244,41
+242,43
@@
static void handler(ffi_cif *_sig, void *_result, void **_args, void *_data)
psi_do_clean(data->impl);
psi_do_clean(data->impl);
- if (arg_ptr) {
- free(arg_ptr);
- }
if (arg_prm) {
free(arg_prm);
}
}
if (arg_prm) {
free(arg_prm);
}
}
-static void init(PSI_Context *C)
+static void
psi_ffi_
init(PSI_Context *C)
{
C->context = PSI_LibffiContextInit(NULL);
}
{
C->context = PSI_LibffiContextInit(NULL);
}
-static void dtor(PSI_Context *C)
+static void
psi_ffi_
dtor(PSI_Context *C)
{
PSI_LibffiContextFree((void *) &C->context);
}
{
PSI_LibffiContextFree((void *) &C->context);
}
-static zend_function_entry *
compile(PSI_Context *C, PSI_Data *D
)
+static zend_function_entry *
psi_ffi_compile(PSI_Context *C
)
{
size_t i, j = 0;
{
size_t i, j = 0;
- zend_function_entry *zfe
= calloc(D->impls->count + 1, sizeof(*zfe))
;
+ zend_function_entry *zfe;
PSI_LibffiContext *ctx = C->context;
PSI_LibffiContext *ctx = C->context;
- for (i = 0; i < D->impls->count; ++i) {
+ if (!C->impls) {
+ return NULL;
+ }
+
+ zfe = calloc(C->impls->count + 1, sizeof(*zfe));
+ for (i = 0; i < C->impls->count; ++i) {
zend_function_entry *zf = &zfe[j];
PSI_LibffiData *data;
zend_function_entry *zf = &zfe[j];
PSI_LibffiData *data;
- if (!
D
->impls->list[i]->decl) {
+ if (!
C
->impls->list[i]->decl) {
continue;
}
continue;
}
- data = PSI_LibffiDataAlloc(ctx,
D
->impls->list[i]);
- zf->fname =
D->impls->list[i]->func->name + (D
->impls->list[i]->func->name[0] == '\\');
- zf->num_args =
D
->impls->list[i]->func->args->count;
+ data = PSI_LibffiDataAlloc(ctx,
C
->impls->list[i]);
+ zf->fname =
C->impls->list[i]->func->name + (C
->impls->list[i]->func->name[0] == '\\');
+ zf->num_args =
C
->impls->list[i]->func->args->count;
zf->handler = data->code;
zf->arg_info = data->arginfo;
++j;
zf->handler = data->code;
zf->arg_info = data->arginfo;
++j;
@@
-288,9
+288,9
@@
static zend_function_entry *compile(PSI_Context *C, PSI_Data *D)
}
static PSI_ContextOps ops = {
}
static PSI_ContextOps ops = {
- init,
- dtor,
- compile,
+
psi_ffi_
init,
+
psi_ffi_
dtor,
+
psi_ffi_
compile,
};
PSI_ContextOps *PSI_Libffi(void)
};
PSI_ContextOps *PSI_Libffi(void)