mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: array_init_with_default
This commit is contained in:
parent
5767576deb
commit
9b6ee8e77d
@ -27,6 +27,22 @@ fn __new_array(mylen int, cap int, elm_size int) array {
|
|||||||
return arr
|
return arr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn __new_array_with_default(mylen int, cap int, elm_size int, val voidptr) array {
|
||||||
|
cap_ := if cap < mylen { mylen } else { cap }
|
||||||
|
arr := array{
|
||||||
|
len: mylen
|
||||||
|
cap: cap_
|
||||||
|
element_size: elm_size
|
||||||
|
data: vcalloc(cap_ * elm_size)
|
||||||
|
}
|
||||||
|
if val != 0 {
|
||||||
|
for i in 0..arr.len {
|
||||||
|
C.memcpy(charptr(arr.data) + i*elm_size, val, elm_size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
// Private function, used by V (`nums := [1, 2, 3]`)
|
// Private function, used by V (`nums := [1, 2, 3]`)
|
||||||
fn new_array_from_c_array(len, cap, elm_size int, c_array voidptr) array {
|
fn new_array_from_c_array(len, cap, elm_size int, c_array voidptr) array {
|
||||||
cap_ := if cap < len { len } else { cap }
|
cap_ := if cap < len { len } else { cap }
|
||||||
|
@ -977,6 +977,12 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
|||||||
ast.ArrayInit {
|
ast.ArrayInit {
|
||||||
is_fixed_array_init = it.is_fixed
|
is_fixed_array_init = it.is_fixed
|
||||||
has_val = it.has_val
|
has_val = it.has_val
|
||||||
|
if it.has_default {
|
||||||
|
elem_type_str := g.typ(it.elem_type)
|
||||||
|
g.write('$elem_type_str ${elem_type_str}_val_t = ')
|
||||||
|
g.expr(it.default_expr)
|
||||||
|
g.writeln(';')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
@ -1239,7 +1245,7 @@ fn (mut g Gen) expr(node ast.Expr) {
|
|||||||
g.write("'$it.val'")
|
g.write("'$it.val'")
|
||||||
}
|
}
|
||||||
ast.ConcatExpr {
|
ast.ConcatExpr {
|
||||||
g.concat_expr(it)
|
g.concat_expr(it)
|
||||||
}
|
}
|
||||||
ast.EnumVal {
|
ast.EnumVal {
|
||||||
// g.write('${it.mod}${it.enum_name}_$it.val')
|
// g.write('${it.mod}${it.enum_name}_$it.val')
|
||||||
@ -3842,7 +3848,7 @@ fn (mut g Gen) array_init(it ast.ArrayInit) {
|
|||||||
// elem_sym := g.table.get_type_symbol(it.elem_type)
|
// elem_sym := g.table.get_type_symbol(it.elem_type)
|
||||||
elem_type_str := g.typ(it.elem_type)
|
elem_type_str := g.typ(it.elem_type)
|
||||||
if it.exprs.len == 0 {
|
if it.exprs.len == 0 {
|
||||||
g.write('__new_array(')
|
g.write('__new_array_with_default(')
|
||||||
if it.has_len {
|
if it.has_len {
|
||||||
g.expr(it.len_expr)
|
g.expr(it.len_expr)
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
@ -3855,7 +3861,12 @@ fn (mut g Gen) array_init(it ast.ArrayInit) {
|
|||||||
} else {
|
} else {
|
||||||
g.write('0, ')
|
g.write('0, ')
|
||||||
}
|
}
|
||||||
g.write('sizeof($elem_type_str))')
|
g.write('sizeof($elem_type_str), ')
|
||||||
|
if it.has_default {
|
||||||
|
g.write('&${elem_type_str}_val_t)')
|
||||||
|
} else {
|
||||||
|
g.write('0)')
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
len := it.exprs.len
|
len := it.exprs.len
|
||||||
|
@ -14,3 +14,11 @@ fn test_array_init() {
|
|||||||
d << 'bbb'
|
d << 'bbb'
|
||||||
'$d, $d.len, $d.cap' == "['aaa', 'bbb'], 2, 3"
|
'$d, $d.len, $d.cap' == "['aaa', 'bbb'], 2, 3"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_array_init_with_default() {
|
||||||
|
a := []int{len: 4, init: 2}
|
||||||
|
assert '$a' == '[2, 2, 2, 2]'
|
||||||
|
|
||||||
|
b := []string{len: 3, init: 'abc'}
|
||||||
|
assert '$b' == "['abc', 'abc', 'abc']"
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user