cgen: fix multi_array index issue

pull/5355/head
yuyi 2020-06-12 07:24:25 +08:00 committed by GitHub
parent c9cfe9d40b
commit ff1437fc5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 7 deletions

View File

@ -43,6 +43,21 @@ fn __new_array_with_default(mylen int, cap int, elm_size int, val voidptr) array
return arr
}
fn __new_array_with_array_default(mylen int, cap int, elm_size int, val array) array {
cap_ := if cap < mylen { mylen } else { cap }
arr := array{
element_size: elm_size
data: vcalloc(cap_ * elm_size)
len: mylen
cap: cap_
}
for i in 0..arr.len {
val_clone := val.clone()
C.memcpy(charptr(arr.data) + i*elm_size, &val_clone, elm_size)
}
return arr
}
// Private function, used by V (`nums := [1, 2, 3]`)
fn new_array_from_c_array(len, cap, elm_size int, c_array voidptr) array {
cap_ := if cap < len { len } else { cap }
@ -146,7 +161,7 @@ pub fn (mut a array) delete(i int) {
}
}
size := a.element_size
// NB: if a is [12,34], a.len = 2, a.delete(0)
// NB: if a is [12,34], a.len = 2, a.delete(0)
// should move (2-0-1) elements = 1 element (the 34) forward
C.memmove(byteptr(a.data) + i * size, byteptr(a.data) + (i + 1) * size, (a.len - i - 1) * size)
a.len--

View File

@ -816,3 +816,9 @@ fn test_array_with_cap() {
assert a5.len == 1
assert a5.cap == 10
}
fn test_mutli_array_index() {
mut a := [][]int{len:2, init: []int{len:3, init:0}}
a[0][0] = 1
assert '$a' == '[[1, 0, 0], [0, 0, 0]]'
}

View File

@ -3356,7 +3356,7 @@ fn (mut g Gen) or_block(var_name string, or_block ast.OrExpr, return_type table.
} else {
// In ordinary functions, `opt()?` call is sugar for:
// `opt() or { return error(err) }`
// Since we *do* return, first we have to ensure that
// Since we *do* return, first we have to ensure that
// the defered statements are generated.
g.write_defer_stmts()
// Now that option types are distinct we need a cast here
@ -4320,10 +4320,16 @@ fn (mut g Gen) array_init(it ast.ArrayInit) {
g.write('}')
return
}
// elem_sym := g.table.get_type_symbol(it.elem_type)
elem_type_str := g.typ(it.elem_type)
if it.exprs.len == 0 {
g.write('__new_array_with_default(')
elem_sym := g.table.get_type_symbol(it.elem_type)
is_default_array := elem_sym.kind == .array && it.has_default
if is_default_array {
g.write('__new_array_with_array_default(')
} else {
g.write('__new_array_with_default(')
}
if it.has_len {
g.expr(it.len_expr)
g.write(', ')
@ -4337,10 +4343,14 @@ fn (mut g Gen) array_init(it ast.ArrayInit) {
g.write('0, ')
}
g.write('sizeof($elem_type_str), ')
if it.has_default || (it.has_len && it.elem_type == table.string_type) {
g.write('&_val_$it.pos.pos)')
if is_default_array {
g.write('_val_$it.pos.pos)')
} else {
g.write('0)')
if it.has_default || (it.has_len && it.elem_type == table.string_type) {
g.write('&_val_$it.pos.pos)')
} else {
g.write('0)')
}
}
return
}