properly handling generic method calls

Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
This commit is contained in:
Jakub Doka 2024-12-25 21:29:30 +01:00
parent 51bfbdf7ae
commit 3f11e19a91
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
4 changed files with 38 additions and 11 deletions

View file

@ -42,9 +42,6 @@ extern crate alloc;
#[cfg(any(feature = "std", test))]
extern crate std;
#[cfg(test)]
const README: &str = include_str!("../README.md");
#[cfg(test)]
#[macro_export]
macro_rules! run_tests {

View file

@ -4,12 +4,11 @@ use {
debug,
lexer::{self, TokenKind},
parser::Pos,
ty::{self, Loc, Offset, Types},
ty::{self, Loc, Types},
utils::{BitSet, Vc},
},
alloc::{string::String, vec::Vec},
core::{
assert_matches::debug_assert_matches,
cell::Cell,
fmt::{self, Debug, Write},
mem,

View file

@ -28,7 +28,7 @@ use {
assert_matches::debug_assert_matches,
cell::RefCell,
fmt::{self, Debug, Display, Write},
format_args as fa, mem,
format_args as fa, mem, usize,
},
hbbytecode::DisasmError,
};
@ -2602,7 +2602,7 @@ impl<'a> Codegen<'a> {
if let Some((_, f)) = self.tys.find_union_field(u, name) {
Some(Value::ptr(vtarget.id).ty(f.ty))
} else if let ty = self.find_type(pos, self.ci.file, u, name)
&& let ty::Kind::Func(_) = ty.expand()
&& let ty::Kind::Func(_) | ty::Kind::Template(_) = ty.expand()
{
return Some(Err((ty, vtarget)));
} else {
@ -2626,7 +2626,7 @@ impl<'a> Codegen<'a> {
if let Some((offset, ty)) = OffsetIter::offset_of(self.tys, s, name) {
Some(Value::ptr(self.offset(vtarget.id, offset)).ty(ty))
} else if let ty = self.find_type(pos, self.ci.file, s, name)
&& let ty::Kind::Func(_) = ty.expand()
&& let ty::Kind::Func(_) | ty::Kind::Template(_) = ty.expand()
{
return Some(Err((ty, vtarget)));
} else {
@ -2788,7 +2788,7 @@ impl<'a> Codegen<'a> {
ref e => (self.ty(e), None),
};
let Some(fu) = self.compute_signature(ty, func.pos(), args) else {
let Some(fu) = self.compute_signature(ty, func.pos(), args, caller.is_some()) else {
return Value::NEVER;
};
@ -3170,7 +3170,13 @@ impl<'a> Codegen<'a> {
}
}
fn compute_signature(&mut self, func: ty::Id, pos: Pos, args: &[Expr]) -> Option<ty::Func> {
fn compute_signature(
&mut self,
func: ty::Id,
pos: Pos,
args: &[Expr],
implici_caller: bool,
) -> Option<ty::Func> {
let template = match func.expand() {
ty::Kind::Func(f) => return Some(f),
ty::Kind::Template(t) => t,
@ -3191,7 +3197,11 @@ impl<'a> Codegen<'a> {
let arg_base = self.tys.tmp.args.len();
let base = self.ci.scope.vars.len();
for (arg, carg) in args.iter().zip(cargs) {
if implici_caller {
let caller = self.ty_in(file, parent, &cargs[0].ty);
self.tys.tmp.args.push(caller);
}
for (arg, carg) in args.iter().zip(cargs.iter().skip(implici_caller as usize)) {
let ty = self.ty_in(file, parent, &carg.ty);
self.tys.tmp.args.push(ty);

View file

@ -0,0 +1,21 @@
b:
CP r13, r3
CP r1, r13
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -32d
ST r31, r254, 8a, 24h
ADDI64 r32, r254, 0d
LI64 r33, 100d
ST r33, r254, 0a, 8h
CP r2, r32
CP r3, r33
JAL r31, r0, :b
CP r32, r1
CP r1, r32
LD r31, r254, 8a, 24h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
code size: 137
ret: 100
status: Ok(())