X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fdecl_var.c;h=86aa33be32bf8b726e138cc1ed371d3f18a48db2;hb=698841dfdd4d70d24e0b7af25ac7100bc2cb26a4;hp=7f041274aa019309f14dbc9b889a24c02d04a90f;hpb=c9384515a81cb64d345b299908b2852f51bb8e6e;p=m6w6%2Fext-psi diff --git a/src/types/decl_var.c b/src/types/decl_var.c index 7f04127..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,27 +70,36 @@ 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_validate_scope *scope) { @@ -104,13 +119,15 @@ 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 (scope && scope->current_set) { @@ -127,13 +144,15 @@ 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); } } }