- for (i = 0; i < C->impls->count; ++i) {
- impl *impl = C->impls->list[i];
-
- dprintf(fd, "function %s(", impl->func->name);
- if (impl->func->args) {
- for (j = 0; j < impl->func->args->count; ++j) {
- impl_arg *iarg = impl->func->args->args[j];
-
- dprintf(fd, "%s%s %s$%s",
- j ? ", " : "",
- iarg->type->name,
- iarg->var->reference ? "&" : "",
- iarg->var->name);
- if (iarg->def) {
- dprintf(fd, " = %s", iarg->def->text);
- }
- }
- if (impl->func->args->vararg.name) {
- impl_arg *vararg = impl->func->args->vararg.name;
-
- dprintf(fd, ", %s %s...$%s",
- vararg->type->name,
- vararg->var->reference ? "&" : "",
- vararg->var->name);
- }
- }
- dprintf(fd, ") : %s%s {\n",
- impl->func->return_reference ? "&":"",
- impl->func->return_type->name);
- if (impl->stmts) {
- for (j = 0; j < impl->stmts->let.count; ++j) {
- let_stmt *let = impl->stmts->let.list[j];
-
- dprintf(fd, "\tlet %s", let->var->name);
- if (let->val) {
- dprintf(fd, " = %s", let->val->flags.one.is_reference ? "&" : "");
- switch (let->val->kind) {
- case PSI_LET_NULL:
- dprintf(fd, "NULL");
- break;
- case PSI_LET_TMP:
- dump_decl_var(fd, let->val->data.var);
- break;
- case PSI_LET_CALLOC:
- dprintf(fd, "calloc(");
- dump_num_exp(fd, let->val->data.alloc->nmemb);
- dprintf(fd, ", ");
- dump_num_exp(fd, let->val->data.alloc->size);
- dprintf(fd, ")");
- break;
- case PSI_LET_FUNC:
- dprintf(fd, "%s($%s)", let->val->data.func->name,
- let->val->data.func->var->name);
- break;
- case PSI_LET_NUMEXP:
- dump_num_exp(fd, let->val->data.num);
- break;
-
- EMPTY_SWITCH_DEFAULT_CASE();
- }
- dprintf(fd, ";\n");
- }
- }
- for (j = 0; j < impl->stmts->ret.count; ++j) {
- return_stmt *ret = impl->stmts->ret.list[j];