cgen: for in; init fixes
							parent
							
								
									ba088056ed
								
							
						
					
					
						commit
						c12985d1d7
					
				|  | @ -400,13 +400,16 @@ pub: | |||
| 
 | ||||
| pub struct ForInStmt { | ||||
| pub: | ||||
| 	key_var  string | ||||
| 	val_var  string | ||||
| 	cond     Expr | ||||
| 	is_range bool | ||||
| 	high     Expr // `10` in `for i in 0..10 {`
 | ||||
| 	stmts    []Stmt | ||||
| 	pos      token.Position | ||||
| 	key_var      string | ||||
| 	val_var      string | ||||
| 	cond         Expr | ||||
| 	is_range     bool | ||||
| 	high         Expr // `10` in `for i in 0..10 {`
 | ||||
| 	stmts        []Stmt | ||||
| 	pos          token.Position | ||||
| mut: | ||||
| 	element_type table.Type | ||||
| 	kind         table.Kind // array/map/string
 | ||||
| } | ||||
| 
 | ||||
| pub struct ForCStmt { | ||||
|  |  | |||
|  | @ -576,8 +576,8 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 			} | ||||
| 			else { | ||||
| 				mut scope := c.file.scope.innermost(it.pos.pos) | ||||
| 				sym := c.table.get_type_symbol(typ) | ||||
| 				if it.key_var.len > 0 { | ||||
| 					sym := c.table.get_type_symbol(typ) | ||||
| 					key_type := match sym.kind { | ||||
| 						.map{ | ||||
| 							sym.map_info().key_type | ||||
|  | @ -595,6 +595,8 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 					typ_sym := c.table.get_type_symbol(typ) | ||||
| 					c.error('for in: cannot index $typ_sym.name', it.pos) | ||||
| 				} | ||||
| 				it.kind = sym.kind | ||||
| 				it.element_type = value_type | ||||
| 				scope.override_var(ast.Var{ | ||||
| 					name: it.val_var | ||||
| 					typ: value_type | ||||
|  |  | |||
|  | @ -44,9 +44,7 @@ pub fn cgen(files []ast.File, table &table.Table) string { | |||
| 	} | ||||
| 	g.write_variadic_types() | ||||
| 	g.write_str_definitions() | ||||
| 	g.writeln('void _init() {') | ||||
| 	g.writeln(g.inits.str()) | ||||
| 	g.writeln('}') | ||||
| 	g.write_init_function() | ||||
| 	return g.typedefs.str() + g.definitions.str() + g.out.str() | ||||
| } | ||||
| 
 | ||||
|  | @ -288,6 +286,7 @@ fn (g mut Gen) stmt(node ast.Stmt) { | |||
| 		} | ||||
| 		ast.ForInStmt { | ||||
| 			if it.is_range { | ||||
| 				// `for x in 1..10 {`
 | ||||
| 				i := g.new_tmp_var() | ||||
| 				g.write('for (int $i = ') | ||||
| 				g.expr(it.cond) | ||||
|  | @ -299,7 +298,20 @@ fn (g mut Gen) stmt(node ast.Stmt) { | |||
| 				g.writeln('}') | ||||
| 			} | ||||
| 			// TODO:
 | ||||
| 			else {} | ||||
| 			else if it.kind == .array { | ||||
| 				// `for num in nums {`
 | ||||
| 				g.writeln('// FOR IN') | ||||
| 				i := if it.key_var == '' { g.new_tmp_var() } else { it.key_var } | ||||
| 				g.write('for (int $i = 0; $i < ') | ||||
| 				g.expr(it.cond) | ||||
| 				g.writeln('.len; $i++) {') | ||||
| 				styp := g.typ(it.element_type) | ||||
| 				g.write('$styp $it.val_var = (($styp*)') | ||||
| 				g.expr(it.cond) | ||||
| 				g.writeln('.data)[$i];') | ||||
| 				g.stmts(it.stmts) | ||||
| 				g.writeln('}') | ||||
| 			} | ||||
| 		} | ||||
| 		ast.ForStmt { | ||||
| 			g.write('while (') | ||||
|  | @ -471,7 +483,7 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) { | |||
| 	g.reset_tmp_count() | ||||
| 	is_main := it.name == 'main' | ||||
| 	if is_main { | ||||
| 		g.write('int ${it.name}(') | ||||
| 		g.write('int ${it.name}(int argc, char** argv') | ||||
| 	} | ||||
| 	else { | ||||
| 		mut name := it.name | ||||
|  | @ -513,6 +525,10 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) { | |||
| 	if !is_main { | ||||
| 		g.definitions.writeln(');') | ||||
| 	} | ||||
| 	if is_main { | ||||
| 		g.writeln('_init();') | ||||
| 		g.writeln('os__args = os__init_os_args(argc, (byteptr*)argv);') | ||||
| 	} | ||||
| 	for stmt in it.stmts { | ||||
| 		// g.write('\t')
 | ||||
| 		g.stmt(stmt) | ||||
|  | @ -1522,7 +1538,7 @@ fn (g mut Gen) ref_or_deref_arg(arg ast.CallArg) { | |||
| 	if arg.is_mut && !arg_is_ptr { | ||||
| 		g.write('&/*mut*/') | ||||
| 	} | ||||
| 	else if arg_is_ptr && !expr_is_ptr { | ||||
| 	else if arg_is_ptr && !expr_is_ptr && arg.typ != table.byteptr_type { | ||||
| 		g.write('&/*q*/') | ||||
| 	} | ||||
| 	else if !arg_is_ptr && expr_is_ptr { | ||||
|  | @ -1538,6 +1554,7 @@ fn verror(s string) { | |||
| 
 | ||||
| fn (g mut Gen) write_init_function() { | ||||
| 	g.writeln('void _init() {') | ||||
| 	g.writeln(g.inits.str()) | ||||
| 	g.writeln('}') | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue