cgen: make array_set/map_set work with pointers
parent
ef339a4896
commit
a25f47124d
|
@ -336,7 +336,7 @@ pub:
|
||||||
left Expr
|
left Expr
|
||||||
index Expr // [0], [start..end] etc
|
index Expr // [0], [start..end] etc
|
||||||
mut:
|
mut:
|
||||||
container_type table.Type // array, map, fixed array
|
left_type table.Type // array, map, fixed array
|
||||||
is_setter bool
|
is_setter bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1059,6 +1059,7 @@ pub fn (c mut Checker) postfix_expr(node ast.PostfixExpr) table.Type {
|
||||||
|
|
||||||
pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type {
|
pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type {
|
||||||
typ := c.expr(node.left)
|
typ := c.expr(node.left)
|
||||||
|
node.left_type = typ
|
||||||
mut is_range := false // TODO is_range := node.index is ast.RangeExpr
|
mut is_range := false // TODO is_range := node.index is ast.RangeExpr
|
||||||
match node.index {
|
match node.index {
|
||||||
ast.RangeExpr {
|
ast.RangeExpr {
|
||||||
|
@ -1072,7 +1073,6 @@ pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type {
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
node.container_type = typ
|
|
||||||
typ_sym := c.table.get_type_symbol(typ)
|
typ_sym := c.table.get_type_symbol(typ)
|
||||||
if !is_range {
|
if !is_range {
|
||||||
index_type := c.expr(node.index)
|
index_type := c.expr(node.index)
|
||||||
|
|
|
@ -1616,7 +1616,7 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
|
||||||
mut is_range := false
|
mut is_range := false
|
||||||
match node.index {
|
match node.index {
|
||||||
ast.RangeExpr {
|
ast.RangeExpr {
|
||||||
sym := g.table.get_type_symbol(node.container_type)
|
sym := g.table.get_type_symbol(node.left_type)
|
||||||
is_range = true
|
is_range = true
|
||||||
if sym.kind == .string {
|
if sym.kind == .string {
|
||||||
g.write('string_substr(')
|
g.write('string_substr(')
|
||||||
|
@ -1662,8 +1662,9 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
if !is_range {
|
if !is_range {
|
||||||
sym := g.table.get_type_symbol(node.container_type)
|
sym := g.table.get_type_symbol(node.left_type)
|
||||||
if table.type_is_variadic(node.container_type) {
|
left_is_ptr := table.type_is_ptr(node.left_type)
|
||||||
|
if table.type_is_variadic(node.left_type) {
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.write('.args')
|
g.write('.args')
|
||||||
g.write('[')
|
g.write('[')
|
||||||
|
@ -1684,7 +1685,10 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
|
||||||
}
|
}
|
||||||
if g.is_assign_lhs && !is_selector && node.is_setter {
|
if g.is_assign_lhs && !is_selector && node.is_setter {
|
||||||
g.is_array_set = true
|
g.is_array_set = true
|
||||||
g.write('array_set(&')
|
g.write('array_set(')
|
||||||
|
if !left_is_ptr {
|
||||||
|
g.write('&')
|
||||||
|
}
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
g.expr(node.index)
|
g.expr(node.index)
|
||||||
|
@ -1719,7 +1723,10 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
|
||||||
elem_type_str := g.typ(info.value_type)
|
elem_type_str := g.typ(info.value_type)
|
||||||
if g.is_assign_lhs {
|
if g.is_assign_lhs {
|
||||||
g.is_array_set = true
|
g.is_array_set = true
|
||||||
g.write('map_set(&')
|
g.write('map_set(')
|
||||||
|
if !left_is_ptr {
|
||||||
|
g.write('&')
|
||||||
|
}
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
g.expr(node.index)
|
g.expr(node.index)
|
||||||
|
@ -1741,7 +1748,7 @@ fn (g mut Gen) index_expr(node ast.IndexExpr) {
|
||||||
g.write(', &($elem_type_str[]){ $zero }))')
|
g.write(', &($elem_type_str[]){ $zero }))')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if sym.kind == .string && !table.type_is_ptr(node.container_type) {
|
else if sym.kind == .string && !table.type_is_ptr(node.left_type) {
|
||||||
g.write('string_at(')
|
g.write('string_at(')
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
|
|
Loading…
Reference in New Issue