fix a bug that caused stuff to not get typechecked
This commit is contained in:
@@ -81,8 +81,8 @@ func net.read[s: i64, buffer: ptr, size: i64] : i64
|
||||
func net.close[s: i64] : void
|
||||
_builtin_syscall(SYS_close, s)
|
||||
|
||||
func net.pack_addr[a: u8, b: u8, c: u8, d: u8] : i64
|
||||
return (a as i64 << 24) | (b << 16) | (c << 8) | d
|
||||
func net.pack_addr[a: i64, b: i64, c: i64, d: i64] : i64
|
||||
return (a << 24) | (b << 16) | (c << 8) | d
|
||||
|
||||
struct net.UDPSocket
|
||||
fd: i64
|
||||
@@ -201,7 +201,7 @@ func net.resolve?[domain: str] : i64
|
||||
let query: io.Buffer = net.build_dns_query(domain, DNS_TYPE_A)
|
||||
|
||||
// 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()
|
||||
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)
|
||||
|
||||
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)
|
||||
return out
|
||||
|
||||
@@ -103,7 +103,7 @@ func mem.alloc?[size: i64] : any
|
||||
if cur->free && cur->size >= size
|
||||
mem._split_block(cur, size)
|
||||
cur->free = false
|
||||
return cur + MEM_BLOCK_SIZE
|
||||
return cur as ptr + MEM_BLOCK_SIZE
|
||||
cur = cur->next
|
||||
|
||||
let blk: mem.Block = mem._request_space?(size)
|
||||
@@ -115,7 +115,7 @@ func mem.alloc?[size: i64] : any
|
||||
|
||||
mem._split_block(blk, size)
|
||||
|
||||
return blk + MEM_BLOCK_SIZE
|
||||
return blk as ptr + MEM_BLOCK_SIZE
|
||||
|
||||
func mem.alloc[size: i64] : any
|
||||
return must(mem.alloc?(size))
|
||||
@@ -335,7 +335,7 @@ func io.read_line[]: str
|
||||
if n < 0
|
||||
n = 0
|
||||
buffer[n] = 0
|
||||
buffer = must(mem.realloc?(buffer, n + 1))
|
||||
buffer = must(mem.realloc?(buffer as ptr, n + 1))
|
||||
return buffer
|
||||
|
||||
struct io.Buffer
|
||||
@@ -1001,7 +1001,7 @@ func os.list_directory?[path: str] : Array
|
||||
if name[2] == 0
|
||||
skip = true
|
||||
if !skip
|
||||
array.push(files, str.make_copy(name))
|
||||
array.push(files, str.make_copy(name as str))
|
||||
pos = pos + len
|
||||
|
||||
mem.free(buf)
|
||||
|
||||
@@ -7,14 +7,15 @@ use crate::{
|
||||
};
|
||||
|
||||
macro_rules! expect_type {
|
||||
($expr_type:expr, $expected:expr, $loc:expr) => {
|
||||
if $expected != "any" && $expr_type != "any" && $expr_type != $expected {
|
||||
($expr_type:expr, $expected:expr, $loc:expr) => {{
|
||||
let actual = $expr_type;
|
||||
if $expected != "any" && actual != "any" && actual != $expected {
|
||||
return error!(
|
||||
$loc,
|
||||
format!("expected type '{}', got '{}'", $expected, $expr_type)
|
||||
format!("expected type '{}', got '{}'", $expected, actual)
|
||||
);
|
||||
}
|
||||
};
|
||||
}};
|
||||
}
|
||||
|
||||
macro_rules! expect_types {
|
||||
@@ -98,7 +99,7 @@ impl TypeChecker {
|
||||
"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" {
|
||||
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,
|
||||
@@ -297,7 +298,7 @@ impl TypeChecker {
|
||||
} => {
|
||||
expect_types!(self.typecheck_expr(env, expr)?, ["ptr", "str"], 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 } => {
|
||||
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"),
|
||||
}
|
||||
@@ -343,11 +344,16 @@ impl TypeChecker {
|
||||
{
|
||||
let fn_type =
|
||||
&self.analyzer.borrow().functions[&callee_name.lexeme].clone();
|
||||
// its a function (defined/builtin/extern)
|
||||
if let Some(params) = fn_type.params.clone() {
|
||||
// its a function (defined/builtin/extern)
|
||||
for (i, arg) in args.iter().enumerate() {
|
||||
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())
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user