mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
fix mutable array args
This commit is contained in:
parent
32aae80a64
commit
7ea688aa43
@ -631,8 +631,7 @@ fn (p mut Parser) fn_args(f mut Fn) {
|
|||||||
if !p.first_run() && !p.table.known_type(typ2) {
|
if !p.first_run() && !p.table.known_type(typ2) {
|
||||||
p.error('fn_args: unknown type $typ2')
|
p.error('fn_args: unknown type $typ2')
|
||||||
}
|
}
|
||||||
if is_mut {
|
if is_mut {
|
||||||
// && !typ2.starts_with('array_') {
|
|
||||||
typ2 += '*'
|
typ2 += '*'
|
||||||
}
|
}
|
||||||
v := Var {
|
v := Var {
|
||||||
|
@ -1736,11 +1736,12 @@ fn (p mut Parser) dot(str_typ string, method_ph int) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) index_expr(typ string, fn_ph int) string {
|
fn (p mut Parser) index_expr(typ string, fn_ph int) string {
|
||||||
//if p.fileis('main.v') {
|
|
||||||
//println('index expr typ=$typ')
|
|
||||||
//}
|
|
||||||
// a[0]
|
// a[0]
|
||||||
v := p.expr_var
|
v := p.expr_var
|
||||||
|
//if p.fileis('fn_test.v') {
|
||||||
|
//println('index expr typ=$typ')
|
||||||
|
//println(v.name)
|
||||||
|
//}
|
||||||
is_map := typ.starts_with('map_')
|
is_map := typ.starts_with('map_')
|
||||||
is_str := typ == 'string'
|
is_str := typ == 'string'
|
||||||
is_arr0 := typ.starts_with('array_')
|
is_arr0 := typ.starts_with('array_')
|
||||||
@ -1912,7 +1913,11 @@ fn (p mut Parser) index_expr(typ string, fn_ph int) string {
|
|||||||
p.gen('$index_expr ]')
|
p.gen('$index_expr ]')
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p.gen('( *($typ*) array__get($index_expr) )')
|
if is_ptr {
|
||||||
|
p.gen('( *($typ*) array__get(* $index_expr) )')
|
||||||
|
} else {
|
||||||
|
p.gen('( *($typ*) array__get($index_expr) )')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if is_str && !p.builtin_pkg {
|
else if is_str && !p.builtin_pkg {
|
||||||
@ -2076,13 +2081,13 @@ fn (p mut Parser) expression() string {
|
|||||||
|
|
||||||
fn (p mut Parser) term() string {
|
fn (p mut Parser) term() string {
|
||||||
line_nr := p.scanner.line_nr
|
line_nr := p.scanner.line_nr
|
||||||
if p.fileis('fn_test') {
|
//if p.fileis('fn_test') {
|
||||||
println('\nterm() $line_nr')
|
//println('\nterm() $line_nr')
|
||||||
}
|
//}
|
||||||
typ := p.unary()
|
typ := p.unary()
|
||||||
if p.fileis('fn_test') {
|
//if p.fileis('fn_test') {
|
||||||
println('2: $line_nr')
|
//println('2: $line_nr')
|
||||||
}
|
//}
|
||||||
// `*` on a newline? Can't be multiplication, only dereference
|
// `*` on a newline? Can't be multiplication, only dereference
|
||||||
if p.tok == .mul && line_nr != p.scanner.line_nr {
|
if p.tok == .mul && line_nr != p.scanner.line_nr {
|
||||||
return typ
|
return typ
|
||||||
@ -3117,13 +3122,6 @@ fn (p mut Parser) for_st() {
|
|||||||
// TODO don't call map_get() for each key, fetch values while traversing
|
// TODO don't call map_get() for each key, fetch values while traversing
|
||||||
// the tree (replace `map_keys()` above with `map_key_vals()`)
|
// the tree (replace `map_keys()` above with `map_key_vals()`)
|
||||||
p.genln('$var_typ $val = $def; map_get($tmp, $i, & $val);')
|
p.genln('$var_typ $val = $def; map_get($tmp, $i, & $val);')
|
||||||
|
|
||||||
/*
|
|
||||||
p.genln('for (int l = 0; l < $tmp . entries.len; l++) {')
|
|
||||||
p.genln('Entry entry = *((Entry*) (array__get($tmp .entries, l)));')
|
|
||||||
p.genln('string $i = entry.key;')
|
|
||||||
p.genln('$var_typ $val; map_get($tmp, $i, & $val);')
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// `for val in vals`
|
// `for val in vals`
|
||||||
|
@ -63,6 +63,24 @@ fn myprint(s string, ..) {
|
|||||||
println('/* /* comment */ */')
|
println('/* /* comment */ */')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn modify_array(a mut []int) {
|
||||||
|
a[0] = 10
|
||||||
|
for i in 0..a.len {
|
||||||
|
a[i] = a[i] * 2
|
||||||
|
}
|
||||||
|
a << 888
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_mut() {
|
||||||
|
mut nums := [1, 2, 3]
|
||||||
|
modify_array(mut nums)
|
||||||
|
assert nums.len == 4
|
||||||
|
assert nums[0] == 20
|
||||||
|
assert nums[1] == 4
|
||||||
|
assert nums[2] == 6
|
||||||
|
assert nums[3] == 888
|
||||||
|
}
|
||||||
|
|
||||||
fn test_fns() {
|
fn test_fns() {
|
||||||
// no asserts for now, just test function declarations above
|
// no asserts for now, just test function declarations above
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user