checker: check C args
parent
754a6cc93e
commit
e3687dc257
|
@ -311,18 +311,20 @@ fn (a mut array) push(val voidptr) {
|
|||
|
||||
// `val` is array.data
|
||||
// TODO make private, right now it's used by strings.Builder
|
||||
pub fn (a mut array) push_many(val voidptr, size int) {
|
||||
// handle `arr << arr`
|
||||
if a.data == val {
|
||||
copy := a.clone()
|
||||
a.ensure_cap(a.len + size)
|
||||
pub fn (a3 mut array) push_many(val voidptr, size int) {
|
||||
if a3.data == val {
|
||||
// handle `arr << arr`
|
||||
copy := a3.clone()
|
||||
a3.ensure_cap(a3.len + size)
|
||||
C.printf("%d", a3.len*2)
|
||||
println(a3.len*2)
|
||||
//C.memcpy(a.data, copy.data, copy.element_size * copy.len)
|
||||
C.memcpy(a.data + a.element_size * a.len, copy.data, a.element_size * size)
|
||||
C.memcpy(a3.data + a3.element_size * a3.len, copy.data, a3.element_size * size)
|
||||
} else {
|
||||
a.ensure_cap(a.len + size)
|
||||
C.memcpy(a.data + a.element_size * a.len, val, a.element_size * size)
|
||||
a3.ensure_cap(a3.len + size)
|
||||
C.memcpy(a3.data + a3.element_size * a3.len, val, a3.element_size * size)
|
||||
}
|
||||
a.len += size
|
||||
a3.len += size
|
||||
}
|
||||
|
||||
// array.reverse returns a new array with the elements of
|
||||
|
|
|
@ -207,6 +207,9 @@ pub fn (c mut Checker) call_expr(call_expr mut ast.CallExpr) table.Type {
|
|||
c.error('unknown fn: $fn_name', call_expr.pos)
|
||||
}
|
||||
if f.is_c || call_expr.is_c {
|
||||
for expr in call_expr.args {
|
||||
c.expr(expr)
|
||||
}
|
||||
return f.return_type
|
||||
}
|
||||
if call_expr.args.len < f.args.len {
|
||||
|
@ -303,6 +306,7 @@ pub fn (c mut Checker) method_call_expr(method_call_expr mut ast.MethodCallExpr)
|
|||
pub fn (c mut Checker) selector_expr(selector_expr mut ast.SelectorExpr) table.Type {
|
||||
typ := c.expr(selector_expr.expr)
|
||||
selector_expr.expr_type = typ
|
||||
// println('sel expr line_nr=$selector_expr.pos.line_nr typ=$selector_expr.expr_type')
|
||||
typ_sym := c.table.get_type_symbol(typ)
|
||||
field_name := selector_expr.field
|
||||
if field := typ_sym.find_field(field_name) {
|
||||
|
@ -322,10 +326,6 @@ pub fn (c mut Checker) selector_expr(selector_expr mut ast.SelectorExpr) table.T
|
|||
}
|
||||
}
|
||||
if typ_sym.kind != .struct_ {
|
||||
if field_name == 'default_mode' {
|
||||
// TODO
|
||||
return table.bool_type
|
||||
}
|
||||
c.error('`$typ_sym.name` is not a struct', selector_expr.pos)
|
||||
}
|
||||
else {
|
||||
|
@ -632,7 +632,7 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type {
|
|||
}
|
||||
|
||||
pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type {
|
||||
// println('IDENT: $it.name - $it.pos.pos')
|
||||
// println('IDENT: $ident.name - $ident.pos.pos')
|
||||
if ident.kind == .variable {
|
||||
// println('===========================')
|
||||
// c.scope.print_vars(0)
|
||||
|
@ -656,7 +656,7 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type {
|
|||
// update the variable
|
||||
// we need to do this here instead of var_decl since some
|
||||
// vars are registered manually for things like for loops etc
|
||||
// NOTE: or consider making those declerations part of those ast nodes
|
||||
// NOTE: or consider making those declarations part of those ast nodes
|
||||
mut typ := var.typ
|
||||
// set var type on first use
|
||||
if typ == 0 {
|
||||
|
|
|
@ -622,6 +622,8 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||
g.write('sizeof($it.type_name)')
|
||||
}
|
||||
ast.StringLiteral {
|
||||
// In C calls we have to generate C strings
|
||||
// `C.printf("hi")` => `printf("hi");`
|
||||
if g.is_c_call {
|
||||
g.write('"$it.val"')
|
||||
}
|
||||
|
|
|
@ -94,6 +94,7 @@ i < 10; i++) {
|
|||
}
|
||||
|
||||
void User_inc_age(User* u, int n) {
|
||||
printf("%d", u->age);
|
||||
u->age += n;
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,10 @@ fn foo(a int) {
|
|||
|
||||
}
|
||||
|
||||
fn C.printf()
|
||||
|
||||
fn (u mut User) inc_age(n int) {
|
||||
C.printf("%d", u.age)
|
||||
u.age += n
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue