From 41a89fa7736a2a8d489ffeeac0fc400c7ddd6633 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Thu, 7 Feb 2019 13:26:45 +0200 Subject: [PATCH] Fix default comparator for strings (#462) --- std/assembly/internal/sort.ts | 9 +- tests/compiler/std/array.optimized.wat | 248 +++++------ tests/compiler/std/array.ts | 7 +- tests/compiler/std/array.untouched.wat | 546 +++++++++++-------------- 4 files changed, 371 insertions(+), 439 deletions(-) diff --git a/std/assembly/internal/sort.ts b/std/assembly/internal/sort.ts index 2f3dd0fe..8d50efb1 100644 --- a/std/assembly/internal/sort.ts +++ b/std/assembly/internal/sort.ts @@ -36,8 +36,13 @@ export function COMPARATOR(): (a: T, b: T) => i32 { } } else if (isString()) { return (a: T, b: T): i32 => { - var sa = a, sb = b; - return compareUnsafe(sa, 0, sb, 0, min(sa.length, sb.length)); + if (a === b || a === null || b === null) return 0; + var alen = (a).length; + var blen = (b).length; + if (!alen && !blen) return 0; + if (!alen) return -1; + if (!blen) return 1; + return compareUnsafe(a, 0, b, 0, min(alen, blen)); }; } else { return (a: T, b: T): i32 => ((a > b) - (a < b)); diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index 9cc03243..4b804b7c 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -26,6 +26,7 @@ (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) (type $FUNCSIG$viii (func (param i32 i32 i32))) (type $FUNCSIG$i (func (result i32))) + (type $FUNCSIG$vi (func (param i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "Math" "random" (func $~lib/bindings/Math/random (result f64))) (memory $0 1) @@ -337,8 +338,8 @@ (data (i32.const 8400) "\c0 \00\00\01") (data (i32.const 8408) "\04\00\00\00\00\00\00\00\d0 ") (data (i32.const 8424) "\d8 \00\00\01") - (table $0 57 funcref) - (elem (i32.const 0) $null $start~anonymous|1 $start~anonymous|2 $start~anonymous|3 $start~anonymous|4 $start~anonymous|3 $start~anonymous|6 $start~anonymous|7 $start~anonymous|8 $start~anonymous|9 $start~anonymous|10 $start~anonymous|11 $start~anonymous|12 $start~anonymous|13 $start~anonymous|14 $start~anonymous|15 $start~anonymous|16 $start~anonymous|17 $start~anonymous|18 $start~anonymous|17 $start~anonymous|20 $start~anonymous|21 $start~anonymous|22 $start~anonymous|23 $start~anonymous|24 $start~anonymous|25 $start~anonymous|26 $start~anonymous|27 $start~anonymous|28 $start~anonymous|29 $start~anonymous|30 $start~anonymous|30 $start~anonymous|32 $start~anonymous|33 $start~anonymous|34 $start~anonymous|30 $start~anonymous|36 $start~anonymous|30 $start~anonymous|30 $start~anonymous|32 $start~anonymous|33 $start~anonymous|34 $start~anonymous|30 $start~anonymous|36 $~lib/internal/sort/COMPARATOR~anonymous|44 $~lib/internal/sort/COMPARATOR~anonymous|45 $~lib/internal/sort/COMPARATOR~anonymous|46 $~lib/internal/sort/COMPARATOR~anonymous|47 $~lib/internal/sort/COMPARATOR~anonymous|46 $~lib/internal/sort/COMPARATOR~anonymous|46 $start~anonymous|50 $~lib/internal/sort/COMPARATOR~anonymous|46 $start~anonymous|50 $start~anonymous|53 $start~anonymous|54 $start~anonymous|55 $start~anonymous|55) + (table $0 56 funcref) + (elem (i32.const 0) $null $start~anonymous|1 $start~anonymous|2 $start~anonymous|3 $start~anonymous|4 $start~anonymous|3 $start~anonymous|6 $start~anonymous|7 $start~anonymous|8 $start~anonymous|9 $start~anonymous|10 $start~anonymous|11 $start~anonymous|12 $start~anonymous|13 $start~anonymous|14 $start~anonymous|15 $start~anonymous|16 $start~anonymous|17 $start~anonymous|18 $start~anonymous|17 $start~anonymous|20 $start~anonymous|21 $start~anonymous|22 $start~anonymous|23 $start~anonymous|24 $start~anonymous|25 $start~anonymous|26 $start~anonymous|27 $start~anonymous|28 $start~anonymous|29 $start~anonymous|30 $start~anonymous|30 $start~anonymous|32 $start~anonymous|33 $start~anonymous|34 $start~anonymous|30 $start~anonymous|36 $start~anonymous|30 $start~anonymous|30 $start~anonymous|32 $start~anonymous|33 $start~anonymous|34 $start~anonymous|30 $start~anonymous|36 $~lib/internal/sort/COMPARATOR~anonymous|44 $~lib/internal/sort/COMPARATOR~anonymous|45 $~lib/internal/sort/COMPARATOR~anonymous|46 $~lib/internal/sort/COMPARATOR~anonymous|47 $~lib/internal/sort/COMPARATOR~anonymous|46 $~lib/internal/sort/COMPARATOR~anonymous|46 $start~anonymous|50 $~lib/internal/sort/COMPARATOR~anonymous|46 $start~anonymous|50 $start~anonymous|53 $start~anonymous|54 $~lib/internal/sort/COMPARATOR~anonymous|55) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $~lib/internal/number/_K (mut i32) (i32.const 0)) @@ -5965,9 +5966,10 @@ end local.get $3 ) - (func $~lib/string/String.__gt (; 100 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/sort/COMPARATOR~anonymous|55 (; 100 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) + (local $4 i32) local.get $0 local.get $1 i32.eq @@ -5995,12 +5997,25 @@ local.set $3 local.get $0 i32.load - local.tee $2 + local.tee $4 i32.eqz + local.tee $2 + if + local.get $3 + i32.eqz + local.set $2 + end + local.get $2 if i32.const 0 return end + local.get $4 + i32.eqz + if + i32.const -1 + return + end local.get $3 i32.eqz if @@ -6009,80 +6024,35 @@ end local.get $0 local.get $1 - local.get $2 - local.get $3 - local.get $2 - local.get $3 - i32.lt_s - select - call $~lib/internal/string/compareUnsafe - i32.const 0 - i32.gt_s - ) - (func $~lib/string/String.__lt (; 101 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - local.get $0 - local.get $1 - i32.eq + local.get $4 local.tee $2 - i32.eqz - if - local.get $0 - i32.eqz - local.set $2 - end - local.get $2 - i32.eqz - if - local.get $1 - i32.eqz - local.set $2 - end - local.get $2 - if - i32.const 0 - return - end - local.get $0 - i32.load - local.set $2 - local.get $1 - i32.load - local.tee $3 - i32.eqz - if - i32.const 0 - return - end - local.get $2 - i32.eqz - if - i32.const 1 - return - end - local.get $0 - local.get $1 - local.get $2 local.get $3 local.get $2 local.get $3 i32.lt_s select call $~lib/internal/string/compareUnsafe - i32.const 0 - i32.lt_s ) - (func $start~anonymous|55 (; 102 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/assertSorted|trampoline (; 101 ;) (type $FUNCSIG$vi) (param $0 i32) + (local $1 i32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argc + i32.const 1 + i32.sub + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + i32.const 55 + local.set $1 + end local.get $0 local.get $1 - call $~lib/string/String.__gt - local.get $0 - local.get $1 - call $~lib/string/String.__lt - i32.sub + call $std/array/assertSorted> ) - (func $~lib/string/String.__eq (; 103 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 102 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 local.get $1 @@ -6121,7 +6091,7 @@ call $~lib/internal/string/compareUnsafe i32.eqz ) - (func $std/array/isArraysEqual (; 104 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/isArraysEqual (; 103 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -6199,7 +6169,7 @@ end i32.const 1 ) - (func $~lib/internal/string/allocateUnsafe (; 105 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 104 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) local.get $0 i32.const 0 @@ -6232,7 +6202,7 @@ i32.store local.get $1 ) - (func $~lib/string/String#charAt (; 106 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/string/String#charAt (; 105 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) local.get $0 i32.const 2928 @@ -6254,7 +6224,7 @@ i32.store16 offset=4 local.get $1 ) - (func $~lib/internal/string/copyUnsafe (; 107 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (func $~lib/internal/string/copyUnsafe (; 106 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) local.get $1 i32.const 1 i32.shl @@ -6274,7 +6244,7 @@ i32.shl call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 108 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 107 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -6321,7 +6291,7 @@ call $~lib/internal/string/copyUnsafe local.get $2 ) - (func $~lib/string/String.__concat (; 109 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 108 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) local.get $0 i32.const 4144 local.get $0 @@ -6329,7 +6299,7 @@ local.get $1 call $~lib/string/String#concat ) - (func $std/array/createRandomString (; 110 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomString (; 109 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) i32.const 3904 @@ -6360,7 +6330,7 @@ end local.get $1 ) - (func $std/array/createRandomStringArray (; 111 ;) (type $FUNCSIG$i) (result i32) + (func $std/array/createRandomStringArray (; 110 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) i32.const 400 @@ -6389,7 +6359,7 @@ end local.get $1 ) - (func $~lib/string/String#substring (; 112 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#substring (; 111 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -6471,7 +6441,7 @@ call $~lib/internal/string/copyUnsafe local.get $2 ) - (func $~lib/array/Array#join (; 113 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 112 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -6617,7 +6587,7 @@ end local.get $3 ) - (func $~lib/internal/number/decimalCount32 (; 114 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 113 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.const 100000 i32.lt_u @@ -6671,7 +6641,7 @@ end end ) - (func $~lib/internal/number/utoa32_lut (; 115 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 114 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) i32.const 4832 @@ -6781,7 +6751,7 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/itoa32 (; 116 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa32 (; 115 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -6819,7 +6789,7 @@ end local.get $2 ) - (func $~lib/internal/number/itoa_stream (; 117 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 116 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $1 i32.const 1 i32.shl @@ -6863,7 +6833,7 @@ end local.get $2 ) - (func $~lib/array/Array#join (; 118 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 117 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -6979,7 +6949,7 @@ end local.get $3 ) - (func $~lib/internal/number/utoa32 (; 119 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/utoa32 (; 118 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) local.get $0 @@ -6998,7 +6968,7 @@ call $~lib/internal/number/utoa32_lut local.get $2 ) - (func $~lib/internal/number/itoa_stream (; 120 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 119 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) local.get $1 i32.const 1 @@ -7023,7 +6993,7 @@ call $~lib/internal/number/utoa32_lut local.get $3 ) - (func $~lib/array/Array#join (; 121 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 120 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -7139,7 +7109,7 @@ end local.get $3 ) - (func $~lib/internal/number/genDigits (; 122 ;) (type $iIiIiIii) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) + (func $~lib/internal/number/genDigits (; 121 ;) (type $iIiIiIii) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) (local $7 i32) (local $8 i64) (local $9 i32) @@ -7553,7 +7523,7 @@ local.get $10 end ) - (func $~lib/internal/number/prettify (; 123 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/prettify (; 122 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -7827,7 +7797,7 @@ end end ) - (func $~lib/internal/number/dtoa_core (; 124 ;) (type $iFi) (param $0 i32) (param $1 f64) (result i32) + (func $~lib/internal/number/dtoa_core (; 123 ;) (type $iFi) (param $0 i32) (param $1 f64) (result i32) (local $2 i64) (local $3 i64) (local $4 i32) @@ -8143,7 +8113,7 @@ local.get $12 i32.add ) - (func $~lib/internal/number/dtoa (; 125 ;) (type $Fi) (param $0 f64) (result i32) + (func $~lib/internal/number/dtoa (; 124 ;) (type $Fi) (param $0 f64) (result i32) (local $1 i32) (local $2 i32) local.get $0 @@ -8196,7 +8166,7 @@ end local.get $1 ) - (func $~lib/internal/number/dtoa_stream (; 126 ;) (type $iiFi) (param $0 i32) (param $1 i32) (param $2 f64) (result i32) + (func $~lib/internal/number/dtoa_stream (; 125 ;) (type $iiFi) (param $0 i32) (param $1 i32) (param $2 f64) (result i32) local.get $1 i32.const 1 i32.shl @@ -8269,7 +8239,7 @@ local.get $2 call $~lib/internal/number/dtoa_core ) - (func $~lib/array/Array#join (; 127 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 126 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -8386,7 +8356,7 @@ end local.get $1 ) - (func $~lib/array/Array#join (; 128 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 127 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -8522,7 +8492,7 @@ end local.get $4 ) - (func $~lib/array/Array#join (; 129 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array#join (; 128 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -8652,7 +8622,7 @@ end local.get $3 ) - (func $~lib/internal/number/itoa_stream (; 130 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 129 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) local.get $1 i32.const 1 @@ -8707,7 +8677,7 @@ end local.get $1 ) - (func $~lib/array/Array#join (; 131 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 130 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -8820,7 +8790,7 @@ end local.get $1 ) - (func $~lib/internal/number/itoa_stream (; 132 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 131 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $1 i32.const 1 i32.shl @@ -8850,7 +8820,7 @@ call $~lib/internal/number/utoa32_lut local.get $1 ) - (func $~lib/array/Array#join (; 133 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 132 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -8967,7 +8937,7 @@ end local.get $1 ) - (func $~lib/internal/number/decimalCount64 (; 134 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/decimalCount64 (; 133 ;) (type $Ii) (param $0 i64) (result i32) local.get $0 i64.const 1000000000000000 i64.lt_u @@ -9021,7 +8991,7 @@ end end ) - (func $~lib/internal/number/utoa64_lut (; 135 ;) (type $iIiv) (param $0 i32) (param $1 i64) (param $2 i32) + (func $~lib/internal/number/utoa64_lut (; 134 ;) (type $iIiv) (param $0 i32) (param $1 i64) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -9118,7 +9088,7 @@ local.get $2 call $~lib/internal/number/utoa32_lut ) - (func $~lib/internal/number/utoa64 (; 136 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/utoa64 (; 135 ;) (type $Ii) (param $0 i64) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -9154,7 +9124,7 @@ end local.get $2 ) - (func $~lib/internal/number/itoa_stream (; 137 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) + (func $~lib/internal/number/itoa_stream (; 136 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) (local $3 i32) local.get $1 i32.const 1 @@ -9194,7 +9164,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 138 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 137 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -9311,7 +9281,7 @@ end local.get $1 ) - (func $~lib/internal/number/itoa64 (; 139 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/itoa64 (; 138 ;) (type $Ii) (param $0 i64) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -9370,7 +9340,7 @@ end local.get $3 ) - (func $~lib/internal/number/itoa_stream (; 140 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) + (func $~lib/internal/number/itoa_stream (; 139 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) (local $3 i32) (local $4 i32) local.get $1 @@ -9433,7 +9403,7 @@ end local.get $4 ) - (func $~lib/array/Array#join (; 141 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 140 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -9550,7 +9520,7 @@ end local.get $1 ) - (func $~lib/array/Array>#join (; 142 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array>#join (; 141 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -9645,7 +9615,7 @@ end local.get $1 ) - (func $~lib/internal/number/itoa_stream (; 143 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 142 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $1 i32.const 1 i32.shl @@ -9675,7 +9645,7 @@ call $~lib/internal/number/utoa32_lut local.get $1 ) - (func $~lib/array/Array#join (; 144 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 143 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9787,7 +9757,7 @@ end local.get $3 ) - (func $~lib/array/Array>#join (; 145 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array>#join (; 144 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -9882,7 +9852,7 @@ end local.get $1 ) - (func $~lib/array/Array>#join (; 146 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#join (; 145 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9978,7 +9948,7 @@ local.get $2 end ) - (func $~lib/array/Array>>#join (; 147 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array>>#join (; 146 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -10073,7 +10043,7 @@ end local.get $1 ) - (func $start (; 148 ;) (type $v) + (func $start (; 147 ;) (type $v) (local $0 i32) (local $1 i32) i32.const 8432 @@ -14214,9 +14184,10 @@ global.get $std/array/reversedElements512 i32.const 54 call $std/array/assertSorted> + i32.const 1 + global.set $~argc global.get $std/array/randomStringsActual - i32.const 55 - call $std/array/assertSorted> + call $std/array/assertSorted|trampoline global.get $std/array/randomStringsActual global.get $std/array/randomStringsExpected call $std/array/isArraysEqual @@ -14224,16 +14195,17 @@ if i32.const 0 i32.const 120 - i32.const 900 + i32.const 901 i32.const 0 call $~lib/env/abort unreachable end call $std/array/createRandomStringArray global.set $std/array/randomStrings400 + i32.const 1 + global.set $~argc global.get $std/array/randomStrings400 - i32.const 56 - call $std/array/assertSorted> + call $std/array/assertSorted|trampoline call $~lib/array/Array#join i32.const 4248 call $~lib/string/String.__eq @@ -14241,7 +14213,7 @@ if i32.const 0 i32.const 120 - i32.const 909 + i32.const 910 i32.const 0 call $~lib/env/abort unreachable @@ -14255,7 +14227,7 @@ if i32.const 0 i32.const 120 - i32.const 910 + i32.const 911 i32.const 0 call $~lib/env/abort unreachable @@ -14269,7 +14241,7 @@ if i32.const 0 i32.const 120 - i32.const 911 + i32.const 912 i32.const 0 call $~lib/env/abort unreachable @@ -14283,7 +14255,7 @@ if i32.const 0 i32.const 120 - i32.const 912 + i32.const 913 i32.const 0 call $~lib/env/abort unreachable @@ -14295,7 +14267,7 @@ if i32.const 0 i32.const 120 - i32.const 913 + i32.const 914 i32.const 0 call $~lib/env/abort unreachable @@ -14309,7 +14281,7 @@ if i32.const 0 i32.const 120 - i32.const 914 + i32.const 915 i32.const 0 call $~lib/env/abort unreachable @@ -14349,7 +14321,7 @@ if i32.const 0 i32.const 120 - i32.const 916 + i32.const 917 i32.const 0 call $~lib/env/abort unreachable @@ -14363,7 +14335,7 @@ if i32.const 0 i32.const 120 - i32.const 920 + i32.const 921 i32.const 0 call $~lib/env/abort unreachable @@ -14377,7 +14349,7 @@ if i32.const 0 i32.const 120 - i32.const 921 + i32.const 922 i32.const 0 call $~lib/env/abort unreachable @@ -14391,7 +14363,7 @@ if i32.const 0 i32.const 120 - i32.const 922 + i32.const 923 i32.const 0 call $~lib/env/abort unreachable @@ -14405,7 +14377,7 @@ if i32.const 0 i32.const 120 - i32.const 923 + i32.const 924 i32.const 0 call $~lib/env/abort unreachable @@ -14417,7 +14389,7 @@ if i32.const 0 i32.const 120 - i32.const 925 + i32.const 926 i32.const 0 call $~lib/env/abort unreachable @@ -14429,7 +14401,7 @@ if i32.const 0 i32.const 120 - i32.const 926 + i32.const 927 i32.const 0 call $~lib/env/abort unreachable @@ -14441,7 +14413,7 @@ if i32.const 0 i32.const 120 - i32.const 927 + i32.const 928 i32.const 0 call $~lib/env/abort unreachable @@ -14453,7 +14425,7 @@ if i32.const 0 i32.const 120 - i32.const 928 + i32.const 929 i32.const 0 call $~lib/env/abort unreachable @@ -14467,7 +14439,7 @@ if i32.const 0 i32.const 120 - i32.const 929 + i32.const 930 i32.const 0 call $~lib/env/abort unreachable @@ -14481,7 +14453,7 @@ if i32.const 0 i32.const 120 - i32.const 930 + i32.const 931 i32.const 0 call $~lib/env/abort unreachable @@ -14494,7 +14466,7 @@ if i32.const 0 i32.const 120 - i32.const 933 + i32.const 934 i32.const 0 call $~lib/env/abort unreachable @@ -14507,7 +14479,7 @@ if i32.const 0 i32.const 120 - i32.const 936 + i32.const 937 i32.const 0 call $~lib/env/abort unreachable @@ -14520,13 +14492,13 @@ if i32.const 0 i32.const 120 - i32.const 939 + i32.const 940 i32.const 0 call $~lib/env/abort unreachable end ) - (func $null (; 149 ;) (type $v) + (func $null (; 148 ;) (type $v) nop ) ) diff --git a/tests/compiler/std/array.ts b/tests/compiler/std/array.ts index 445b5a83..777d62a4 100644 --- a/tests/compiler/std/array.ts +++ b/tests/compiler/std/array.ts @@ -806,7 +806,7 @@ function createRandomStringArray(size: i32): string[] { return arr; } -function assertSorted(arr: Array, comparator: (a: T, b: T) => i32): void { +function assertSorted(arr: Array, comparator: (a: T, b: T) => i32 = COMPARATOR()): void { assert(isSorted(arr.sort(comparator), comparator)); } @@ -896,11 +896,12 @@ assertSorted>(reversedElements512, (a: Proxy, b: Proxy): i3 var randomStringsActual: string[] = ["a", "b", "a", "ab", "ba", "", null]; var randomStringsExpected: string[] = ["", "a", "a", "ab", "b", "ba", null]; -assertSorted(randomStringsActual, (a: string, b: string): i32 => (a > b) - (a < b)); + +assertSorted(randomStringsActual); assert(isArraysEqual(randomStringsActual, randomStringsExpected)); var randomStrings400 = createRandomStringArray(400); -assertSorted(randomStrings400, (a: string, b: string): i32 => (a > b) - (a < b)); +assertSorted(randomStrings400); // Array#join ////////////////////////////////////////////////////////////////////////////////////// diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index d4aa9289..33ea7569 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -333,8 +333,8 @@ (data (i32.const 8400) "\c0 \00\00\01\00\00\00") (data (i32.const 8408) "\04\00\00\00\00\00\00\00\d0 \00\00\00\00\00\00") (data (i32.const 8424) "\d8 \00\00\01\00\00\00") - (table $0 57 funcref) - (elem (i32.const 0) $null $start~anonymous|1 $start~anonymous|2 $start~anonymous|3 $start~anonymous|4 $start~anonymous|5 $start~anonymous|6 $start~anonymous|7 $start~anonymous|8 $start~anonymous|9 $start~anonymous|10 $start~anonymous|11 $start~anonymous|12 $start~anonymous|13 $start~anonymous|14 $start~anonymous|15 $start~anonymous|16 $start~anonymous|17 $start~anonymous|18 $start~anonymous|19 $start~anonymous|20 $start~anonymous|21 $start~anonymous|22 $start~anonymous|23 $start~anonymous|24 $start~anonymous|25 $start~anonymous|26 $start~anonymous|27 $start~anonymous|28 $start~anonymous|29 $start~anonymous|30 $start~anonymous|31 $start~anonymous|32 $start~anonymous|33 $start~anonymous|34 $start~anonymous|35 $start~anonymous|36 $start~anonymous|37 $start~anonymous|38 $start~anonymous|39 $start~anonymous|40 $start~anonymous|41 $start~anonymous|42 $start~anonymous|43 $~lib/internal/sort/COMPARATOR~anonymous|44 $~lib/internal/sort/COMPARATOR~anonymous|45 $~lib/internal/sort/COMPARATOR~anonymous|46 $~lib/internal/sort/COMPARATOR~anonymous|47 $~lib/internal/sort/COMPARATOR~anonymous|48 $start~anonymous|49 $start~anonymous|50 $start~anonymous|51 $start~anonymous|52 $start~anonymous|53 $start~anonymous|54 $start~anonymous|55 $start~anonymous|56) + (table $0 56 funcref) + (elem (i32.const 0) $null $start~anonymous|1 $start~anonymous|2 $start~anonymous|3 $start~anonymous|4 $start~anonymous|5 $start~anonymous|6 $start~anonymous|7 $start~anonymous|8 $start~anonymous|9 $start~anonymous|10 $start~anonymous|11 $start~anonymous|12 $start~anonymous|13 $start~anonymous|14 $start~anonymous|15 $start~anonymous|16 $start~anonymous|17 $start~anonymous|18 $start~anonymous|19 $start~anonymous|20 $start~anonymous|21 $start~anonymous|22 $start~anonymous|23 $start~anonymous|24 $start~anonymous|25 $start~anonymous|26 $start~anonymous|27 $start~anonymous|28 $start~anonymous|29 $start~anonymous|30 $start~anonymous|31 $start~anonymous|32 $start~anonymous|33 $start~anonymous|34 $start~anonymous|35 $start~anonymous|36 $start~anonymous|37 $start~anonymous|38 $start~anonymous|39 $start~anonymous|40 $start~anonymous|41 $start~anonymous|42 $start~anonymous|43 $~lib/internal/sort/COMPARATOR~anonymous|44 $~lib/internal/sort/COMPARATOR~anonymous|45 $~lib/internal/sort/COMPARATOR~anonymous|46 $~lib/internal/sort/COMPARATOR~anonymous|47 $~lib/internal/sort/COMPARATOR~anonymous|48 $start~anonymous|49 $start~anonymous|50 $start~anonymous|51 $start~anonymous|52 $start~anonymous|53 $start~anonymous|54 $~lib/internal/sort/COMPARATOR~anonymous|55) (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) (global $~lib/internal/allocator/AL_MASK i32 (i32.const 7)) @@ -10604,199 +10604,7 @@ unreachable end ) - (func $~lib/internal/string/compareUnsafe (; 158 ;) (type $iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - i32.const 0 - local.set $5 - local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add - local.set $6 - local.get $2 - local.get $3 - i32.const 1 - i32.shl - i32.add - local.set $7 - block $break|0 - loop $continue|0 - local.get $4 - if (result i32) - local.get $6 - i32.load16_u offset=4 - local.get $7 - i32.load16_u offset=4 - i32.sub - local.tee $5 - i32.eqz - else - local.get $4 - end - if - block - local.get $4 - i32.const 1 - i32.sub - local.set $4 - local.get $6 - i32.const 2 - i32.add - local.set $6 - local.get $7 - i32.const 2 - i32.add - local.set $7 - end - br $continue|0 - end - end - end - local.get $5 - ) - (func $~lib/string/String.__gt (; 159 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - local.get $0 - local.get $1 - i32.eq - local.tee $2 - if (result i32) - local.get $2 - else - local.get $0 - i32.const 0 - i32.eq - end - local.tee $2 - if (result i32) - local.get $2 - else - local.get $1 - i32.const 0 - i32.eq - end - if - i32.const 0 - return - end - local.get $0 - i32.load - local.set $3 - local.get $1 - i32.load - local.set $4 - local.get $3 - i32.eqz - if - i32.const 0 - return - end - local.get $4 - i32.eqz - if - i32.const 1 - return - end - local.get $3 - local.tee $2 - local.get $4 - local.tee $5 - local.get $2 - local.get $5 - i32.lt_s - select - local.set $6 - local.get $0 - i32.const 0 - local.get $1 - i32.const 0 - local.get $6 - call $~lib/internal/string/compareUnsafe - i32.const 0 - i32.gt_s - ) - (func $~lib/string/String.__lt (; 160 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - local.get $0 - local.get $1 - i32.eq - local.tee $2 - if (result i32) - local.get $2 - else - local.get $0 - i32.const 0 - i32.eq - end - local.tee $2 - if (result i32) - local.get $2 - else - local.get $1 - i32.const 0 - i32.eq - end - if - i32.const 0 - return - end - local.get $0 - i32.load - local.set $3 - local.get $1 - i32.load - local.set $4 - local.get $4 - i32.eqz - if - i32.const 0 - return - end - local.get $3 - i32.eqz - if - i32.const 1 - return - end - local.get $3 - local.tee $2 - local.get $4 - local.tee $5 - local.get $2 - local.get $5 - i32.lt_s - select - local.set $6 - local.get $0 - i32.const 0 - local.get $1 - i32.const 0 - local.get $6 - call $~lib/internal/string/compareUnsafe - i32.const 0 - i32.lt_s - ) - (func $start~anonymous|55 (; 161 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - local.get $0 - local.get $1 - call $~lib/string/String.__gt - local.get $0 - local.get $1 - call $~lib/string/String.__lt - i32.sub - ) - (func $~lib/internal/sort/insertionSort (; 162 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (func $~lib/internal/sort/insertionSort (; 158 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) @@ -10937,7 +10745,7 @@ unreachable end ) - (func $~lib/array/Array#sort (; 163 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#sort (; 159 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -11077,7 +10885,7 @@ end local.get $0 ) - (func $~lib/array/Array#__get (; 164 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 160 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -11110,7 +10918,7 @@ unreachable end ) - (func $std/array/isSorted (; 165 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/isSorted (; 161 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) block $break|0 @@ -11162,7 +10970,7 @@ end i32.const 1 ) - (func $std/array/assertSorted (; 166 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $std/array/assertSorted (; 162 ;) (type $iiv) (param $0 i32) (param $1 i32) local.get $0 local.get $1 call $~lib/array/Array#sort @@ -11178,7 +10986,154 @@ unreachable end ) - (func $~lib/string/String.__eq (; 167 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/string/compareUnsafe (; 163 ;) (type $iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + i32.const 0 + local.set $5 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $6 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $7 + block $break|0 + loop $continue|0 + local.get $4 + if (result i32) + local.get $6 + i32.load16_u offset=4 + local.get $7 + i32.load16_u offset=4 + i32.sub + local.tee $5 + i32.eqz + else + local.get $4 + end + if + block + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $6 + i32.const 2 + i32.add + local.set $6 + local.get $7 + i32.const 2 + i32.add + local.set $7 + end + br $continue|0 + end + end + end + local.get $5 + ) + (func $~lib/internal/sort/COMPARATOR~anonymous|55 (; 164 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + local.get $1 + i32.eq + local.tee $2 + if (result i32) + local.get $2 + else + local.get $0 + i32.const 0 + i32.eq + end + local.tee $2 + if (result i32) + local.get $2 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + return + end + local.get $0 + i32.load + local.set $3 + local.get $1 + i32.load + local.set $4 + local.get $3 + i32.eqz + local.tee $2 + if (result i32) + local.get $4 + i32.eqz + else + local.get $2 + end + if + i32.const 0 + return + end + local.get $3 + i32.eqz + if + i32.const -1 + return + end + local.get $4 + i32.eqz + if + i32.const 1 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $3 + local.tee $2 + local.get $4 + local.tee $5 + local.get $2 + local.get $5 + i32.lt_s + select + call $~lib/internal/string/compareUnsafe + ) + (func $std/array/assertSorted|trampoline (; 165 ;) (type $iiv) (param $0 i32) (param $1 i32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argc + i32.const 1 + i32.sub + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + block $~lib/internal/sort/COMPARATOR|inlined.0 (result i32) + i32.const 55 + br $~lib/internal/sort/COMPARATOR|inlined.0 + end + local.set $1 + end + local.get $0 + local.get $1 + call $std/array/assertSorted + ) + (func $~lib/string/String.__eq (; 166 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) local.get $0 @@ -11222,13 +11177,13 @@ call $~lib/internal/string/compareUnsafe i32.eqz ) - (func $~lib/string/String.__ne (; 168 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 167 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) local.get $0 local.get $1 call $~lib/string/String.__eq i32.eqz ) - (func $std/array/isArraysEqual (; 169 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/array/isArraysEqual (; 168 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) local.get $2 i32.eqz @@ -11291,7 +11246,7 @@ end i32.const 1 ) - (func $~lib/array/Array#constructor (; 170 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 169 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -11352,7 +11307,7 @@ end local.get $0 ) - (func $~lib/internal/string/allocateUnsafe (; 171 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 170 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) local.get $0 @@ -11392,7 +11347,7 @@ i32.store local.get $2 ) - (func $~lib/string/String#charAt (; 172 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#charAt (; 171 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) local.get $0 i32.const 0 @@ -11427,7 +11382,7 @@ i32.store16 offset=4 local.get $2 ) - (func $~lib/internal/string/copyUnsafe (; 173 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (func $~lib/internal/string/copyUnsafe (; 172 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) @@ -11456,7 +11411,7 @@ local.get $7 call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 174 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 173 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -11514,7 +11469,7 @@ call $~lib/internal/string/copyUnsafe local.get $5 ) - (func $~lib/string/String.__concat (; 175 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 174 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) local.get $0 i32.eqz if @@ -11525,7 +11480,7 @@ local.get $1 call $~lib/string/String#concat ) - (func $std/array/createRandomString (; 176 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomString (; 175 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 f64) @@ -11567,7 +11522,7 @@ end local.get $1 ) - (func $~lib/array/Array#__set (; 177 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 176 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -11634,7 +11589,7 @@ i32.store offset=8 end ) - (func $std/array/createRandomStringArray (; 178 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomStringArray (; 177 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -11675,16 +11630,7 @@ end local.get $1 ) - (func $start~anonymous|56 (; 179 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - local.get $0 - local.get $1 - call $~lib/string/String.__gt - local.get $0 - local.get $1 - call $~lib/string/String.__lt - i32.sub - ) - (func $~lib/string/String#substring (; 180 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#substring (; 178 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -11794,7 +11740,7 @@ call $~lib/internal/string/copyUnsafe local.get $10 ) - (func $~lib/array/Array#join (; 181 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 179 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -12021,7 +11967,7 @@ local.get $14 return ) - (func $~lib/internal/number/decimalCount32 (; 182 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 180 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) local.get $0 i32.const 100000 @@ -12090,7 +12036,7 @@ unreachable unreachable ) - (func $~lib/internal/number/utoa32_lut (; 183 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 181 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -12278,7 +12224,7 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/itoa32 (; 184 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa32 (; 182 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -12330,12 +12276,12 @@ end local.get $3 ) - (func $~lib/internal/number/itoa (; 185 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 183 ;) (type $ii) (param $0 i32) (result i32) local.get $0 call $~lib/internal/number/itoa32 return ) - (func $~lib/internal/number/itoa_stream (; 186 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 184 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -12394,7 +12340,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 187 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 185 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -12584,7 +12530,7 @@ local.get $13 return ) - (func $~lib/internal/number/utoa32 (; 188 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/utoa32 (; 186 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -12616,12 +12562,12 @@ end local.get $2 ) - (func $~lib/internal/number/itoa (; 189 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 187 ;) (type $ii) (param $0 i32) (result i32) local.get $0 call $~lib/internal/number/utoa32 return ) - (func $~lib/internal/number/itoa_stream (; 190 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 188 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -12660,7 +12606,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 191 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 189 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -12850,14 +12796,14 @@ local.get $13 return ) - (func $~lib/builtins/isFinite (; 192 ;) (type $Fi) (param $0 f64) (result i32) + (func $~lib/builtins/isFinite (; 190 ;) (type $Fi) (param $0 f64) (result i32) local.get $0 local.get $0 f64.sub f64.const 0 f64.eq ) - (func $~lib/internal/number/genDigits (; 193 ;) (type $iIiIiIii) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) + (func $~lib/internal/number/genDigits (; 191 ;) (type $iIiIiIii) (param $0 i32) (param $1 i64) (param $2 i32) (param $3 i64) (param $4 i32) (param $5 i64) (param $6 i32) (result i32) (local $7 i32) (local $8 i64) (local $9 i64) @@ -13450,7 +13396,7 @@ end local.get $15 ) - (func $~lib/internal/number/prettify (; 194 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/prettify (; 192 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -13819,7 +13765,7 @@ unreachable unreachable ) - (func $~lib/internal/number/dtoa_core (; 195 ;) (type $iFi) (param $0 i32) (param $1 f64) (result i32) + (func $~lib/internal/number/dtoa_core (; 193 ;) (type $iFi) (param $0 i32) (param $1 f64) (result i32) (local $2 i32) (local $3 f64) (local $4 i32) @@ -14296,7 +14242,7 @@ local.get $2 i32.add ) - (func $~lib/internal/number/dtoa (; 196 ;) (type $Fi) (param $0 f64) (result i32) + (func $~lib/internal/number/dtoa (; 194 ;) (type $Fi) (param $0 f64) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -14362,7 +14308,7 @@ end local.get $3 ) - (func $~lib/internal/number/dtoa_stream (; 197 ;) (type $iiFi) (param $0 i32) (param $1 i32) (param $2 f64) (result i32) + (func $~lib/internal/number/dtoa_stream (; 195 ;) (type $iiFi) (param $0 i32) (param $1 i32) (param $2 f64) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -14451,7 +14397,7 @@ local.get $2 call $~lib/internal/number/dtoa_core ) - (func $~lib/array/Array#join (; 198 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 196 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 f64) @@ -14641,7 +14587,7 @@ local.get $13 return ) - (func $~lib/array/Array#join (; 199 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 197 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -14853,7 +14799,7 @@ local.get $9 return ) - (func $std/array/Ref#constructor (; 200 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/Ref#constructor (; 198 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.eqz if @@ -14863,7 +14809,7 @@ end local.get $0 ) - (func $~lib/array/Array#constructor (; 201 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 199 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -14924,7 +14870,7 @@ end local.get $0 ) - (func $~lib/array/Array#__unchecked_set (; 202 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__unchecked_set (; 200 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -14948,7 +14894,7 @@ local.get $5 i32.store offset=8 ) - (func $~lib/array/Array#join (; 203 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 201 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -15132,7 +15078,7 @@ local.get $11 return ) - (func $~lib/internal/number/itoa (; 204 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 202 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.const 24 i32.shl @@ -15141,7 +15087,7 @@ call $~lib/internal/number/itoa32 return ) - (func $~lib/internal/number/itoa_stream (; 205 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 203 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -15216,7 +15162,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 206 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 204 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -15406,14 +15352,14 @@ local.get $13 return ) - (func $~lib/internal/number/itoa (; 207 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 205 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.const 65535 i32.and call $~lib/internal/number/utoa32 return ) - (func $~lib/internal/number/itoa_stream (; 208 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 206 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -15458,7 +15404,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 209 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 207 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -15648,7 +15594,7 @@ local.get $13 return ) - (func $~lib/internal/number/decimalCount64 (; 210 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/decimalCount64 (; 208 ;) (type $Ii) (param $0 i64) (result i32) (local $1 i32) local.get $0 i64.const 1000000000000000 @@ -15717,7 +15663,7 @@ unreachable unreachable ) - (func $~lib/internal/number/utoa64_lut (; 211 ;) (type $iIiv) (param $0 i32) (param $1 i64) (param $2 i32) + (func $~lib/internal/number/utoa64_lut (; 209 ;) (type $iIiv) (param $0 i32) (param $1 i64) (param $2 i32) (local $3 i32) (local $4 i64) (local $5 i32) @@ -15890,7 +15836,7 @@ local.get $2 call $~lib/internal/number/utoa32_lut ) - (func $~lib/internal/number/utoa64 (; 212 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/utoa64 (; 210 ;) (type $Ii) (param $0 i64) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -15952,12 +15898,12 @@ end local.get $1 ) - (func $~lib/internal/number/itoa (; 213 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/itoa (; 211 ;) (type $Ii) (param $0 i64) (result i32) local.get $0 call $~lib/internal/number/utoa64 return ) - (func $~lib/internal/number/itoa_stream (; 214 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) + (func $~lib/internal/number/itoa_stream (; 212 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -16023,7 +15969,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 215 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 213 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i64) @@ -16213,7 +16159,7 @@ local.get $13 return ) - (func $~lib/internal/number/itoa64 (; 216 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/itoa64 (; 214 ;) (type $Ii) (param $0 i64) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -16297,12 +16243,12 @@ end local.get $2 ) - (func $~lib/internal/number/itoa (; 217 ;) (type $Ii) (param $0 i64) (result i32) + (func $~lib/internal/number/itoa (; 215 ;) (type $Ii) (param $0 i64) (result i32) local.get $0 call $~lib/internal/number/itoa64 return ) - (func $~lib/internal/number/itoa_stream (; 218 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) + (func $~lib/internal/number/itoa_stream (; 216 ;) (type $iiIi) (param $0 i32) (param $1 i32) (param $2 i64) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -16390,7 +16336,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 219 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 217 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i64) @@ -16580,7 +16526,7 @@ local.get $13 return ) - (func $~lib/array/Array>#join (; 220 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#join (; 218 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -16727,14 +16673,14 @@ local.get $3 return ) - (func $~lib/internal/number/itoa (; 221 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 219 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.const 255 i32.and call $~lib/internal/number/utoa32 return ) - (func $~lib/internal/number/itoa_stream (; 222 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/number/itoa_stream (; 220 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -16779,7 +16725,7 @@ end local.get $3 ) - (func $~lib/array/Array#join (; 223 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 221 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -16969,7 +16915,7 @@ local.get $13 return ) - (func $~lib/array/Array>#join (; 224 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#join (; 222 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -17116,7 +17062,7 @@ local.get $3 return ) - (func $~lib/array/Array>#join (; 225 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#join (; 223 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -17263,7 +17209,7 @@ local.get $3 return ) - (func $~lib/array/Array>>#join (; 226 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>>#join (; 224 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -17410,7 +17356,7 @@ local.get $3 return ) - (func $start (; 227 ;) (type $v) + (func $start (; 225 ;) (type $v) (local $0 i32) (local $1 i32) (local $2 i32) @@ -21526,9 +21472,13 @@ global.get $std/array/reversedElements512 i32.const 54 call $std/array/assertSorted> - global.get $std/array/randomStringsActual - i32.const 55 - call $std/array/assertSorted + block + i32.const 1 + global.set $~argc + global.get $std/array/randomStringsActual + i32.const 0 + call $std/array/assertSorted|trampoline + end global.get $std/array/randomStringsActual global.get $std/array/randomStringsExpected i32.const 0 @@ -21537,7 +21487,7 @@ if i32.const 0 i32.const 120 - i32.const 900 + i32.const 901 i32.const 0 call $~lib/env/abort unreachable @@ -21545,9 +21495,13 @@ i32.const 400 call $std/array/createRandomStringArray global.set $std/array/randomStrings400 - global.get $std/array/randomStrings400 - i32.const 56 - call $std/array/assertSorted + block + i32.const 1 + global.set $~argc + global.get $std/array/randomStrings400 + i32.const 0 + call $std/array/assertSorted|trampoline + end i32.const 4240 i32.const 4216 call $~lib/array/Array#join @@ -21557,7 +21511,7 @@ if i32.const 0 i32.const 120 - i32.const 909 + i32.const 910 i32.const 0 call $~lib/env/abort unreachable @@ -21571,7 +21525,7 @@ if i32.const 0 i32.const 120 - i32.const 910 + i32.const 911 i32.const 0 call $~lib/env/abort unreachable @@ -21585,7 +21539,7 @@ if i32.const 0 i32.const 120 - i32.const 911 + i32.const 912 i32.const 0 call $~lib/env/abort unreachable @@ -21599,7 +21553,7 @@ if i32.const 0 i32.const 120 - i32.const 912 + i32.const 913 i32.const 0 call $~lib/env/abort unreachable @@ -21613,7 +21567,7 @@ if i32.const 0 i32.const 120 - i32.const 913 + i32.const 914 i32.const 0 call $~lib/env/abort unreachable @@ -21627,7 +21581,7 @@ if i32.const 0 i32.const 120 - i32.const 914 + i32.const 915 i32.const 0 call $~lib/env/abort unreachable @@ -21663,7 +21617,7 @@ if i32.const 0 i32.const 120 - i32.const 916 + i32.const 917 i32.const 0 call $~lib/env/abort unreachable @@ -21681,7 +21635,7 @@ if i32.const 0 i32.const 120 - i32.const 920 + i32.const 921 i32.const 0 call $~lib/env/abort unreachable @@ -21699,7 +21653,7 @@ if i32.const 0 i32.const 120 - i32.const 921 + i32.const 922 i32.const 0 call $~lib/env/abort unreachable @@ -21717,7 +21671,7 @@ if i32.const 0 i32.const 120 - i32.const 922 + i32.const 923 i32.const 0 call $~lib/env/abort unreachable @@ -21735,7 +21689,7 @@ if i32.const 0 i32.const 120 - i32.const 923 + i32.const 924 i32.const 0 call $~lib/env/abort unreachable @@ -21753,7 +21707,7 @@ if i32.const 0 i32.const 120 - i32.const 925 + i32.const 926 i32.const 0 call $~lib/env/abort unreachable @@ -21771,7 +21725,7 @@ if i32.const 0 i32.const 120 - i32.const 926 + i32.const 927 i32.const 0 call $~lib/env/abort unreachable @@ -21789,7 +21743,7 @@ if i32.const 0 i32.const 120 - i32.const 927 + i32.const 928 i32.const 0 call $~lib/env/abort unreachable @@ -21807,7 +21761,7 @@ if i32.const 0 i32.const 120 - i32.const 928 + i32.const 929 i32.const 0 call $~lib/env/abort unreachable @@ -21825,7 +21779,7 @@ if i32.const 0 i32.const 120 - i32.const 929 + i32.const 930 i32.const 0 call $~lib/env/abort unreachable @@ -21843,7 +21797,7 @@ if i32.const 0 i32.const 120 - i32.const 930 + i32.const 931 i32.const 0 call $~lib/env/abort unreachable @@ -21861,7 +21815,7 @@ if i32.const 0 i32.const 120 - i32.const 933 + i32.const 934 i32.const 0 call $~lib/env/abort unreachable @@ -21879,7 +21833,7 @@ if i32.const 0 i32.const 120 - i32.const 936 + i32.const 937 i32.const 0 call $~lib/env/abort unreachable @@ -21897,12 +21851,12 @@ if i32.const 0 i32.const 120 - i32.const 939 + i32.const 940 i32.const 0 call $~lib/env/abort unreachable end ) - (func $null (; 228 ;) (type $v) + (func $null (; 226 ;) (type $v) ) )