X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcall.c;h=015b626323484e5f01351a2653dd9d155f2616de;hp=46a1dde419cf32876cb591e3aeb03dcdf8f49dff;hb=10e51aad0515e80adeb96a47776a2d80e62a98bc;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84 diff --git a/src/call.c b/src/call.c index 46a1dde..015b626 100644 --- a/src/call.c +++ b/src/call.c @@ -30,6 +30,7 @@ #include "php.h" #include "zend_exceptions.h" +#include "ext/spl/spl_exceptions.h" struct psi_call_frame_argument *psi_call_frame_argument_init(struct psi_impl_arg *spec, impl_val *ival, zval *zptr, int is_vararg) { @@ -187,6 +188,7 @@ zval *psi_call_frame_sub_argument(struct psi_call_frame *frame, if (!inner_zval) { zval empty_zval; + SEPARATE_ZVAL(outer_zval); ZVAL_NULL(&empty_zval); inner_zval = zend_symtable_str_update(Z_ARRVAL_P(outer_zval), &inner_var->name[1], strlen(&inner_var->name[1]), @@ -232,6 +234,27 @@ void **psi_call_frame_get_arg_pointers(struct psi_call_frame *frame) { return frame->pointers; } +void *psi_call_frame_get_rpointer(struct psi_call_frame *frame) { + return frame->rpointer; +} + +struct psi_decl *psi_call_frame_get_decl(struct psi_call_frame *frame) { + return frame->decl; +} + +struct psi_impl *psi_call_frame_get_impl(struct psi_call_frame *frame) { + return frame->impl; +} + +struct psi_context *psi_call_frame_get_context(struct psi_call_frame *frame) { + return frame->context; +} + +#if PHP_VERSION_ID < 70300 +# define PARAM_PROLOGUE(separate) Z_PARAM_PROLOGUE(separate) +#else +# define PARAM_PROLOGUE(separate) Z_PARAM_PROLOGUE(1, separate) +#endif ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame, zend_execute_data *execute_data) { size_t i, argc = psi_plist_count(frame->impl->func->args); @@ -282,9 +305,9 @@ ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame, Z_PARAM_ARRAY_EX(tmp, _optional || iarg->var->reference, iarg->var->reference); } else if (PSI_T_OBJECT == iarg->type->type) { - Z_PARAM_PROLOGUE(0); + PARAM_PROLOGUE(iarg->var->reference); } else if (PSI_T_MIXED == iarg->type->type) { - Z_PARAM_PROLOGUE(0); + PARAM_PROLOGUE(iarg->var->reference); } else if (PSI_T_CALLABLE == iarg->type->type) { zend_fcall_info fci; zend_fcall_info_cache fcc; @@ -396,37 +419,28 @@ ZEND_RESULT_CODE psi_call_frame_do_let(struct psi_call_frame *frame) { return SUCCESS; } -void psi_call_frame_do_call(struct psi_call_frame *frame) { - size_t va_count = psi_call_frame_num_var_args(frame); - - if (va_count) { - void **va_types = ecalloc(va_count, sizeof(void *)); - size_t i; - - for (i = 0; i < va_count; ++i) { - struct psi_call_frame_argument *frame_arg; - - frame_arg = psi_call_frame_get_var_argument(frame, i); - va_types[i] = frame->context->ops->query(frame->context, - PSI_CONTEXT_QUERY_TYPE, &frame_arg->va_type); +ZEND_RESULT_CODE psi_call_frame_do_assert(struct psi_call_frame *frame, enum psi_assert_kind kind) { + size_t i = 0; + struct psi_assert_stmt *ass; + + while (psi_plist_get(frame->impl->stmts.ass, i++, &ass)) { + if (ass->kind == kind) { + if (!psi_assert_stmt_exec(ass, frame)) { + char *message = psi_assert_stmt_message(ass); + zend_throw_exception(kind == PSI_ASSERT_PRE + ? spl_ce_InvalidArgumentException + : spl_ce_UnexpectedValueException, message, 0); + free(message); + return FAILURE; + } } + } - frame->context->ops->call_va(frame->context, - frame, - frame->decl, - frame->rpointer, - frame->pointers, - va_count, - va_types); + return SUCCESS; +} - efree(va_types); - } else { - frame->context->ops->call(frame->context, - frame, - frame->decl, - frame->rpointer, - frame->pointers); - } +void psi_call_frame_do_call(struct psi_call_frame *frame) { + frame->context->ops->call(frame); } void psi_call_frame_do_callback(struct psi_call_frame *frame, struct psi_call_frame_callback *cbdata)