X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcall.c;h=704675c91f444abab532f63f0447fdabfcf68096;hp=3b477943d4fa06b8380bed164da8c82a75e318d1;hb=698841dfdd4d70d24e0b7af25ac7100bc2cb26a4;hpb=280c9384edec13b46ac67016208fc9d50a0b7347 diff --git a/src/call.c b/src/call.c index 3b47794..704675c 100644 --- a/src/call.c +++ b/src/call.c @@ -23,11 +23,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif + #include "context.h" #include "data.h" #include "call.h" +#include "php_psi.h" + #include "php.h" #include "zend_exceptions.h" @@ -158,9 +165,9 @@ struct psi_call_frame_symbol *psi_call_frame_fetch_symbol( struct psi_call_frame *frame, struct psi_decl_var *dvar) { struct psi_call_frame_symbol *frame_sym; - frame_sym = zend_hash_str_find_ptr(&frame->symbols, dvar->fqn, strlen(dvar->fqn)); + frame_sym = zend_hash_find_ptr(&frame->symbols, dvar->fqn); if (!frame_sym) { - frame_sym = zend_hash_str_add_ptr(&frame->symbols, dvar->fqn, strlen(dvar->fqn), + frame_sym = zend_hash_add_ptr(&frame->symbols, dvar->fqn, psi_call_frame_symbol_init(dvar)); } return frame_sym; @@ -172,17 +179,16 @@ zval *psi_call_frame_new_argument(struct psi_call_frame *frame, /* varargs are just appended with numeric indices */ return zend_hash_next_index_insert_ptr(&frame->arguments, frame_arg); } else { - return zend_hash_str_add_ptr(&frame->arguments, - frame_arg->spec->var->name, strlen(frame_arg->spec->var->name), - frame_arg); + return zend_hash_add_ptr(&frame->arguments, + frame_arg->spec->var->name, frame_arg); } } zval *psi_call_frame_sub_argument(struct psi_call_frame *frame, - struct psi_impl_var *inner_var, zval *outer_zval, const char *name) { + struct psi_impl_var *inner_var, zval *outer_zval, zend_string *name) { struct psi_call_frame_argument *iarg; zval *inner_zval = zend_symtable_str_find(Z_ARRVAL_P(outer_zval), - &inner_var->name[1], strlen(&inner_var->name[1])); + &inner_var->name->val[1], inner_var->name->len - 1); if (!inner_zval) { zval empty_zval; @@ -190,7 +196,7 @@ zval *psi_call_frame_sub_argument(struct psi_call_frame *frame, 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]), + &inner_var->name->val[1], inner_var->name->len - 1, &empty_zval); } @@ -199,21 +205,23 @@ zval *psi_call_frame_sub_argument(struct psi_call_frame *frame, if (!iarg) { struct psi_call_frame_argument *frame_arg; impl_val empty_val = {0}; + zend_string *type_str = psi_string_init_interned(ZEND_STRL("mixed"), 1); struct psi_impl_arg *carg_spec = psi_impl_arg_init( - psi_impl_type_init(PSI_T_MIXED, "mixed"), + psi_impl_type_init(PSI_T_MIXED, type_str), psi_impl_var_copy(inner_var), NULL); psi_call_frame_push_auto_ex(frame, carg_spec, (void(*)(void*)) psi_impl_arg_free); frame_arg = psi_call_frame_argument_init(carg_spec, &empty_val, inner_zval, 0); - zend_hash_str_add_ptr(&frame->arguments, name, strlen(name), frame_arg); + zend_hash_add_ptr(&frame->arguments, name, frame_arg); + zend_string_release(type_str); } return inner_zval; } struct psi_call_frame_argument *psi_call_frame_get_argument( - struct psi_call_frame *frame, const char *name) { - return zend_hash_str_find_ptr(&frame->arguments, name, strlen(name)); + struct psi_call_frame *frame, zend_string *name) { + return zend_hash_find_ptr(&frame->arguments, name); } size_t psi_call_frame_num_var_args(struct psi_call_frame *frame) { @@ -233,7 +241,28 @@ void **psi_call_frame_get_arg_pointers(struct psi_call_frame *frame) { return frame->pointers; } -ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame, +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 +bool 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); zend_error_handling zeh; @@ -245,7 +274,7 @@ ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame, rv = zend_parse_parameters_none(); zend_restore_error_handling(&zeh); - return rv; + return rv == SUCCESS; } ZEND_PARSE_PARAMETERS_START( @@ -283,9 +312,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(iarg->var->reference); + PARAM_PROLOGUE(iarg->var->reference); } else if (PSI_T_MIXED == iarg->type->type) { - Z_PARAM_PROLOGUE(iarg->var->reference); + PARAM_PROLOGUE(iarg->var->reference); } else if (PSI_T_CALLABLE == iarg->type->type) { zend_fcall_info fci; zend_fcall_info_cache fcc; @@ -311,7 +340,7 @@ ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame, } ZEND_PARSE_PARAMETERS_END_EX( zend_restore_error_handling(&zeh); - return FAILURE; + return false; ); /* set up defaults */ @@ -326,7 +355,7 @@ ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame, } zend_restore_error_handling(&zeh); - return SUCCESS; + return true; } void psi_call_frame_enter(struct psi_call_frame *frame) { @@ -348,7 +377,7 @@ void psi_call_frame_enter(struct psi_call_frame *frame) { frame->rpointer = rv_sym->ptr = rv_sym->ival_ptr; } -ZEND_RESULT_CODE psi_call_frame_do_let(struct psi_call_frame *frame) { +bool psi_call_frame_do_let(struct psi_call_frame *frame) { size_t i; struct psi_let_stmt *let; struct psi_decl_arg *arg; @@ -394,40 +423,27 @@ ZEND_RESULT_CODE psi_call_frame_do_let(struct psi_call_frame *frame) { } } - return SUCCESS; + return true; } -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; +bool psi_call_frame_do_assert(struct psi_call_frame *frame, enum psi_assert_kind kind) { + size_t i = 0; + struct psi_assert_stmt *ass; - 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); + while (psi_plist_get(frame->impl->stmts.ass, i++, &ass)) { + if (ass->kind == kind) { + if (!psi_assert_stmt_exec(ass, frame)) { + psi_assert_stmt_throw(ass); + return false; + } } + } - frame->context->ops->call_va(frame->context, - frame, - frame->decl, - frame->rpointer, - frame->pointers, - va_count, - va_types); + return true; +} - 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) @@ -463,6 +479,7 @@ void psi_call_frame_do_callback(struct psi_call_frame *frame, struct psi_call_fr rc = zend_fcall_info_call(&frame_arg->ival_ptr->zend.cb->fci, &frame_arg->ival_ptr->zend.cb->fcc, &return_value, NULL); assert(rc == SUCCESS); + (void) rc; /* marshal return value of the userland call */ frame_arg->zval_ptr = &return_value; @@ -522,8 +539,6 @@ static void psi_call_frame_local_auto_dtor(void *auto_list) efree(auto_list); } -#include "php_psi.h" - void psi_call_frame_free(struct psi_call_frame *frame) { zend_hash_destroy(&frame->arguments); zend_hash_destroy(&frame->symbols); @@ -533,8 +548,7 @@ void psi_call_frame_free(struct psi_call_frame *frame) { memcpy(temp, &frame->temp, sizeof(*temp)); ZVAL_OBJ(&zlocal, psi_object_init_ex(NULL, temp, psi_call_frame_local_auto_dtor)); - zend_set_local_var_str(frame->impl->func->name, - strlen(frame->impl->func->name), &zlocal, /* force */ 1); + zend_set_local_var(frame->impl->func->name, &zlocal, /* force */ 1); } else { zend_llist_destroy(&frame->temp); }