diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen/codegen_decl.c | 2 | ||||
| -rw-r--r-- | src/parser/parser_utils.c | 35 |
2 files changed, 36 insertions, 1 deletions
diff --git a/src/codegen/codegen_decl.c b/src/codegen/codegen_decl.c index 42e0ba9..2dff0dd 100644 --- a/src/codegen/codegen_decl.c +++ b/src/codegen/codegen_decl.c @@ -738,7 +738,7 @@ void emit_impl_vtables(ParserContext *ctx, FILE *out) while (m) { const char *orig = parse_original_method_name(m->func.name); - fprintf(out, ".%s = (void(*)())%s_%s_%s", orig, strct, trait, orig); + fprintf(out, ".%s = (__typeof__(((%s_VTable*)0)->%s))%s_%s_%s", orig, trait, orig, strct, trait, orig); if (m->next) { fprintf(out, ", "); diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c index 7af8d62..490ea42 100644 --- a/src/parser/parser_utils.c +++ b/src/parser/parser_utils.c @@ -663,6 +663,41 @@ void register_tuple(ParserContext *ctx, const char *sig) n->sig = xstrdup(sig); n->next = ctx->used_tuples; ctx->used_tuples = n; + + char struct_name[1024]; + sprintf(struct_name, "Tuple_%s", sig); + + ASTNode *s_def = ast_create(NODE_STRUCT); + s_def->strct.name = xstrdup(struct_name); + + char *s_sig = xstrdup(sig); + char *tok = strtok(s_sig, "_"); + ASTNode *head = NULL, *tail = NULL; + int i = 0; + while (tok) + { + ASTNode *f = ast_create(NODE_FIELD); + char fname[32]; + sprintf(fname, "v%d", i++); + f->field.name = xstrdup(fname); + f->field.type = xstrdup(tok); + + if (!head) + { + head = f; + } + else + { + tail->next = f; + } + tail = f; + + tok = strtok(NULL, "_"); + } + free(s_sig); + s_def->strct.fields = head; + + register_struct_def(ctx, struct_name, s_def); } void register_struct_def(ParserContext *ctx, const char *name, ASTNode *node) |
