X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fimpl.c;h=e987147ac9848a2971234b6f631bb34e14707dcf;hp=e679f1f2add7ae8fa49135a5dc697f837aa26e97;hb=c9384515a81cb64d345b299908b2852f51bb8e6e;hpb=f15288e185e65bcdfde87c217fb6bd7ff12eb653 diff --git a/src/types/impl.c b/src/types/impl.c index e679f1f..e987147 100644 --- a/src/types/impl.c +++ b/src/types/impl.c @@ -116,24 +116,27 @@ void psi_impl_dump(int fd, struct psi_impl *impl) dprintf(fd, "}\n"); } -bool psi_impl_validate(struct psi_data *data, struct psi_impl *impl) +bool psi_impl_validate(struct psi_data *data, struct psi_impl *impl, + struct psi_validate_scope *scope) { - if (!psi_impl_func_validate(data, impl->func)) { + scope->impl = impl; + + if (!psi_impl_func_validate(data, impl->func, scope)) { return false; } - if (!psi_return_stmt_validate(data, impl)) { + if (!psi_return_stmt_validate(data, scope)) { return false; } - if (!psi_let_stmts_validate(data, impl)) { + if (!psi_let_stmts_validate(data, scope)) { return false; } - if (!psi_set_stmts_validate(data, impl)) { + if (!psi_set_stmts_validate(data, scope)) { return false; } - if (!psi_assert_stmts_validate(data, impl)) { + if (!psi_assert_stmts_validate(data, scope)) { return false; } - if (!psi_free_stmts_validate(data, impl)) { + if (!psi_free_stmts_validate(data, scope)) { return false; } return true; @@ -176,6 +179,27 @@ void psi_impl_stmt_free(struct psi_token ***abstract_stmt) } } +struct psi_decl_arg *psi_impl_get_decl_arg(struct psi_impl *impl, + struct psi_decl_var *var) +{ + struct psi_return_stmt *ret; + + if (psi_plist_get(impl->stmts.ret, 0, &ret)) { + if (ret->exp->args) { + size_t i = 0; + struct psi_decl_var *arg; + + while (psi_plist_get(ret->exp->args, i++, &arg)) { + if (!strcmp(var->name, arg->name)) { + return var->arg = arg->arg; + } + } + } + } + + return psi_decl_get_arg(impl->decl, var); +} + struct psi_let_stmt *psi_impl_get_let(struct psi_impl *impl, struct psi_decl_var* var) {