array type fix; method registration
							parent
							
								
									6d30697d9b
								
							
						
					
					
						commit
						d823d82207
					
				|  | @ -15,6 +15,13 @@ pub: | ||||||
| 	element_size int | 	element_size int | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* | ||||||
|  | struct Foo { | ||||||
|  | 	a []string | ||||||
|  | 	b [][]string | ||||||
|  | } | ||||||
|  | */ | ||||||
|  | 
 | ||||||
| // Internal function, used by V (`nums := []int`)
 | // Internal function, used by V (`nums := []int`)
 | ||||||
| fn new_array(mylen int, cap int, elm_size int) array { | fn new_array(mylen int, cap int, elm_size int) array { | ||||||
| 	cap_ := if cap == 0 { 1 } else { cap } | 	cap_ := if cap == 0 { 1 } else { cap } | ||||||
|  |  | ||||||
|  | @ -15,14 +15,14 @@ pub fn (p mut Parser) parse_array_ti(nr_muls int) types.TypeIdent { | ||||||
| 		return types.new_ti(._array_fixed, name, idx, nr_muls) | 		return types.new_ti(._array_fixed, name, idx, nr_muls) | ||||||
| 	} | 	} | ||||||
| 	// array
 | 	// array
 | ||||||
|  | 	p.check(.rsbr) | ||||||
| 	elem_ti := p.parse_ti() | 	elem_ti := p.parse_ti() | ||||||
| 	mut nr_dims := 1 | 	mut nr_dims := 1 | ||||||
| 	for p.tok.kind == .lsbr { | 	for p.tok.kind == .lsbr { | ||||||
| 		p.check(.lsbr) | 		p.check(.lsbr) | ||||||
| 		p.next() | 		p.check(.rsbr) | ||||||
| 		nr_dims++ | 		nr_dims++ | ||||||
| 	} | 	} | ||||||
| 	p.check(.rsbr) |  | ||||||
| 	idx,name := p.table.find_or_register_array(&elem_ti, nr_dims) | 	idx,name := p.table.find_or_register_array(&elem_ti, nr_dims) | ||||||
| 	return types.new_ti(._array, name, idx, nr_muls) | 	return types.new_ti(._array, name, idx, nr_muls) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -10,7 +10,6 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| pub fn (p mut Parser) call_expr() (ast.CallExpr,types.TypeIdent) { | pub fn (p mut Parser) call_expr() (ast.CallExpr,types.TypeIdent) { | ||||||
| 	// println('got fn call')
 |  | ||||||
| 	tok := p.tok | 	tok := p.tok | ||||||
| 	fn_name := p.check_name() | 	fn_name := p.check_name() | ||||||
| 	p.check(.lpar) | 	p.check(.lpar) | ||||||
|  | @ -19,6 +18,7 @@ pub fn (p mut Parser) call_expr() (ast.CallExpr,types.TypeIdent) { | ||||||
| 	mut args := []ast.Expr | 	mut args := []ast.Expr | ||||||
| 	mut return_ti := types.void_ti | 	mut return_ti := types.void_ti | ||||||
| 	if f := p.table.find_fn(fn_name) { | 	if f := p.table.find_fn(fn_name) { | ||||||
|  | 		// println('found fn $fn_name')
 | ||||||
| 		return_ti = f.return_ti | 		return_ti = f.return_ti | ||||||
| 		for i, arg in f.args { | 		for i, arg in f.args { | ||||||
| 			e,ti := p.expr(0) | 			e,ti := p.expr(0) | ||||||
|  | @ -81,8 +81,10 @@ fn (p mut Parser) fn_decl() ast.FnDecl { | ||||||
| 	p.check(.key_fn) | 	p.check(.key_fn) | ||||||
| 	// Receiver?
 | 	// Receiver?
 | ||||||
| 	mut rec_name := '' | 	mut rec_name := '' | ||||||
|  | 	mut is_method := false | ||||||
| 	mut rec_ti := types.void_ti | 	mut rec_ti := types.void_ti | ||||||
| 	if p.tok.kind == .lpar { | 	if p.tok.kind == .lpar { | ||||||
|  | 		is_method = true | ||||||
| 		p.next() | 		p.next() | ||||||
| 		rec_name = p.check_name() | 		rec_name = p.check_name() | ||||||
| 		if p.tok.kind == .key_mut { | 		if p.tok.kind == .key_mut { | ||||||
|  | @ -135,11 +137,13 @@ fn (p mut Parser) fn_decl() ast.FnDecl { | ||||||
| 		ti = p.parse_ti() | 		ti = p.parse_ti() | ||||||
| 		p.return_ti = ti | 		p.return_ti = ti | ||||||
| 	} | 	} | ||||||
| 	p.table.register_fn(table.Fn{ | 	if !is_method { | ||||||
| 		name: name | 		p.table.register_fn(table.Fn{ | ||||||
| 		args: args | 			name: name | ||||||
| 		return_ti: ti | 			args: args | ||||||
| 	}) | 			return_ti: ti | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
| 	stmts := p.parse_block() | 	stmts := p.parse_block() | ||||||
| 	return ast.FnDecl{ | 	return ast.FnDecl{ | ||||||
| 		name: name | 		name: name | ||||||
|  |  | ||||||
|  | @ -168,6 +168,12 @@ pub fn (p mut Parser) top_stmt() ast.Stmt { | ||||||
| 		.key_struct { | 		.key_struct { | ||||||
| 			return p.struct_decl() | 			return p.struct_decl() | ||||||
| 		} | 		} | ||||||
|  | 		.lsbr { | ||||||
|  | 			p.next() | ||||||
|  | 			p.check(.name) | ||||||
|  | 			p.check(.rsbr) | ||||||
|  | 			return ast.Module{} | ||||||
|  | 		} | ||||||
| 		else { | 		else { | ||||||
| 			p.error('bad top level statement') | 			p.error('bad top level statement') | ||||||
| 			return ast.Module{} // silence C warning
 | 			return ast.Module{} // silence C warning
 | ||||||
|  | @ -592,7 +598,7 @@ fn (p mut Parser) if_expr() (ast.Expr,types.TypeIdent) { | ||||||
| 		else_stmts: else_stmts | 		else_stmts: else_stmts | ||||||
| 		ti: ti | 		ti: ti | ||||||
| 		// left: left
 | 		// left: left
 | ||||||
| 
 | 		 | ||||||
| 	} | 	} | ||||||
| 	p.inside_if = false | 	p.inside_if = false | ||||||
| 	return node,ti | 	return node,ti | ||||||
|  | @ -755,7 +761,7 @@ fn (p mut Parser) return_stmt() ast.Return { | ||||||
| 	} | 	} | ||||||
| 	for i, exp_ti in expected_tis { | 	for i, exp_ti in expected_tis { | ||||||
| 		got_ti := got_tis[i] | 		got_ti := got_tis[i] | ||||||
| 		if !types.check(exp_ti, got_ti) { | 		if !types.check(got_ti, exp_ti) { | ||||||
| 			p.error('cannot use `$got_ti.name` as type `$exp_ti.name` in return argument') | 			p.error('cannot use `$got_ti.name` as type `$exp_ti.name` in return argument') | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -791,7 +797,7 @@ fn (p mut Parser) var_decl() ast.VarDecl { | ||||||
| 	return ast.VarDecl{ | 	return ast.VarDecl{ | ||||||
| 		name: name | 		name: name | ||||||
| 		expr: expr // p.expr(token.lowest_prec)
 | 		expr: expr // p.expr(token.lowest_prec)
 | ||||||
| 
 | 		 | ||||||
| 		ti: ti | 		ti: ti | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ pub enum Kind { | ||||||
| 	_variadic | 	_variadic | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub type Type = Placeholder | Void | Voidptr | Charptr | Byteptr | Const | Enum | Struct | | pub type Type = Placeholder | Void | Voidptr | Charptr | Byteptr | Const | Enum | Struct | 	 | ||||||
| Int | Float | String | Char | Byte | Bool | Array | ArrayFixed | Map | MultiReturn | Variadic | Int | Float | String | Char | Byte | Bool | Array | ArrayFixed | Map | MultiReturn | Variadic | ||||||
| 
 | 
 | ||||||
| pub struct TypeIdent { | pub struct TypeIdent { | ||||||
|  | @ -92,6 +92,12 @@ pub fn (ti &TypeIdent) str() string { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn check(got, expected &TypeIdent) bool { | pub fn check(got, expected &TypeIdent) bool { | ||||||
|  | 	if expected.kind == ._voidptr { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	if expected.name == 'array' { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
| 	if got.idx != expected.idx { | 	if got.idx != expected.idx { | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue