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