fix a bug that caused stuff to not get typechecked

This commit is contained in:
2026-03-17 17:34:49 +01:00
parent 4154901339
commit 3efb3820bc
3 changed files with 23 additions and 17 deletions

View File

@@ -81,8 +81,8 @@ func net.read[s: i64, buffer: ptr, size: i64] : i64
func net.close[s: i64] : void func net.close[s: i64] : void
_builtin_syscall(SYS_close, s) _builtin_syscall(SYS_close, s)
func net.pack_addr[a: u8, b: u8, c: u8, d: u8] : i64 func net.pack_addr[a: i64, b: i64, c: i64, d: i64] : i64
return (a as i64 << 24) | (b << 16) | (c << 8) | d return (a << 24) | (b << 16) | (c << 8) | d
struct net.UDPSocket struct net.UDPSocket
fd: i64 fd: i64
@@ -201,7 +201,7 @@ func net.resolve?[domain: str] : i64
let query: io.Buffer = net.build_dns_query(domain, DNS_TYPE_A) let query: io.Buffer = net.build_dns_query(domain, DNS_TYPE_A)
// TODO: this probably shouldnt be hardcoded // TODO: this probably shouldnt be hardcoded
let s: net.UDPSocket = net.create_udp_client?(net.pack_addr(8 as u8, 8 as u8, 8 as u8, 8 as u8), 53) let s: net.UDPSocket = net.create_udp_client?(net.pack_addr(8, 8, 8, 8), 53)
if err.check() if err.check()
return -1 return -1
@@ -221,6 +221,6 @@ func net.resolve?[domain: str] : i64
pos = pos + 12 // skip name(2), type(2), class(2), ttl(4), rdlength(2) pos = pos + 12 // skip name(2), type(2), class(2), ttl(4), rdlength(2)
let out: i64 = net.pack_addr(pkt->data[pos], pkt->data[pos+1], pkt->data[pos+2], pkt->data[pos+3]) let out: i64 = net.pack_addr(pkt->data[pos] as i64, pkt->data[pos+1] as i64, pkt->data[pos+2] as i64, pkt->data[pos+3] as i64)
net.UDPPacket.free(pkt) net.UDPPacket.free(pkt)
return out return out

View File

@@ -103,7 +103,7 @@ func mem.alloc?[size: i64] : any
if cur->free && cur->size >= size if cur->free && cur->size >= size
mem._split_block(cur, size) mem._split_block(cur, size)
cur->free = false cur->free = false
return cur + MEM_BLOCK_SIZE return cur as ptr + MEM_BLOCK_SIZE
cur = cur->next cur = cur->next
let blk: mem.Block = mem._request_space?(size) let blk: mem.Block = mem._request_space?(size)
@@ -115,7 +115,7 @@ func mem.alloc?[size: i64] : any
mem._split_block(blk, size) mem._split_block(blk, size)
return blk + MEM_BLOCK_SIZE return blk as ptr + MEM_BLOCK_SIZE
func mem.alloc[size: i64] : any func mem.alloc[size: i64] : any
return must(mem.alloc?(size)) return must(mem.alloc?(size))
@@ -335,7 +335,7 @@ func io.read_line[]: str
if n < 0 if n < 0
n = 0 n = 0
buffer[n] = 0 buffer[n] = 0
buffer = must(mem.realloc?(buffer, n + 1)) buffer = must(mem.realloc?(buffer as ptr, n + 1))
return buffer return buffer
struct io.Buffer struct io.Buffer
@@ -1001,7 +1001,7 @@ func os.list_directory?[path: str] : Array
if name[2] == 0 if name[2] == 0
skip = true skip = true
if !skip if !skip
array.push(files, str.make_copy(name)) array.push(files, str.make_copy(name as str))
pos = pos + len pos = pos + len
mem.free(buf) mem.free(buf)

View File

@@ -7,14 +7,15 @@ use crate::{
}; };
macro_rules! expect_type { macro_rules! expect_type {
($expr_type:expr, $expected:expr, $loc:expr) => { ($expr_type:expr, $expected:expr, $loc:expr) => {{
if $expected != "any" && $expr_type != "any" && $expr_type != $expected { let actual = $expr_type;
if $expected != "any" && actual != "any" && actual != $expected {
return error!( return error!(
$loc, $loc,
format!("expected type '{}', got '{}'", $expected, $expr_type) format!("expected type '{}', got '{}'", $expected, actual)
); );
} }
}; }};
} }
macro_rules! expect_types { macro_rules! expect_types {
@@ -98,7 +99,7 @@ impl TypeChecker {
"unrecognized type: ".to_owned() + &var_type.lexeme "unrecognized type: ".to_owned() + &var_type.lexeme
); );
} }
expect_type!(actual_type, var_type.lexeme, var_type.loc); expect_type!(actual_type.clone(), var_type.lexeme, var_type.loc);
if actual_type == "any" { if actual_type == "any" {
actual_type = var_type.lexeme.clone(); actual_type = var_type.lexeme.clone();
@@ -288,7 +289,7 @@ impl TypeChecker {
); );
} }
}; };
expect_type!(value_type, *existing_var_type, name.loc); expect_type!(value_type.clone(), *existing_var_type, name.loc);
} }
Expr::Index { Expr::Index {
expr, expr,
@@ -297,7 +298,7 @@ impl TypeChecker {
} => { } => {
expect_types!(self.typecheck_expr(env, expr)?, ["ptr", "str"], bracket.loc); expect_types!(self.typecheck_expr(env, expr)?, ["ptr", "str"], bracket.loc);
expect_types!(self.typecheck_expr(env, index)?, ["i64", "u8"], bracket.loc); expect_types!(self.typecheck_expr(env, index)?, ["i64", "u8"], bracket.loc);
expect_types!(value_type, ["u8", "i64"], bracket.loc); expect_types!(value_type.clone(), ["u8", "i64"], bracket.loc);
} }
Expr::MemberAccess { left, field } => { Expr::MemberAccess { left, field } => {
let left_type = self.typecheck_expr(env, left)?; let left_type = self.typecheck_expr(env, left)?;
@@ -323,7 +324,7 @@ impl TypeChecker {
} }
}; };
expect_type!(value_type, f.field_type, field.loc); expect_type!(value_type.clone(), f.field_type, field.loc);
} }
_ => return error!(&op.loc, "invalid assignment target"), _ => return error!(&op.loc, "invalid assignment target"),
} }
@@ -343,11 +344,16 @@ impl TypeChecker {
{ {
let fn_type = let fn_type =
&self.analyzer.borrow().functions[&callee_name.lexeme].clone(); &self.analyzer.borrow().functions[&callee_name.lexeme].clone();
if let Some(params) = fn_type.params.clone() {
// its a function (defined/builtin/extern) // its a function (defined/builtin/extern)
if let Some(params) = fn_type.params.clone() {
for (i, arg) in args.iter().enumerate() { for (i, arg) in args.iter().enumerate() {
expect_type!(self.typecheck_expr(env, arg)?, params[i], paren.loc); expect_type!(self.typecheck_expr(env, arg)?, params[i], paren.loc);
} }
} else {
// its a variadic function, cant check arg types
for arg in args {
self.typecheck_expr(env, arg)?;
}
} }
Ok(fn_type.return_type.clone()) Ok(fn_type.return_type.clone())
} else { } else {