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

compiler: implement error_with_code(s string, code int)

Make available the integer code as errcode to callers/unwrappers
This commit is contained in:
Delyan Angelov 2019-10-25 22:03:42 +03:00 committed by Alexander Medvednikov
parent 9c5a359de3
commit 8364130a1f
3 changed files with 35 additions and 0 deletions

View File

@ -7,6 +7,7 @@ module builtin
struct Option {
data [255]byte
error string
ecode int
ok bool
is_none bool
}
@ -34,4 +35,12 @@ pub fn error(s string) Option {
}
}
pub fn error_with_code(s string, code int) Option {
return Option {
error: s
ecode: code
}
}

View File

@ -42,7 +42,14 @@ fn (p mut Parser) gen_var_decl(name string, is_static bool) string {
is_mut: false
is_used: true
})
p.register_var(Var {
name: 'errcode'
typ: 'int'
is_mut: false
is_used: true
})
p.genln('string err = $tmp . error;')
p.genln('int errcode = $tmp . ecode;')
p.statements()
p.genln('$typ $name = *($typ*) $tmp . data;')
if !p.returns && p.prev_tok2 != .key_continue && p.prev_tok2 != .key_break {
@ -114,7 +121,14 @@ fn (p mut Parser) gen_blank_identifier_assign() {
is_mut: false
is_used: true
})
p.register_var(Var {
name: 'errcode'
typ: 'int'
is_mut: false
is_used: true
})
p.genln('string err = $tmp . error;')
p.genln('int errcode = $tmp . ecode;')
p.statements()
p.returns = false
} else {

View File

@ -1,3 +1,15 @@
fn opt_err_with_code() ?string {return error_with_code('hi',137)}
fn test_err_with_code(){
v := opt_err_with_code() or {
assert err == 'hi'
assert errcode == 137
return
}
assert false
println(v) // suppress not used error
}
fn opt_err() ?string {return error('hi')}
fn test_err(){