mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
feat: check errorcode in returned record for a value greater than 0
This commit is contained in:
parent
58f3559c98
commit
8a21b42c20
2 changed files with 90 additions and 3 deletions
|
@ -1326,7 +1326,94 @@ fn str_trim_right(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
|||
|
||||
/// Str.toNum : Str -> Result (Num *) [ InvalidNumStr ]*
|
||||
fn str_to_num(symbol: Symbol, var_store: &mut VarStore) -> Def {
|
||||
lowlevel_1(symbol, LowLevel::StrToNum, var_store)
|
||||
let bool_var = var_store.fresh();
|
||||
let str_var = var_store.fresh();
|
||||
let num_var = var_store.fresh();
|
||||
let ret_var = var_store.fresh();
|
||||
let record_var = var_store.fresh();
|
||||
|
||||
let errorcode_var = var_store.fresh();
|
||||
|
||||
// let arg_2 = RunLowLevel StrToNum arg_1
|
||||
//
|
||||
// if arg_2.errorcode then
|
||||
// Err InvalidNumStr
|
||||
// else
|
||||
// Ok arg_2.value
|
||||
|
||||
let cont = If {
|
||||
branch_var: ret_var,
|
||||
cond_var: bool_var,
|
||||
branches: vec![(
|
||||
// if-condition
|
||||
no_region(RunLowLevel {
|
||||
op: LowLevel::NumGt,
|
||||
args: vec![
|
||||
(
|
||||
errorcode_var,
|
||||
// arg_3.b
|
||||
Access {
|
||||
record_var,
|
||||
ext_var: var_store.fresh(),
|
||||
field: "errorcode".into(),
|
||||
field_var: errorcode_var,
|
||||
loc_expr: Box::new(no_region(Var(Symbol::ARG_2))),
|
||||
},
|
||||
),
|
||||
(errorcode_var, int(errorcode_var, Variable::NATURAL, 0)),
|
||||
],
|
||||
ret_var: bool_var,
|
||||
}),
|
||||
// overflow!
|
||||
no_region(tag(
|
||||
"Err",
|
||||
vec![tag("InvalidNumStr", Vec::new(), var_store)],
|
||||
var_store,
|
||||
)),
|
||||
)],
|
||||
final_else: Box::new(
|
||||
// all is well
|
||||
no_region(
|
||||
// Ok arg_2.value
|
||||
tag(
|
||||
"Ok",
|
||||
vec![
|
||||
// arg_3.a
|
||||
Access {
|
||||
record_var,
|
||||
ext_var: var_store.fresh(),
|
||||
field: "value".into(),
|
||||
field_var: num_var,
|
||||
loc_expr: Box::new(no_region(Var(Symbol::ARG_2))),
|
||||
},
|
||||
],
|
||||
var_store,
|
||||
),
|
||||
),
|
||||
),
|
||||
};
|
||||
|
||||
let def = crate::def::Def {
|
||||
loc_pattern: no_region(Pattern::Identifier(Symbol::ARG_2)),
|
||||
loc_expr: no_region(RunLowLevel {
|
||||
op: LowLevel::StrToNum,
|
||||
args: vec![(str_var, Var(Symbol::ARG_1))],
|
||||
ret_var: record_var,
|
||||
}),
|
||||
expr_var: record_var,
|
||||
pattern_vars: SendMap::default(),
|
||||
annotation: None,
|
||||
};
|
||||
|
||||
let body = LetNonRec(Box::new(def), Box::new(no_region(cont)), ret_var);
|
||||
|
||||
defn(
|
||||
symbol,
|
||||
vec![(str_var, Symbol::ARG_1)],
|
||||
var_store,
|
||||
body,
|
||||
ret_var,
|
||||
)
|
||||
}
|
||||
|
||||
/// Str.repeat : Str, Nat -> Str
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue