X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Flet_stmt.c;h=77375e881b85a13cedb93e10f32f95c60824894a;hb=4bf8ff5e477da2fa4f82518bb947055c2c0374d6;hp=09844578da4d5f698d5e05f054d4c46ed8b5a64b;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84;p=m6w6%2Fext-psi diff --git a/src/types/let_stmt.c b/src/types/let_stmt.c index 0984457..77375e8 100644 --- a/src/types/let_stmt.c +++ b/src/types/let_stmt.c @@ -23,12 +23,16 @@ 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" struct psi_let_stmt *psi_let_stmt_init(struct psi_let_exp *exp) { - struct psi_let_stmt *let = calloc(1, sizeof(*let)); + struct psi_let_stmt *let = pecalloc(1, sizeof(*let), 1); let->exp = exp; return let; @@ -43,28 +47,26 @@ void psi_let_stmt_free(struct psi_let_stmt **stmt_ptr) if (stmt->exp) { psi_let_exp_free(&stmt->exp); } - if (stmt->token) { - free(stmt->token); - } + psi_token_free(&stmt->token); free(stmt); } } -void psi_let_stmt_dump(int fd, struct psi_let_stmt *let) +void psi_let_stmt_dump(struct psi_dump *dump, struct psi_let_stmt *let) { - dprintf(fd, "\t%s ", let->exp->kind == PSI_LET_TMP ? "temp" : "let"); - psi_let_exp_dump(fd, let->exp, 1, 1); - dprintf(fd, "\n"); + PSI_DUMP(dump, "\t%s ", let->exp->kind == PSI_LET_TMP ? "temp" : "let"); + psi_let_exp_dump(dump, let->exp, 1, 1); + PSI_DUMP(dump, "\n"); } -bool psi_let_stmts_validate(struct psi_data *data, struct psi_impl *impl) +bool psi_let_stmts_validate(struct psi_data *data, struct psi_validate_scope *scope) { size_t i = 0; struct psi_let_stmt *let; /* we can have multiple let stmts */ /* check that we have a decl arg and impl arg for every let stmt */ - while (psi_plist_get(impl->stmts.let, i++, &let)) { + while (psi_plist_get(scope->impl->stmts.let, i++, &let)) { struct psi_decl_var *let_var; struct psi_impl_var *let_ivar = NULL; @@ -77,14 +79,14 @@ bool psi_let_stmts_validate(struct psi_data *data, struct psi_impl *impl) if (!let->exp->var) { data->error(data, let->token, PSI_WARNING, "Missing variable in `let` statement for implementation %s", - impl->func->name); + scope->impl->func->name->val); return false; } - if (!psi_decl_get_arg(impl->decl, let_var)) { + if (!psi_impl_get_decl_arg(scope->impl, let_var)) { data->error(data, let_var->token, PSI_WARNING, "Unknown variable '%s' in `let` statement of implementation '%s'", - let_var->name, impl->func->name); + let_var->name->val, scope->impl->func->name->val); return false; } switch (let->exp->kind) { @@ -97,30 +99,34 @@ bool psi_let_stmts_validate(struct psi_data *data, struct psi_impl *impl) default: break; } - if (let_ivar && !psi_impl_get_arg(impl, let_ivar)) { + if (let_ivar && !psi_impl_get_arg(scope->impl, let_ivar)) { data->error(data, let_var->token, PSI_WARNING, "Unknown variable '%s' in `let` statement of implementation '%s'", - let_ivar->name, impl->func->name); + let_ivar->name->val, scope->impl->func->name->val); return false; } - if (!psi_let_exp_validate(data, let->exp, impl)) { + scope->current_let = let->exp; + if (!psi_let_exp_validate(data, let->exp, scope)) { + scope->current_let = NULL; return false; } + scope->current_let = NULL; } /* check that we have a let stmt for every decl arg */ - if (impl->decl->args) { + if (scope->impl->decl->args) { struct psi_decl_arg *darg; - for (i = 0; psi_plist_get(impl->decl->args, i, &darg); ++i) { - if (!psi_impl_get_let(impl, darg->var)) { - data->error(data, impl->func->token, PSI_WARNING, + for (i = 0; psi_plist_get(scope->impl->decl->args, i, &darg); ++i) { + if (!psi_impl_get_let(scope->impl, darg->var)) { + data->error(data, scope->impl->func->token, PSI_WARNING, "Missing `let` statement for arg '%s %s%s'" " of declaration '%s' for implementation '%s'", - darg->type->name, + darg->type->name->val, psi_t_indirection(darg->var->pointer_level), - darg->var->name, impl->decl->func->var->name, - impl->func->name); + darg->var->name->val, + scope->impl->decl->func->var->name->val, + scope->impl->func->name->val); return false; } }