diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-05-12 15:56:24 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-05-12 15:56:24 -0400 |
| commit | 3481042259c1db4d9fb4e50d5e91e8c58e8cdac5 (patch) | |
| tree | fa3a470a0ac5cce72bb9380c64495c00fa4da179 /interfaces.c | |
| parent | f6f89265b7eb73bd9a036133033e4fd654196b50 (diff) | |
Simplify interfaces by requiring all functions are pointer methods
Diffstat (limited to 'interfaces.c')
| -rw-r--r-- | interfaces.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/interfaces.c b/interfaces.c index db587cba..6406a9ce 100644 --- a/interfaces.c +++ b/interfaces.c @@ -63,14 +63,17 @@ void compile_interface_def(env_t *env, ast_t *ast) CORD_appendf(&env->code->typedefs, "#define %r(...) ((%r_t){__VA_ARGS__})\n", full_name, full_name); CORD_appendf(&env->code->typecode, "struct %r_s {\nvoid *$obj;\n", full_name); - type_ast_t *replacement_type_ast = NewTypeAST(ast->file, ast->start, ast->end, VarTypeAST, .name=def->name); for (arg_ast_t *field = def->fields; field; field = field->next) { - type_ast_t *field_type = replace_type_ast(field->type, def->type_parameter, replacement_type_ast); - type_t *field_t = parse_type_ast(env, field_type); - if (field_t->tag == ClosureType) + type_t *field_t = parse_type_ast(env, field->type); + if (field_t->tag == ClosureType) { field_t = Match(field_t, ClosureType)->fn; - if (field_t->tag != FunctionType) + // Convert to method: + field_t = Type(FunctionType, .args=new(arg_t, .name="$obj", .type=Type(PointerType, .pointed=Type(MemoryType)), + .next=Match(field_t, FunctionType)->args), + .ret=Match(field_t, FunctionType)->ret); + } else { field_t = Type(PointerType, .pointed=field_t); + } CORD decl = compile_declaration(env, field_t, field->name); CORD_appendf(&env->code->typecode, "%r%s;\n", decl, field_t->tag == BoolType ? ":1" : ""); |
