1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

builtin: fix array init with array default (#16664)

This commit is contained in:
yuyi 2022-12-14 00:05:33 +08:00 committed by GitHub
parent 738fe77300
commit 69f7c45bec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 6 deletions

View File

@ -63,7 +63,7 @@ fn __new_array_with_default(mylen int, cap int, elm_size int, val voidptr) array
return arr return arr
} }
fn __new_array_with_array_default(mylen int, cap int, elm_size int, val array) array { fn __new_array_with_array_default(mylen int, cap int, elm_size int, val array, depth int) array {
cap_ := if cap < mylen { mylen } else { cap } cap_ := if cap < mylen { mylen } else { cap }
mut arr := array{ mut arr := array{
element_size: elm_size element_size: elm_size
@ -74,7 +74,7 @@ fn __new_array_with_array_default(mylen int, cap int, elm_size int, val array) a
mut eptr := &u8(arr.data) mut eptr := &u8(arr.data)
unsafe { unsafe {
for _ in 0 .. arr.len { for _ in 0 .. arr.len {
val_clone := val.clone_to_depth(1) val_clone := val.clone_to_depth(depth)
vmemcpy(eptr, &val_clone, arr.element_size) vmemcpy(eptr, &val_clone, arr.element_size)
eptr += arr.element_size eptr += arr.element_size
} }

View File

@ -13,6 +13,6 @@ fn __new_array_with_default_noscan(mylen int, cap int, elm_size int, val voidptr
return __new_array_with_default(mylen, cap, elm_size, val) return __new_array_with_default(mylen, cap, elm_size, val)
} }
fn __new_array_with_array_default_noscan(mylen int, cap int, elm_size int, val array) array { fn __new_array_with_array_default_noscan(mylen int, cap int, elm_size int, val array, depth int) array {
return __new_array_with_array_default(mylen, cap, elm_size, val) return __new_array_with_array_default(mylen, cap, elm_size, val, depth)
} }

View File

@ -222,9 +222,15 @@ fn (mut g Gen) array_init_with_fields(node ast.ArrayInit, elem_type Type, is_amp
g.write('sizeof(${elem_styp}), ') g.write('sizeof(${elem_styp}), ')
} }
if is_default_array { if is_default_array {
info := elem_type.unaliased_sym.info as ast.Array
depth := if g.table.sym(info.elem_type).kind == .array {
1
} else {
0
}
g.write('(${elem_styp}[]){') g.write('(${elem_styp}[]){')
g.write(g.type_default(node.elem_type)) g.write(g.type_default(node.elem_type))
g.write('}[0])') g.write('}[0], ${depth})')
} else if node.has_len && node.elem_type == ast.string_type { } else if node.has_len && node.elem_type == ast.string_type {
g.write('&(${elem_styp}[]){') g.write('&(${elem_styp}[]){')
g.write('_SLIT("")') g.write('_SLIT("")')
@ -291,7 +297,17 @@ fn (mut g Gen) array_init_with_fields(node ast.ArrayInit, elem_type Type, is_amp
} else { } else {
g.write('sizeof(${elem_styp}), ') g.write('sizeof(${elem_styp}), ')
} }
if is_default_array || is_default_map { if is_default_array {
info := elem_type.unaliased_sym.info as ast.Array
depth := if g.table.sym(info.elem_type).kind == .array {
1
} else {
0
}
g.write('(${elem_styp}[]){')
g.expr(node.default_expr)
g.write('}[0], ${depth})')
} else if is_default_map {
g.write('(${elem_styp}[]){') g.write('(${elem_styp}[]){')
g.expr(node.default_expr) g.expr(node.default_expr)
g.write('}[0])') g.write('}[0])')

View File

@ -0,0 +1,19 @@
import math
struct Cell {
p_i int
p_j int
f f64 = math.max_f64
g f64 = math.max_f64
h f64 = math.max_f64
}
fn test_array_init_element_size_equal_array_size() {
mut cells := [][]Cell{len: 1, init: []Cell{len: 1}}
println(cells)
assert '${cells[0][0].p_i}' == '0'
assert '${cells[0][0].p_j}' == '0'
assert '${cells[0][0].f}' == '1.7976931348623157e+308'
assert '${cells[0][0].g}' == '1.7976931348623157e+308'
assert '${cells[0][0].h}' == '1.7976931348623157e+308'
}