X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Flet_func.c;h=11e5c4278b6d29b0933a675fb59508e19194106f;hp=fdb89a06fc7ade78a509117d71805e4716546784;hb=d2e0af1718294569a84c3c15616c74e4d55ea579;hpb=c9384515a81cb64d345b299908b2852f51bb8e6e diff --git a/src/types/let_func.c b/src/types/let_func.c index fdb89a0..11e5c42 100644 --- a/src/types/let_func.c +++ b/src/types/let_func.c @@ -23,7 +23,11 @@ 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 "data.h" #include "call.h" #include "marshal.h" @@ -32,12 +36,12 @@ #include -struct psi_let_func *psi_let_func_init(token_t type, const char *name, +struct psi_let_func *psi_let_func_init(token_t type, zend_string *name, struct psi_impl_var *var) { - struct psi_let_func *func = calloc(1, sizeof(*func)); + struct psi_let_func *func = pecalloc(1, sizeof(*func), 1); func->type = type; - func->name = strdup(name); + func->name = zend_string_copy(name); func->var = var; return func; } @@ -48,11 +52,9 @@ void psi_let_func_free(struct psi_let_func **func_ptr) struct psi_let_func *func = *func_ptr; *func_ptr = NULL; - if (func->token) { - free(func->token); - } + psi_token_free(&func->token); psi_impl_var_free(&func->var); - free(func->name); + zend_string_release(func->name); if (func->inner) { psi_plist_free(func->inner); } @@ -60,25 +62,26 @@ void psi_let_func_free(struct psi_let_func **func_ptr) } } -void psi_let_func_dump(int fd, struct psi_let_func *func, unsigned level) +void psi_let_func_dump(struct psi_dump *dump, struct psi_let_func *func, unsigned level) { - dprintf(fd, "%s(%s\t/* fqn=%s */", func->name, func->var->name, func->var->fqn); + PSI_DUMP(dump, "%s(%s\t/* fqn=%s */", func->name->val, func->var->name->val, + func->var->fqn->val); if (func->inner) { size_t i = 0, count = psi_plist_count(func->inner); struct psi_let_exp *inner; - dprintf(fd, ","); + PSI_DUMP(dump, ","); ++level; while (psi_plist_get(func->inner, i++, &inner)) { - dprintf(fd, "\n"); - psi_let_exp_dump(fd, inner, level, i == count); + PSI_DUMP(dump, "\n"); + psi_let_exp_dump(dump, inner, level, i == count); } --level; - dprintf(fd, "\n"); - dprintf(fd, "%s", psi_t_indent(level)); + PSI_DUMP(dump, "\n"); + PSI_DUMP(dump, "%s", psi_t_indent(level)); } - dprintf(fd, ")"); + PSI_DUMP(dump, ")"); } static inline int validate_let_func_type(struct psi_data *data, @@ -108,7 +111,7 @@ static inline int validate_let_func_type(struct psi_data *data, default: data->error(data, func->var->token, PSI_WARNING, "Unknown `let` cast function '%s' of implementation '%s'", - func->name, scope->impl->func->name); + func->name->val, scope->impl->func->name->val); return false; } } @@ -133,13 +136,14 @@ static inline bool validate_let_func_inner(struct psi_data *data, struct psi_let_exp *inner; while (psi_plist_get(func->inner, i++, &inner)) { - const char *name = psi_let_exp_get_decl_var_name(inner); + zend_string *name = psi_let_exp_get_decl_var_name(inner); struct psi_decl_arg *sub_arg; inner->outer = exp; if (name) { sub_arg = psi_decl_arg_get_by_name(sub_args, name); + zend_string_release(name); } if (!name || !sub_arg) { /* remove expr for portability with different struct members */ @@ -169,7 +173,7 @@ static inline bool validate_let_func_inner(struct psi_data *data, sub_var = psi_let_exp_get_impl_var(exp); sub_ref = psi_let_exp_get_impl_var(inner); - if (strcmp(sub_var->name, sub_ref->name)) { + if (!zend_string_equals(sub_var->name, sub_ref->name)) { data->error(data, sub_var->token, E_WARNING, "Inner `set` statement casts on pointers must" " reference the same variable"); @@ -186,7 +190,7 @@ static inline bool validate_let_func_inner(struct psi_data *data, "Inner let statement's values must refer to a structure or" " array type, got '%s%s' for '%s'", var_typ->name, psi_t_indirection(let_var->arg->var->pointer_level), - let_var->name); + let_var->name->val); return false; } @@ -221,7 +225,7 @@ bool psi_let_func_validate(struct psi_data *data, struct psi_let_func *func, return 1; } -void exec_let_func_arrval_inner(struct psi_let_func *func, +static void exec_let_func_arrval_inner(struct psi_let_func *func, struct psi_decl_arg *darg, struct psi_decl_arg *inner_decl_arg, struct psi_call_frame_argument *frame_arg, struct psi_let_exp *inner_let_exp, void *container, @@ -235,7 +239,7 @@ void exec_let_func_arrval_inner(struct psi_let_func *func, * we only want to set supplied data on unions */ if (!zend_symtable_str_exists(Z_ARRVAL_P(frame_arg->zval_ptr), - &inner_var->name[1], strlen(&inner_var->name[1]))) { + &inner_var->name->val[1], inner_var->name->len - 1)) { return; } } @@ -244,8 +248,8 @@ void exec_let_func_arrval_inner(struct psi_let_func *func, /* example from dm_store/dbm_fetch with arrval($string) conversion: let key = arrval($key, - dptr = strval($0), - dsize = strlen($0) + dptr = strval($0), + dsize = strlen($0) ); # --- darg = key @@ -263,7 +267,7 @@ static void *exec_let_func_arrval(struct psi_let_exp *val, struct psi_let_func *func, struct psi_decl_arg *darg, struct psi_call_frame *frame); -void exec_let_func_arrval_seq(struct psi_let_func *func, +static void exec_let_func_arrval_seq(struct psi_let_func *func, struct psi_decl_arg *darg, struct psi_call_frame_argument *frame_arg, struct psi_let_exp *inner_let_exp, void *container, @@ -305,6 +309,7 @@ void exec_let_func_arrval_seq(struct psi_let_func *func, inner_let_exp->data.func, darg, frame); } else { assert(0); + return; } sub = deref_impl_val(ptr, dvar); @@ -350,11 +355,12 @@ static void *exec_let_func_arrval(struct psi_let_exp *val, if (frame_arg->zval_ptr) { while (psi_plist_get(func->inner, i++, &inner)) { - darg_member = psi_decl_arg_get_by_name(darg_members, - psi_let_exp_get_decl_var_name(inner)); + zend_string *var_name = psi_let_exp_get_decl_var_name(inner); + darg_member = psi_decl_arg_get_by_name(darg_members, var_name); exec_let_func_arrval_inner(func, darg, darg_member, frame_arg, inner, container, frame); + zend_string_release(var_name); } } } else if (func->inner) {