mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix array.insert and arr.prepend
This commit is contained in:
@@ -3069,7 +3069,7 @@ fn (mut g Gen) gen_expr_to_string(expr ast.Expr, etype table.Type) ?bool {
|
||||
}
|
||||
|
||||
// `nums.map(it % 2 == 0)`
|
||||
fn (mut g Gen) gen_map(node ast.CallExpr) {
|
||||
fn (mut g Gen) gen_array_map(node ast.CallExpr) {
|
||||
tmp := g.new_tmp_var()
|
||||
s := g.go_before_stmt(0)
|
||||
// println('filter s="$s"')
|
||||
@@ -3127,7 +3127,7 @@ fn (mut g Gen) gen_map(node ast.CallExpr) {
|
||||
}
|
||||
|
||||
// `nums.filter(it % 2 == 0)`
|
||||
fn (mut g Gen) gen_filter(node ast.CallExpr) {
|
||||
fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
|
||||
tmp := g.new_tmp_var()
|
||||
s := g.go_before_stmt(0)
|
||||
// println('filter s="$s"')
|
||||
@@ -3177,6 +3177,38 @@ fn (mut g Gen) gen_filter(node ast.CallExpr) {
|
||||
g.write(tmp)
|
||||
}
|
||||
|
||||
// `nums.insert(0, 2)`
|
||||
fn (mut g Gen) gen_array_insert(node ast.CallExpr) {
|
||||
sym := g.table.get_type_symbol(node.left_type)
|
||||
if sym.kind != .array {
|
||||
verror('insert() requires an array')
|
||||
}
|
||||
info := sym.info as table.Array
|
||||
elem_type_str := g.typ(info.elem_type)
|
||||
g.write('array_insert(&')
|
||||
g.expr(node.left)
|
||||
g.write(', ')
|
||||
g.expr(node.args[0].expr)
|
||||
g.write(', &($elem_type_str[]){')
|
||||
g.expr(node.args[1].expr)
|
||||
g.write('});')
|
||||
}
|
||||
|
||||
// `nums.prepend(2)`
|
||||
fn (mut g Gen) gen_array_prepend(node ast.CallExpr) {
|
||||
sym := g.table.get_type_symbol(node.left_type)
|
||||
if sym.kind != .array {
|
||||
verror('prepend() requires an array')
|
||||
}
|
||||
info := sym.info as table.Array
|
||||
elem_type_str := g.typ(info.elem_type)
|
||||
g.write('array_prepend(&')
|
||||
g.expr(node.left)
|
||||
g.write(', &($elem_type_str[]){')
|
||||
g.expr(node.args[0].expr)
|
||||
g.write('});')
|
||||
}
|
||||
|
||||
[inline]
|
||||
fn (g &Gen) nth_stmt_pos(n int) int {
|
||||
return g.stmt_path_pos[g.stmt_path_pos.len - (1 + n)]
|
||||
|
||||
@@ -359,14 +359,27 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
|
||||
g.write(')')
|
||||
return
|
||||
}
|
||||
if typ_sym.kind == .array && node.name == 'map' {
|
||||
g.gen_map(node)
|
||||
return
|
||||
}
|
||||
// rec_sym := g.table.get_type_symbol(node.receiver_type)
|
||||
if typ_sym.kind == .array && node.name == 'filter' {
|
||||
g.gen_filter(node)
|
||||
return
|
||||
left_sym := g.table.get_type_symbol(node.left_type)
|
||||
if left_sym.kind == .array {
|
||||
match node.name {
|
||||
'filter' {
|
||||
g.gen_array_filter(node)
|
||||
return
|
||||
}
|
||||
'insert' {
|
||||
g.gen_array_insert(node)
|
||||
return
|
||||
}
|
||||
'map' {
|
||||
g.gen_array_map(node)
|
||||
return
|
||||
}
|
||||
'prepend' {
|
||||
g.gen_array_prepend(node)
|
||||
return
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
if node.name == 'str' {
|
||||
mut styp := g.typ(node.receiver_type)
|
||||
@@ -376,7 +389,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
|
||||
g.gen_str_for_type_with_styp(node.receiver_type, styp)
|
||||
}
|
||||
// TODO performance, detect `array` method differently
|
||||
if typ_sym.kind == .array && node.name in ['repeat', 'sort_with_compare', 'free', 'push_many',
|
||||
if left_sym.kind == .array && node.name in ['repeat', 'sort_with_compare', 'free', 'push_many',
|
||||
'trim',
|
||||
'first',
|
||||
'last',
|
||||
|
||||
Reference in New Issue
Block a user