X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fdecl_var.c;h=86aa33be32bf8b726e138cc1ed371d3f18a48db2;hb=698841dfdd4d70d24e0b7af25ac7100bc2cb26a4;hp=236ccfc843f7c9af5abd267e7334dc649a19142f;hpb=b78637d9020222f1032349f231c0dc84a69797bc;p=m6w6%2Fext-psi diff --git a/src/types/decl_var.c b/src/types/decl_var.c index 236ccfc..86aa33b 100644 --- a/src/types/decl_var.c +++ b/src/types/decl_var.c @@ -23,18 +23,24 @@ 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)); + struct psi_decl_var *v = pecalloc(1, sizeof(*v), 1); if (name) { - v->name = strdup(name); - v->fqn = strdup(name); + v->name = zend_string_copy(name); + v->fqn = zend_string_copy(name); } v->pointer_level = pl; v->array_size = as; @@ -43,13 +49,13 @@ 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; if (dest->name) { - dest->name = strdup(dest->name); - dest->fqn = strdup(dest->fqn); + dest->name = zend_string_copy(dest->name); + dest->fqn = zend_string_copy(dest->fqn); } if (dest->token) { @@ -64,40 +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) { - free(var->name); - free(var->fqn); + zend_string_release(var->name); + zend_string_release(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 ? 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_impl *impl, 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 (dvar->arg) { - return true; - } + if (scope && scope->current_let) { + struct psi_let_exp *current_let_exp = scope->current_let; - if (current_let_exp) { /* 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; @@ -109,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( @@ -130,21 +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 (!okay && impl && psi_impl_get_decl_arg(impl, dvar)) { + if (!okay && scope && scope->impl && psi_impl_get_decl_arg(scope->impl, dvar)) { okay = true; } - if (!okay && decl && psi_decl_get_arg(decl, dvar)) { + if (!okay && scope && scope->cb_decl && psi_decl_get_arg(scope->cb_decl, dvar)) { okay = true; }