compiler: simplify `a[index] = val`
parent
b6ecbd8bc3
commit
0a4a1ca36c
|
@ -1023,7 +1023,7 @@ fn (p mut Parser) close_scope() {
|
|||
mut i := p.cur_fn.var_idx - 1
|
||||
for ; i >= 0; i-- {
|
||||
v := p.cur_fn.local_vars[i]
|
||||
if v.scope_level != p.cur_fn.scope_level {
|
||||
if v.scope_level ≠ p.cur_fn.scope_level {
|
||||
// println('breaking. "$v.name" v.scope_level=$v.scope_level')
|
||||
break
|
||||
}
|
||||
|
@ -1962,47 +1962,42 @@ fn (p mut Parser) index_expr(typ_ string, fn_ph int) string {
|
|||
p.error('strings are immutable')
|
||||
}
|
||||
assign_pos := p.cgen.cur_line.len
|
||||
is_cao := p.tok != .assign
|
||||
is_cao := p.tok ≠ .assign
|
||||
p.assigned_type = typ
|
||||
p.expected_type = typ
|
||||
p.assign_statement(v, fn_ph, is_indexer && (is_map || is_arr))
|
||||
// m[key] = val
|
||||
if is_indexer && (is_map || is_arr) {
|
||||
// a[0] = 7
|
||||
// curline right now: "a , 0 = 7"
|
||||
// println('222 "$p.cgen.cur_line"')
|
||||
// Cant have &7, so need a tmp
|
||||
tmp := p.get_tmp()
|
||||
tmp_val := p.cgen.cur_line.right(assign_pos)
|
||||
// `a[0] = 7`
|
||||
// curline right now: `a , 0 = 7`
|
||||
mut val := p.cgen.cur_line.right(assign_pos)
|
||||
p.cgen.resetln(p.cgen.cur_line.left(assign_pos))
|
||||
// val := p.cgen.end_tmp()
|
||||
mut cao_tmp := p.cgen.cur_line
|
||||
mut func := ''
|
||||
if is_map {
|
||||
p.cgen.set_placeholder(fn_ph, 'map__set(&')
|
||||
func = 'map__set(&'
|
||||
// CAO on map is a bit more complicated as it loads
|
||||
// the value inside a pointer instead of returning it.
|
||||
}
|
||||
else {
|
||||
if is_ptr {
|
||||
p.cgen.set_placeholder(fn_ph, 'array_set(')
|
||||
func = 'array_set('
|
||||
if is_cao {
|
||||
cao_tmp = '*($p.expected_type *) array__get(*$cao_tmp)'
|
||||
}
|
||||
}
|
||||
else {
|
||||
p.cgen.set_placeholder(fn_ph, 'array_set(&/*q*/')
|
||||
func = 'array_set(&/*q*/'
|
||||
if is_cao {
|
||||
cao_tmp = '*($p.expected_type *) array__get($cao_tmp)'
|
||||
}
|
||||
}
|
||||
}
|
||||
p.gen(', & $tmp)')
|
||||
if !is_cao {
|
||||
p.cgen.insert_before('$typ $tmp = $tmp_val;')
|
||||
}
|
||||
else {
|
||||
p.cgen.insert_before('$typ $tmp = $cao_tmp ' + tmp_val.all_before('=') + tmp_val.all_after('=') + ';')
|
||||
p.cgen.set_placeholder(fn_ph, func)
|
||||
if is_cao {
|
||||
val = cao_tmp + val.all_before('=') + val.all_after('=')
|
||||
}
|
||||
p.gen(', & ($typ []) { $val })')
|
||||
}
|
||||
return typ
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue