mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
for: ranging through fixed size arrays
This commit is contained in:
parent
fb546f376e
commit
867f952d6b
@ -141,18 +141,19 @@ fn (p mut Parser) for_st() {
|
|||||||
if p.pref.x64 {
|
if p.pref.x64 {
|
||||||
label = p.x64.gen_loop_start(expr.int())
|
label = p.x64.gen_loop_start(expr.int())
|
||||||
//to = range_expr.int() // TODO why empty?
|
//to = range_expr.int() // TODO why empty?
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
is_arr := typ.contains('array')
|
is_arr := typ.contains('array')
|
||||||
|
is_fixed := typ.starts_with('[')
|
||||||
is_str := typ == 'string'
|
is_str := typ == 'string'
|
||||||
if !is_arr && !is_str && !is_range && !is_variadic_arg {
|
if !is_arr && !is_str && !is_range && !is_fixed && !is_variadic_arg {
|
||||||
p.error('cannot range over type `$typ`')
|
p.error('cannot range over type `$typ`')
|
||||||
}
|
}
|
||||||
if !is_variadic_arg {
|
if !is_variadic_arg {
|
||||||
if p.is_js {
|
if p.is_js {
|
||||||
p.genln('var $tmp = $expr;')
|
p.genln('var $tmp = $expr;')
|
||||||
} else {
|
} else if !is_fixed { // Don't copy if it's a fixed array
|
||||||
p.genln('$typ $tmp = $expr;')
|
p.genln('$typ $tmp = $expr;')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -174,6 +175,10 @@ fn (p mut Parser) for_st() {
|
|||||||
typ = 'byte'
|
typ = 'byte'
|
||||||
p.gen_for_str_header(i, tmp, typ, val)
|
p.gen_for_str_header(i, tmp, typ, val)
|
||||||
}
|
}
|
||||||
|
else if is_fixed {
|
||||||
|
typ = typ.all_after(']')
|
||||||
|
p.gen_for_fixed_header(i, expr, typ, val)
|
||||||
|
}
|
||||||
// println('for typ=$typ vartyp=$var_typ')
|
// println('for typ=$typ vartyp=$var_typ')
|
||||||
// Register temp var
|
// Register temp var
|
||||||
if val != '_' {
|
if val != '_' {
|
||||||
@ -201,6 +206,6 @@ fn (p mut Parser) for_st() {
|
|||||||
p.returns = false // TODO handle loops that are guaranteed to return
|
p.returns = false // TODO handle loops that are guaranteed to return
|
||||||
if label > 0 {
|
if label > 0 {
|
||||||
p.x64.gen_loop_end(to, label)
|
p.x64.gen_loop_end(to, label)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,6 +365,12 @@ fn (p mut Parser) gen_for_header(i, tmp, var_typ, val string) {
|
|||||||
p.genln('$var_typ $val = (($var_typ *) $tmp . data)[$i];')
|
p.genln('$var_typ $val = (($var_typ *) $tmp . data)[$i];')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (p mut Parser) gen_for_fixed_header(i, tmp, var_typ, val string) {
|
||||||
|
p.genln('for (int $i = 0; $i < sizeof(${tmp}) / sizeof($tmp [0]); $i++) {')
|
||||||
|
if val == '_' { return }
|
||||||
|
p.genln('$var_typ $val = $tmp[$i];')
|
||||||
|
}
|
||||||
|
|
||||||
fn (p mut Parser) gen_for_str_header(i, tmp, var_typ, val string) {
|
fn (p mut Parser) gen_for_str_header(i, tmp, var_typ, val string) {
|
||||||
// TODO var_typ is always byte
|
// TODO var_typ is always byte
|
||||||
//p.genln('array_byte bytes_$tmp = string_bytes( $tmp );')
|
//p.genln('array_byte bytes_$tmp = string_bytes( $tmp );')
|
||||||
|
Loading…
Reference in New Issue
Block a user