cgen: fix methods; println
parent
8373ece209
commit
baaa55f196
|
@ -216,6 +216,10 @@ pub fn (c mut Checker) call_expr(call_expr ast.CallExpr) table.Type {
|
|||
else if !f.is_variadic && call_expr.args.len > f.args.len {
|
||||
c.error('too many arguments in call to `$fn_name` ($call_expr.args.len instead of $f.args.len)', call_expr.pos)
|
||||
}
|
||||
// println can print anything
|
||||
if fn_name == 'println' {
|
||||
return f.return_type
|
||||
}
|
||||
for i, arg_expr in call_expr.args {
|
||||
arg := if f.is_variadic && i >= f.args.len - 1 { f.args[f.args.len - 1] } else { f.args[i] }
|
||||
c.expected_type = arg.typ
|
||||
|
@ -666,9 +670,7 @@ pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type {
|
|||
typ := c.expr(match_expr)
|
||||
typ_sym := c.table.get_type_symbol(typ)
|
||||
// TODO:
|
||||
if typ_sym.kind == .sum_type {
|
||||
|
||||
}
|
||||
if typ_sym.kind == .sum_type {}
|
||||
}
|
||||
c.stmts(block.stmts)
|
||||
// If the last statement is an expression, return its type
|
||||
|
@ -766,8 +768,7 @@ pub fn (c mut Checker) index_expr(node ast.IndexExpr) table.Type {
|
|||
index_type := c.expr(node.index)
|
||||
index_type_sym := c.table.get_type_symbol(index_type)
|
||||
// println('index expr left=$typ_sym.name $node.pos.line_nr')
|
||||
if typ_sym.kind == .array &&
|
||||
(!(table.type_idx(index_type) in table.number_idxs) && index_type_sym.kind != .enum_) {
|
||||
if typ_sym.kind == .array && (!(table.type_idx(index_type) in table.number_idxs) && index_type_sym.kind != .enum_) {
|
||||
c.error('non-integer index (type `$typ_sym.name`)', node.pos)
|
||||
}
|
||||
else if typ_sym.kind == .map && table.type_idx(index_type) != table.string_type_idx {
|
||||
|
|
|
@ -86,7 +86,10 @@ fn (g mut Gen) stmt(node ast.Stmt) {
|
|||
}
|
||||
else {
|
||||
type_sym := g.table.get_type_symbol(it.typ)
|
||||
name := it.name.replace('.', '__')
|
||||
mut name := it.name.replace('.', '__')
|
||||
if it.is_method {
|
||||
name = g.table.get_type_symbol(it.receiver.typ).name + '_' + name
|
||||
}
|
||||
g.write('$type_sym.name ${name}(')
|
||||
g.definitions.write('$type_sym.name ${name}(')
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
void foo(int a);
|
||||
void User_inc_age(int n);
|
||||
int get_int(string a);
|
||||
bool get_bool();
|
||||
int get_int2();
|
||||
|
@ -74,6 +75,10 @@ i < 10; i++;
|
|||
int f = TODO_first(nums);
|
||||
}
|
||||
|
||||
void User_inc_age(int n) {
|
||||
u.age += n;
|
||||
}
|
||||
|
||||
int get_int(string a) {
|
||||
return 10;
|
||||
}
|
||||
|
@ -91,13 +96,17 @@ void myuser() {
|
|||
int x = 1;
|
||||
int q = x | 4100;
|
||||
User user = (User){
|
||||
.age = 10,
|
||||
.age = 30,
|
||||
};
|
||||
int age = user.age + 1;
|
||||
int boo = 2;
|
||||
int boo2 = boo + 1;
|
||||
bool b = age > 0;
|
||||
bool b2 = user.age > 0;
|
||||
User user2 = (User){
|
||||
.age = 20,
|
||||
};
|
||||
user2.age = 20 + boo;
|
||||
}
|
||||
|
||||
multi_return_int_string multi_return() {
|
||||
|
|
|
@ -83,6 +83,10 @@ fn foo(a int) {
|
|||
//println(cloned1 == 1)
|
||||
}
|
||||
|
||||
fn (u mut User) inc_age(n int) {
|
||||
u.age += n
|
||||
}
|
||||
|
||||
fn get_int(a string) int {
|
||||
return 10
|
||||
}
|
||||
|
@ -100,12 +104,14 @@ fn get_int2() int {
|
|||
fn myuser() {
|
||||
x := 1
|
||||
q := x | 0x1004
|
||||
user := User{age:10}
|
||||
user := User{age:30}
|
||||
age := user.age + 1 // crash here
|
||||
boo := 2
|
||||
boo2 := boo+1
|
||||
b := age > 0
|
||||
b2 := user.age > 0
|
||||
mut user2 := User{age:20}
|
||||
user2.age = 20 + boo
|
||||
}
|
||||
|
||||
fn multi_return() (int,string) {
|
||||
|
|
|
@ -2,9 +2,9 @@ multi_return_int_string mr_test();
|
|||
int testa();
|
||||
string testb(int a);
|
||||
int testc(int a);
|
||||
int testa();
|
||||
int testb();
|
||||
int testa();
|
||||
int Foo_testa();
|
||||
int Foo_testb();
|
||||
int Bar_testa();
|
||||
|
||||
int main() {
|
||||
Bar b = (Bar){
|
||||
|
@ -55,17 +55,17 @@ int testc(int a) {
|
|||
return a;
|
||||
}
|
||||
|
||||
int testa() {
|
||||
int Foo_testa() {
|
||||
int a = TODO_testb(f);
|
||||
a = 1;
|
||||
return 4;
|
||||
}
|
||||
|
||||
int testb() {
|
||||
int Foo_testb() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
int testa() {
|
||||
int Bar_testa() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
|
|
|
@ -246,6 +246,9 @@ pub fn (g mut Gen) gen_print_from_expr(expr ast.Expr) {
|
|||
}
|
||||
|
||||
pub fn (g mut Gen) gen_print(s string) {
|
||||
//
|
||||
qq := s + '\n'
|
||||
//
|
||||
g.strings << s + '\n'
|
||||
// g.string_addr[s] = str_pos
|
||||
g.mov(.eax, 1)
|
||||
|
|
|
@ -255,25 +255,20 @@ pub fn (t &Table) known_type(name string) bool {
|
|||
[inline]
|
||||
pub fn (t &Table) array_name(elem_type Type, nr_dims int) string {
|
||||
elem_type_sym := t.get_type_symbol(elem_type)
|
||||
return 'array_${elem_type_sym.name}'
|
||||
+ if type_is_ptr(elem_type) { '_ptr' } else { '' }
|
||||
+ if nr_dims > 1 { '_${nr_dims}d' } else { '' }
|
||||
return 'array_${elem_type_sym.name}' + if type_is_ptr(elem_type) { '_ptr' } else { '' } + if nr_dims > 1 { '_${nr_dims}d' } else { '' }
|
||||
}
|
||||
|
||||
[inline]
|
||||
pub fn (t &Table) array_fixed_name(elem_type Type, size int, nr_dims int) string {
|
||||
elem_type_sym := t.get_type_symbol(elem_type)
|
||||
return 'array_fixed_${elem_type_sym.name}_${size}'
|
||||
+ if type_is_ptr(elem_type) { '_ptr' } else { '' }
|
||||
+ if nr_dims > 1 { '_${nr_dims}d' } else { '' }
|
||||
return 'array_fixed_${elem_type_sym.name}_${size}' + if type_is_ptr(elem_type) { '_ptr' } else { '' } + if nr_dims > 1 { '_${nr_dims}d' } else { '' }
|
||||
}
|
||||
|
||||
[inline]
|
||||
pub fn (t &Table) map_name(key_type Type, value_type Type) string {
|
||||
key_type_sym := t.get_type_symbol(key_type)
|
||||
value_type_sym := t.get_type_symbol(value_type)
|
||||
return 'map_${key_type_sym.name}_${value_type_sym.name}'
|
||||
+ if type_is_ptr(value_type) { '_ptr' } else { '' }
|
||||
return 'map_${key_type_sym.name}_${value_type_sym.name}' + if type_is_ptr(value_type) { '_ptr' } else { '' }
|
||||
}
|
||||
|
||||
pub fn (t mut Table) find_or_register_map(key_type, value_type Type) int {
|
||||
|
@ -382,6 +377,9 @@ pub fn (t &Table) check(got, expected Type) bool {
|
|||
if exp_type_sym.kind == .voidptr {
|
||||
return true
|
||||
}
|
||||
// if got_type_sym.kind == .array_fixed {
|
||||
// return true
|
||||
// }
|
||||
if got_type_sym.kind in [.voidptr, .byteptr, .charptr, .int] && exp_type_sym.kind in [.voidptr, .byteptr, .charptr] {
|
||||
return true
|
||||
}
|
||||
|
@ -393,8 +391,7 @@ pub fn (t &Table) check(got, expected Type) bool {
|
|||
return true
|
||||
}
|
||||
// allow enum value to be used as int
|
||||
if (got_type_sym.is_int() && exp_type_sym.kind == .enum_) ||
|
||||
(exp_type_sym.is_int() && got_type_sym.kind == .enum_) {
|
||||
if (got_type_sym.is_int() && exp_type_sym.kind == .enum_) || (exp_type_sym.is_int() && got_type_sym.kind == .enum_) {
|
||||
return true
|
||||
}
|
||||
// TODO
|
||||
|
|
Loading…
Reference in New Issue