basic working test case

This commit is contained in:
Folkert 2021-12-02 20:30:58 +01:00
parent 8a21b42c20
commit d6ed2147ae
4 changed files with 27 additions and 5 deletions

View File

@ -5,15 +5,17 @@ const RocList = @import("list.zig").RocList;
const RocStr = @import("str.zig").RocStr;
pub fn NumParseResult(comptime T: type) type {
// on the roc side we sort by alignment; putting the errorcode last
// always works out (no number with smaller alignment than 1)
return extern struct {
errorcode: u8, // 0 indicates success
value: T,
errorcode: u8, // 0 indicates success
};
}
pub fn exportParseInt(comptime T: type, comptime name: []const u8) void {
comptime var f = struct {
fn func(input: T, buf: RocStr) callconv(.C) NumParseResult(T) {
fn func(buf: RocStr) callconv(.C) NumParseResult(T) {
// a radix of 0 will make zig determine the radix from the frefix:
// * A prefix of "0b" implies radix=2,
// * A prefix of "0o" implies radix=8,

View File

@ -1355,12 +1355,12 @@ fn str_to_num(symbol: Symbol, var_store: &mut VarStore) -> Def {
Access {
record_var,
ext_var: var_store.fresh(),
field: "errorcode".into(),
field: "b_errorcode".into(),
field_var: errorcode_var,
loc_expr: Box::new(no_region(Var(Symbol::ARG_2))),
},
),
(errorcode_var, int(errorcode_var, Variable::NATURAL, 0)),
(errorcode_var, int(errorcode_var, Variable::UNSIGNED8, 0)),
],
ret_var: bool_var,
}),
@ -1382,7 +1382,7 @@ fn str_to_num(symbol: Symbol, var_store: &mut VarStore) -> Def {
Access {
record_var,
ext_var: var_store.fresh(),
field: "value".into(),
field: "a_value".into(),
field_var: num_var,
loc_expr: Box::new(no_region(Var(Symbol::ARG_2))),
},

View File

@ -5285,6 +5285,9 @@ fn run_low_level<'a, 'ctx, 'env>(
_ => unreachable!(),
};
let string =
complex_bitcast(env.builder, string, env.str_list_c_abi().into(), "to_utf8");
call_bitcode_fn(env, &[string], intrinsic)
} else {
unreachable!()

View File

@ -1297,3 +1297,20 @@ fn str_trim_right_small_to_small_shared() {
(RocStr, RocStr)
);
}
#[test]
#[cfg(any(feature = "gen-llvm"))]
fn str_to_num() {
assert_evals_to!(
indoc!(
r#"
when Str.toNum "1" is
Ok n -> n
Err _ -> 0
"#
),
1,
i64
);
}