X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fdecl_var.c;h=86aa33be32bf8b726e138cc1ed371d3f18a48db2;hb=698841dfdd4d70d24e0b7af25ac7100bc2cb26a4;hp=763ea1824bc29683efa346d2a9ac32cf6e03d5ab;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84;p=m6w6%2Fext-psi diff --git a/src/types/decl_var.c b/src/types/decl_var.c index 763ea18..86aa33b 100644 --- a/src/types/decl_var.c +++ b/src/types/decl_var.c @@ -23,17 +23,25 @@ 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 -struct psi_decl_var *psi_decl_var_init(const char *name, unsigned pl, +#include + +struct psi_decl_var *psi_decl_var_init(zend_string *name, unsigned pl, unsigned as) { - struct psi_decl_var *v = calloc(1, sizeof(*v)); - v->name = strdup(name); - v->fqn = strdup(name); + struct psi_decl_var *v = pecalloc(1, sizeof(*v), 1); + if (name) { + v->name = zend_string_copy(name); + v->fqn = zend_string_copy(name); + } v->pointer_level = pl; v->array_size = as; return v; @@ -41,11 +49,14 @@ struct psi_decl_var *psi_decl_var_init(const char *name, unsigned pl, struct psi_decl_var *psi_decl_var_copy(struct psi_decl_var *src) { - struct psi_decl_var *dest = calloc(1, sizeof(*dest)); + struct psi_decl_var *dest = pecalloc(1, sizeof(*dest), 1); *dest = *src; - dest->name = strdup(dest->name); - dest->fqn = strdup(dest->fqn); + + if (dest->name) { + dest->name = zend_string_copy(dest->name); + dest->fqn = zend_string_copy(dest->fqn); + } if (dest->token) { dest->token = psi_token_copy(dest->token); @@ -59,34 +70,44 @@ void psi_decl_var_free(struct psi_decl_var **var_ptr) struct psi_decl_var *var = *var_ptr; *var_ptr = NULL; - if (var->token) { - free(var->token); + psi_token_free(&var->token); + if (var->name) { + zend_string_release(var->name); + zend_string_release(var->fqn); } - free(var->name); - free(var->fqn); free(var); } } -void psi_decl_var_dump(int fd, struct psi_decl_var *var) +void psi_decl_var_dump(struct psi_dump *dump, struct psi_decl_var *var) { - dprintf(fd, "%s%s", + PSI_DUMP(dump, "%s%s", psi_t_indirection(var->pointer_level - !!var->array_size), - var->name); - if (var->array_size) { - dprintf(fd, "[%u]", var->array_size); + var->name ? var->name->val : "/**/"); + if (var->array_size && var->arg->type->type != PSI_T_FUNCTION) { + PSI_DUMP(dump, "[%u]", var->array_size); } } +static inline zend_string *psi_decl_var_name_prepend(zend_string *current, zend_string *prepend) { + smart_str name = {0}; + + smart_str_alloc(&name, prepend->len + 1 + current->len, 1); + smart_str_append_ex(&name, prepend, 1); + smart_str_appendc_ex(&name, '.', 1); + smart_str_append_ex(&name, current, 1); + + return smart_str_extract(&name); +} + bool psi_decl_var_validate(struct psi_data *data, struct psi_decl_var *dvar, - struct psi_decl *decl, struct psi_let_exp *let_exp, - struct psi_set_exp *set_exp) + struct psi_validate_scope *scope) { bool okay = false; - struct psi_let_exp *current_let_exp = let_exp; - struct psi_set_exp *current_set_exp = set_exp; - if (current_let_exp) { + if (scope && scope->current_let) { + struct psi_let_exp *current_let_exp = scope->current_let; + /* walk up the let expression tree until found */ while ((current_let_exp = current_let_exp->outer)) { struct psi_decl_var *svar = current_let_exp->var; @@ -98,16 +119,20 @@ bool psi_decl_var_validate(struct psi_data *data, struct psi_decl_var *dvar, if (args && psi_decl_arg_get_by_var(dvar, args, NULL)) { okay = true; - } else if (!strcmp(svar->name, dvar->name)) { + } else if (zend_string_equals(svar->name, dvar->name)) { dvar->arg = svar->arg; okay = true; } } if (okay) { + zend_string *tmp = dvar->fqn; dvar->fqn = psi_decl_var_name_prepend(dvar->fqn, svar->name); + zend_string_release(tmp); } } - } else if (current_set_exp) { + } else if (scope && scope->current_set) { + struct psi_set_exp *current_set_exp = scope->current_set; + /* walk up the set expression tree until found */ while ((current_set_exp = current_set_exp->outer)) { struct psi_decl_var *svar = psi_set_exp_get_decl_var( @@ -119,18 +144,23 @@ bool psi_decl_var_validate(struct psi_data *data, struct psi_decl_var *dvar, if (args && psi_decl_arg_get_by_var(dvar, args, NULL)) { okay = true; - } else if (!strcmp(svar->name, dvar->name)) { + } else if (zend_string_equals(svar->name, dvar->name)) { dvar->arg = svar->arg; okay = true; } } if (okay) { + zend_string *tmp = dvar->fqn; dvar->fqn = psi_decl_var_name_prepend(dvar->fqn, svar->name); + zend_string_release(tmp); } } } - if (decl && !okay && psi_decl_get_arg(decl, dvar)) { + if (!okay && scope && scope->impl && psi_impl_get_decl_arg(scope->impl, dvar)) { + okay = true; + } + if (!okay && scope && scope->cb_decl && psi_decl_get_arg(scope->cb_decl, dvar)) { okay = true; }