X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fset_stmt.c;h=fca25197b381a332b6a2a6190a4ddbe08c0d284b;hp=e9f957ba2224b7ec26e3c1dba6348b3736adfde8;hb=a0f437f26cd0f121ee911a55327a68a3544bf15f;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84 diff --git a/src/types/set_stmt.c b/src/types/set_stmt.c index e9f957b..fca2519 100644 --- a/src/types/set_stmt.c +++ b/src/types/set_stmt.c @@ -29,7 +29,7 @@ struct psi_set_stmt *psi_set_stmt_init(struct psi_set_exp *exp) { - struct psi_set_stmt *set = calloc(1, sizeof(*set)); + struct psi_set_stmt *set = pecalloc(1, sizeof(*set), 1); set->exp = exp; return set; } @@ -46,59 +46,64 @@ void psi_set_stmt_free(struct psi_set_stmt **set_ptr) *set_ptr = NULL; psi_set_exp_free(&set->exp); - if (set->token) { - free(set->token); - } + psi_token_free(&set->token); free(set); } } -void psi_set_stmt_dump(int fd, struct psi_set_stmt *set) +void psi_set_stmt_dump(struct psi_dump *dump, struct psi_set_stmt *set) { - dprintf(fd, "\tset "); - psi_set_exp_dump(fd, set->exp, 1, 1); - dprintf(fd, ";\n"); + PSI_DUMP(dump, "\tset "); + psi_set_exp_dump(dump, set->exp, 1, 1); + PSI_DUMP(dump, ";\n"); } -bool psi_set_stmts_validate(struct psi_data *data, struct psi_impl *impl) +bool psi_set_stmts_validate(struct psi_data *data, struct psi_validate_scope *scope) { size_t i = 0; struct psi_set_stmt *set; /* we can have any count of set stmts; processing out vars */ /* check that set stmts reference known variables */ - while (psi_plist_get(impl->stmts.set, i++, &set)) { + while (psi_plist_get(scope->impl->stmts.set, i++, &set)) { if (!set->exp->var) { data->error(data, set->token, PSI_WARNING, "Missing variable of `set` statement of implementation '%s'", - impl->func->name); + scope->impl->func->name->val); return false; } - if (!psi_impl_get_arg(impl, set->exp->var)) { + if (!psi_impl_get_arg(scope->impl, set->exp->var)) { data->error(data, set->token, PSI_WARNING, "Unknown variable '%s' of `set` statement of implementation '%s'", - set->exp->var->name, impl->func->name); + set->exp->var->name->val, scope->impl->func->name->val); return false; } + scope->current_set = set->exp; + switch (set->exp->kind) { case PSI_SET_NUMEXP: break; case PSI_SET_FUNC: - if (!psi_decl_get_arg(impl->decl, set->exp->data.func->var)) { - if (!psi_impl_get_temp_let_arg(impl, set->exp->data.func->var)) { + if (!psi_impl_get_decl_arg(scope->impl, set->exp->data.func->var)) { + if (!psi_impl_get_temp_let_arg(scope->impl, set->exp->data.func->var)) { data->error(data, set->token, PSI_WARNING, "Unknown variable '%s' of `set` statement of implementation '%s'", - set->exp->data.func->var, impl->func->name); + set->exp->data.func->var->name->val, scope->impl->func->name->val); + scope->current_set = NULL; return false; } } } + /* validate the expression itself */ - if (!psi_set_exp_validate(data, set->exp, impl, NULL)) { + if (!psi_set_exp_validate(data, set->exp, scope)) { + scope->current_set = NULL; return false; } + + scope->current_set = NULL; } return true;