From f90d9a74bd9649d8e0b81d860dbaa3d6a7ca7ecb Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Wed, 29 Dec 2021 21:08:16 +0000 Subject: [PATCH] Do not inline builtin wrapper for Str.toNum --- compiler/gen_wasm/src/low_level.rs | 29 ++++++++++++++--------------- compiler/module/src/low_level.rs | 28 ++++++++++++++-------------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/compiler/gen_wasm/src/low_level.rs b/compiler/gen_wasm/src/low_level.rs index 93c22bfd27..b7ba2beeb4 100644 --- a/compiler/gen_wasm/src/low_level.rs +++ b/compiler/gen_wasm/src/low_level.rs @@ -49,22 +49,21 @@ pub fn dispatch_low_level<'a>( } StrCountGraphemes => return BuiltinCall(bitcode::STR_COUNT_GRAPEHEME_CLUSTERS), StrToNum => { - if let Layout::Union(UnionLayout::NonRecursive(union_layout)) = mono_layout { - // match on the return layout to figure out which zig builtin we need - let intrinsic = match union_layout[1][0] { - Layout::Builtin(Builtin::Int(int_width)) => &bitcode::STR_TO_INT[int_width], - Layout::Builtin(Builtin::Float(float_width)) => { - &bitcode::STR_TO_FLOAT[float_width] - } - Layout::Builtin(Builtin::Decimal) => bitcode::DEC_FROM_STR, - rest => internal_error!("Unexpected builtin {:?} for StrToNum", rest), - }; + let number_layout = match mono_layout { + Layout::Union(UnionLayout::NonRecursive(tags)) => tags[1][0], + Layout::Struct(fields) => fields[0], // TODO: why is it sometimes a struct? + _ => internal_error!("Unexpected mono layout {:?} for StrToNum", mono_layout), + }; + // match on the return layout to figure out which zig builtin we need + let intrinsic = match number_layout { + Layout::Builtin(Builtin::Int(int_width)) => &bitcode::STR_TO_INT[int_width], + Layout::Builtin(Builtin::Float(float_width)) => &bitcode::STR_TO_FLOAT[float_width], + Layout::Builtin(Builtin::Decimal) => bitcode::DEC_FROM_STR, + rest => internal_error!("Unexpected builtin {:?} for StrToNum", rest), + }; - return BuiltinCall(intrinsic); - } else { - internal_error!("Unexpected mono layout {:?} for StrToNum", mono_layout); - } - } // choose builtin based on storage size + return BuiltinCall(intrinsic); + } StrFromInt => { // This does not get exposed in user space. We switched to NumToStr instead. // We can probably just leave this as NotImplemented. We may want remove this LowLevel. diff --git a/compiler/module/src/low_level.rs b/compiler/module/src/low_level.rs index 1673c55d3d..7c2607cffb 100644 --- a/compiler/module/src/low_level.rs +++ b/compiler/module/src/low_level.rs @@ -198,20 +198,20 @@ impl LowLevel { Symbol::STR_TRIM => Some(StrTrim), Symbol::STR_TRIM_LEFT => Some(StrTrimLeft), Symbol::STR_TRIM_RIGHT => Some(StrTrimRight), - Symbol::STR_TO_DEC => Some(StrToNum), - Symbol::STR_TO_F64 => Some(StrToNum), - Symbol::STR_TO_F32 => Some(StrToNum), - Symbol::STR_TO_NAT => Some(StrToNum), - Symbol::STR_TO_U128 => Some(StrToNum), - Symbol::STR_TO_I128 => Some(StrToNum), - Symbol::STR_TO_U64 => Some(StrToNum), - Symbol::STR_TO_I64 => Some(StrToNum), - Symbol::STR_TO_U32 => Some(StrToNum), - Symbol::STR_TO_I32 => Some(StrToNum), - Symbol::STR_TO_U16 => Some(StrToNum), - Symbol::STR_TO_I16 => Some(StrToNum), - Symbol::STR_TO_U8 => Some(StrToNum), - Symbol::STR_TO_I8 => Some(StrToNum), + Symbol::STR_TO_DEC => None, + Symbol::STR_TO_F64 => None, + Symbol::STR_TO_F32 => None, + Symbol::STR_TO_NAT => None, + Symbol::STR_TO_U128 => None, + Symbol::STR_TO_I128 => None, + Symbol::STR_TO_U64 => None, + Symbol::STR_TO_I64 => None, + Symbol::STR_TO_U32 => None, + Symbol::STR_TO_I32 => None, + Symbol::STR_TO_U16 => None, + Symbol::STR_TO_I16 => None, + Symbol::STR_TO_U8 => None, + Symbol::STR_TO_I8 => None, Symbol::LIST_LEN => Some(ListLen), Symbol::LIST_GET => None, Symbol::LIST_SET => None,