diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-05-12 15:48:52 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-05-12 15:48:52 -0400 |
| commit | f6f89265b7eb73bd9a036133033e4fd654196b50 (patch) | |
| tree | 602f3a4c42330eb0a2f731b0aa7f951684bd2ace | |
| parent | 4dbe046866a6280cf304c7e0ec6471d872bc8e27 (diff) | |
Guard against calling interfaces with values
| -rw-r--r-- | compile.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -1662,10 +1662,11 @@ CORD compile(env_t *env, ast_t *ast) arg_t *type_args = Match(field_t, FunctionType)->args; CORD args = compile_arguments(env, ast, type_args->next, methodcall->args); - bool is_ptr = Match(field_t, FunctionType)->args->type->tag == PointerType; + if (Match(field_t, FunctionType)->args->type->tag != PointerType) + code_err(ast, "Interface methods that take value types can't be called"); return CORD_all("({ ", compile_type(env, self_value_t), " $self = ", compile_to_pointer_depth(env, methodcall->self, 0, false), "; ", - "$self.", methodcall->name, "(", is_ptr ? CORD_EMPTY : "*", "(", compile_type(env, self_value_t), "*)$self.$obj", + "$self.", methodcall->name, "($self.$obj", args == CORD_EMPTY ? CORD_EMPTY : ", ", args, "); })"); } } |
