mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
"none" keyword for optionals + more memory fixes
This commit is contained in:
@@ -33,7 +33,34 @@ mut:
|
||||
//gen_types []string
|
||||
}
|
||||
|
||||
fn (f &Fn) find_var(name string) Var {
|
||||
fn (f &Fn) find_var(name string) ?Var {
|
||||
for i in 0 .. f.var_idx {
|
||||
if f.local_vars[i].name == name {
|
||||
return f.local_vars[i]
|
||||
}
|
||||
}
|
||||
return none
|
||||
}
|
||||
|
||||
fn (p &Parser) find_var_check_new_var(name string) ?Var {
|
||||
for i in 0 .. p.cur_fn.var_idx {
|
||||
if p.cur_fn.local_vars[i].name == name {
|
||||
return p.cur_fn.local_vars[i]
|
||||
}
|
||||
}
|
||||
// A hack to allow `newvar := Foo{ field: newvar }`
|
||||
// Declare the variable so that it can be used in the initialization
|
||||
if name == 'main__' + p.var_decl_name {
|
||||
return Var{
|
||||
name : p.var_decl_name
|
||||
typ : 'voidptr'
|
||||
is_mut : true
|
||||
}
|
||||
}
|
||||
return none
|
||||
}
|
||||
|
||||
fn (f &Fn) find_var2(name string) Var {
|
||||
for i in 0 .. f.var_idx {
|
||||
if f.local_vars[i].name == name {
|
||||
return f.local_vars[i]
|
||||
@@ -73,8 +100,10 @@ fn (p mut Parser) mark_var_changed(v Var) {
|
||||
}
|
||||
|
||||
fn (f mut Fn) known_var(name string) bool {
|
||||
v := f.find_var(name)
|
||||
return v.name.len > 0
|
||||
_ := f.find_var(name) or {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fn (f mut Fn) register_var(v Var) {
|
||||
@@ -819,9 +848,9 @@ fn (p mut Parser) fn_call_args(f mut Fn) &Fn {
|
||||
}
|
||||
p.check(.key_mut)
|
||||
var_name := p.lit
|
||||
v := p.cur_fn.find_var(var_name)
|
||||
if v.name == '' {
|
||||
v := p.cur_fn.find_var(var_name) or {
|
||||
p.error('`$arg.name` is a mutable argument, you need to provide a variable to modify: `$f.name(... mut a...)`')
|
||||
exit(1)
|
||||
}
|
||||
if !v.is_changed {
|
||||
p.mark_var_changed(v)
|
||||
|
||||
Reference in New Issue
Block a user