cgen: fix fixed array init assignment

pull/3998/head
Joe Conigliaro 2020-03-12 20:07:42 +11:00
parent d2cf6894fe
commit bb5034f3fe
1 changed files with 30 additions and 21 deletions

View File

@ -360,12 +360,21 @@ fn (g mut Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
} }
} }
else { else {
mut is_fixed_array_init := false
match val {
ast.ArrayInit {
is_fixed_array_init = g.table.get_type_symbol(it.typ).kind == .array_fixed
}
else {}
}
if assign_stmt.op == .decl_assign { if assign_stmt.op == .decl_assign {
g.write('$styp ') g.write('$styp ')
} }
g.expr(ident) g.expr(ident)
g.write(' = ') if !is_fixed_array_init {
g.expr(val) g.write(' = ')
g.expr(val)
}
} }
g.writeln(';') g.writeln(';')
} }
@ -852,13 +861,13 @@ fn (g mut Gen) expr(node ast.Expr) {
} }
} }
fn (g mut Gen) infix_expr(it ast.InfixExpr) { fn (g mut Gen) infix_expr(node ast.InfixExpr) {
// if it.left_type == table.string_type_idx { // if it.left_type == table.string_type_idx {
// g.write('/*$it.left_type str*/') // g.write('/*$node.left_type str*/')
// } // }
// string + string, string == string etc // string + string, string == string etc
if it.left_type == table.string_type_idx { if node.left_type == table.string_type_idx {
fn_name := match it.op { fn_name := match node.op {
.plus{ .plus{
'string_add(' 'string_add('
} }
@ -881,42 +890,42 @@ fn (g mut Gen) infix_expr(it ast.InfixExpr) {
'string_ge(' 'string_ge('
} }
else { else {
'/*infix_expr error*/'} '/*node error*/'}
} }
g.write(fn_name) g.write(fn_name)
g.expr(it.left) g.expr(node.left)
g.write(', ') g.write(', ')
g.expr(it.right) g.expr(node.right)
g.write(')') g.write(')')
} }
else if it.op == .key_in { else if node.op == .key_in {
styp := g.typ(it.left_type) styp := g.typ(node.left_type)
g.write('_IN($styp, ') g.write('_IN($styp, ')
g.expr(it.left) g.expr(node.left)
g.write(', ') g.write(', ')
g.expr(it.right) g.expr(node.right)
g.write(')') g.write(')')
} }
// arr << val // arr << val
else if it.op == .left_shift && g.table.get_type_symbol(it.left_type).kind == .array { else if node.op == .left_shift && g.table.get_type_symbol(node.left_type).kind == .array {
sym := g.table.get_type_symbol(it.left_type) sym := g.table.get_type_symbol(node.left_type)
info := sym.info as table.Array info := sym.info as table.Array
elem_type_str := g.typ(info.elem_type) elem_type_str := g.typ(info.elem_type)
// g.write('array_push(&') // g.write('array_push(&')
tmp := g.new_tmp_var() tmp := g.new_tmp_var()
g.write('_PUSH(&') g.write('_PUSH(&')
g.expr(it.left) g.expr(node.left)
g.write(', (') g.write(', (')
g.expr(it.right) g.expr(node.right)
g.write('), $tmp, $elem_type_str)') g.write('), $tmp, $elem_type_str)')
} }
else { else {
// if it.op == .dot { // if node.op == .dot {
// println('!! dot') // println('!! dot')
// } // }
g.expr(it.left) g.expr(node.left)
g.write(' $it.op.str() ') g.write(' $node.op.str() ')
g.expr(it.right) g.expr(node.right)
} }
} }