Guard against calling interfaces with values

This commit is contained in:
Bruce Hill 2024-05-12 15:48:52 -04:00
parent 4dbe046866
commit f6f89265b7

View File

@ -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, "); })");
}
}