X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Ffree_exp.c;h=115da914a181c39a0a4a28e2c16e0fab29172b1d;hp=19c7a60abf60e499d146168de2265e57008e2aba;hb=09529efcde471127419e141807b83b37077003a0;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84 diff --git a/src/types/free_exp.c b/src/types/free_exp.c index 19c7a60..115da91 100644 --- a/src/types/free_exp.c +++ b/src/types/free_exp.c @@ -27,10 +27,10 @@ #include "data.h" #include "call.h" -struct psi_free_exp *psi_free_exp_init(const char *func, struct psi_plist *vars) +struct psi_free_exp *psi_free_exp_init(zend_string *func, struct psi_plist *vars) { struct psi_free_exp *f = calloc(1, sizeof(*f)); - f->func = strdup(func); + f->func = zend_string_copy(func); f->vars = vars; return f; } @@ -41,10 +41,8 @@ void psi_free_exp_free(struct psi_free_exp **f_ptr) struct psi_free_exp *f = *f_ptr; *f_ptr = NULL; - if (f->token) { - free(f->token); - } - free(f->func); + psi_token_free(&f->token); + zend_string_release(f->func); psi_plist_free(f->vars); if (f->let) { free(f->let); @@ -58,7 +56,7 @@ void psi_free_exp_dump(int fd, struct psi_free_exp *call) size_t l = 0, c = psi_plist_count(call->vars); struct psi_decl_var *fvar; - dprintf(fd, "%s(", call->func); + dprintf(fd, "%s(", call->func->val); while (psi_plist_get(call->vars, l++, &fvar)) { psi_decl_var_dump(fd, fvar); if (l < c) { @@ -76,7 +74,7 @@ static inline struct psi_decl *locate_free_decl(struct psi_plist *decls, struct psi_decl *decl; while (psi_plist_get(decls, i++, &decl)) { - if (!strcmp(decl->func->var->name, f->func)) { + if (zend_string_equals(decl->func->var->name, f->func)) { return f->decl = decl; } } @@ -86,7 +84,7 @@ static inline struct psi_decl *locate_free_decl(struct psi_plist *decls, } bool psi_free_exp_validate(struct psi_data *data, struct psi_free_exp *exp, - struct psi_impl *impl) + struct psi_validate_scope *scope) { size_t i; struct psi_decl_var *free_var; @@ -95,23 +93,23 @@ bool psi_free_exp_validate(struct psi_data *data, struct psi_free_exp *exp, if (!locate_free_decl(data->decls, exp)) { data->error(data, exp->token, PSI_WARNING, "Missing declaration '%s' in `free` statement" - " of implementation '%s'", exp->func, impl->func->name); + " of implementation '%s'", exp->func->val, + scope->impl->func->name->val); return false; } /* now check for known vars */ exp->let = calloc(psi_plist_count(exp->vars), sizeof(*exp->let)); for (i = 0; psi_plist_get(exp->vars, i, &free_var); ++i) { - if (!psi_decl_arg_get_by_var(free_var, impl->decl->args, - impl->decl->func)) { + if (!psi_impl_get_decl_arg(scope->impl, free_var)) { data->error(data, free_var->token, PSI_WARNING, "Unknown variable '%s' of `free` statement" " of implementation '%s'", - free_var->name, impl->func->name); + free_var->name->val, scope->impl->func->name->val); return false; } - exp->let[i] = psi_impl_get_let(impl, free_var); + exp->let[i] = psi_impl_get_let(scope->impl, free_var); assert(exp->let[i]); } @@ -124,8 +122,9 @@ void psi_free_exp_exec(struct psi_free_exp *f, struct psi_call_frame *frame) void **args; struct psi_decl_var *dvar; struct psi_call_frame *free_call; + struct psi_context *ctx = psi_call_frame_get_context(frame); - free_call = psi_call_frame_init(frame->context, f->decl, NULL); + free_call = psi_call_frame_init(ctx, f->decl, NULL); psi_call_frame_enter(free_call); args = psi_call_frame_get_arg_pointers(free_call);