X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fset_stmt.c;h=5d31acadb88f9612aee81b7cf625aa62cf67a0ef;hb=09529efcde471127419e141807b83b37077003a0;hp=e9f957ba2224b7ec26e3c1dba6348b3736adfde8;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84;p=m6w6%2Fext-psi diff --git a/src/types/set_stmt.c b/src/types/set_stmt.c index e9f957b..5d31aca 100644 --- a/src/types/set_stmt.c +++ b/src/types/set_stmt.c @@ -46,9 +46,7 @@ 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); } } @@ -61,44 +59,51 @@ void psi_set_stmt_dump(int fd, struct psi_set_stmt *set) } -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;