From 99bde3a5fa06df5ea07e73fd11ec8d086d81a441 Mon Sep 17 00:00:00 2001 From: Max Graey Date: Wed, 2 May 2018 20:33:17 +0300 Subject: [PATCH] Use insertion sort for references in Array#sort (#90) This fixes that Weak Heap Sort isn't stable and thus might swap equal values, which sometimes results in not deep equal arrays of strings, for example. Insertion sort is stable, so it is used for references instead. --- std/assembly/array.ts | 14 +- std/assembly/internal/array.ts | 54 +- tests/compiler/std/array.optimized.wat | 157 +- tests/compiler/std/array.ts | 4 +- tests/compiler/std/array.untouched.wat | 1912 +----------------------- 5 files changed, 240 insertions(+), 1901 deletions(-) diff --git a/std/assembly/array.ts b/std/assembly/array.ts index 7538c4b1..abdbe5b6 100644 --- a/std/assembly/array.ts +++ b/std/assembly/array.ts @@ -314,9 +314,15 @@ export class Array { } return this; } - return changetype(length < 256 - ? insertionSort(this, comparator) - : weakHeapSort(this, comparator) - ); + + if (isReference()) { + // TODO replace this to stable sort when it implemented + return changetype(insertionSort(this, comparator)); + } else { + return changetype(length < 256 + ? insertionSort(this, comparator) + : weakHeapSort(this, comparator) + ); + } } } diff --git a/std/assembly/internal/array.ts b/std/assembly/internal/array.ts index 91c06203..7678f8dd 100644 --- a/std/assembly/internal/array.ts +++ b/std/assembly/internal/array.ts @@ -14,25 +14,25 @@ export function defaultComparator(): (a: T, b: T) => i32 { } /** Sorts an Array with the 'Insertion Sort' algorithm. */ -export function insertionSort(arr: Array, comparator: (a: V, b: V) => i32): Array { +export function insertionSort(arr: Array, comparator: (a: T, b: T) => i32): Array { var buffer = arr.buffer_; for (let i: i32 = 0, length: i32 = arr.length; i < length; i++) { - let a = loadUnsafe(buffer, i); // a = arr[i] + let a = loadUnsafe(buffer, i); // a = arr[i] let j = i - 1; while (j >= 0) { - let b = loadUnsafe(buffer, j); // b = arr[j] + let b = loadUnsafe(buffer, j); // b = arr[j] if (comparator(a, b) < 0) { - storeUnsafe(buffer, j-- + 1, b); // arr[j + 1] = b + storeUnsafe(buffer, j-- + 1, b); // arr[j + 1] = b } else break; } - storeUnsafe(buffer, j + 1, a); // arr[j + 1] = a + storeUnsafe(buffer, j + 1, a); // arr[j + 1] = a } return arr; } /** Sorts an Array with the 'Weak Heap Sort' algorithm. */ -export function weakHeapSort(arr: Array, comparator: (a: V, b: V) => i32): Array { - const shift32 = alignof(); +export function weakHeapSort(arr: Array, comparator: (a: T, b: T) => i32): Array { + const shift32 = alignof(); var length = arr.length; var bitsetSize = (length + 31) >> 5 << shift32; @@ -44,40 +44,40 @@ export function weakHeapSort(arr: Array, comparator: (a: V, b: V) => i32 var buffer = arr.buffer_; for (let i = length - 1; i > 0; i--) { let j = i; - while ((j & 1) == (load(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1; + while ((j & 1) == (load(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1; let p = j >> 1; - let a = loadUnsafe(buffer, p); // a = arr[p] - let b = loadUnsafe(buffer, i); // b = arr[i] + let a = loadUnsafe(buffer, p); // a = arr[p] + let b = loadUnsafe(buffer, i); // b = arr[i] if (comparator(a, b) < 0) { - store( + store( bitset + (i >> 5 << shift32), - load(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31)) + load(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31)) ); - storeUnsafe(buffer, i, a); // arr[i] = a - storeUnsafe(buffer, p, b); // arr[p] = b + storeUnsafe(buffer, i, a); // arr[i] = a + storeUnsafe(buffer, p, b); // arr[p] = b } } for (let i = length - 1; i >= 2; i--) { - let a = loadUnsafe(buffer, 0); // a = arr[0] - storeUnsafe(buffer, 0, loadUnsafe(buffer, i)); // arr[0] = arr[i] - storeUnsafe(buffer, i, a); // arr[i] = a + let a = loadUnsafe(buffer, 0); // a = arr[0] + storeUnsafe(buffer, 0, loadUnsafe(buffer, i)); // arr[0] = arr[i] + storeUnsafe(buffer, i, a); // arr[i] = a let x = 1, y: i32; - while ((y = (x << 1) + ((load(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y; + while ((y = (x << 1) + ((load(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y; while (x > 0) { - a = loadUnsafe(buffer, 0); // a = arr[0] - let b = loadUnsafe(buffer, x); // b = arr[x] + a = loadUnsafe(buffer, 0); // a = arr[0] + let b = loadUnsafe(buffer, x); // b = arr[x] if (comparator(a, b) < 0) { - store( + store( bitset + (x >> 5 << shift32), - load(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31)) + load(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31)) ); - storeUnsafe(buffer, x, a); // arr[x] = a - storeUnsafe(buffer, 0, b); // arr[0] = b + storeUnsafe(buffer, x, a); // arr[x] = a + storeUnsafe(buffer, 0, b); // arr[0] = b } x >>= 1; } @@ -85,8 +85,8 @@ export function weakHeapSort(arr: Array, comparator: (a: V, b: V) => i32 free_memory(bitset); - var t = loadUnsafe(buffer, 1); // t = arr[1] - storeUnsafe(buffer, 1, loadUnsafe(buffer, 0)); // arr[1] = arr[0] - storeUnsafe(buffer, 0, t); // arr[0] = t + var t = loadUnsafe(buffer, 1); // t = arr[1] + storeUnsafe(buffer, 1, loadUnsafe(buffer, 0)); // arr[1] = arr[0] + storeUnsafe(buffer, 0, t); // arr[0] = t return arr; } diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index 9d30e01e..8cd8bd8f 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -4645,7 +4645,7 @@ ) ) ) - (func $~lib/internal/array/insertionSort (; 72 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/insertionSort (; 72 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4773,7 +4773,7 @@ (func $~lib/allocator/arena/free_memory (; 73 ;) (type $iv) (param $0 i32) (nop) ) - (func $~lib/internal/array/weakHeapSort (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/weakHeapSort (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4834,7 +4834,7 @@ (i32.const 1) ) (i32.and - (i32.shr_s + (i32.shr_u (i32.load (i32.add (get_local $6) @@ -5029,7 +5029,7 @@ (i32.const 1) ) (i32.and - (i32.shr_s + (i32.shr_u (i32.load (i32.add (get_local $6) @@ -5273,11 +5273,11 @@ (get_local $2) (i32.const 256) ) - (call $~lib/internal/array/insertionSort + (call $~lib/internal/array/insertionSort (get_local $0) (get_local $1) ) - (call $~lib/internal/array/weakHeapSort + (call $~lib/internal/array/weakHeapSort (get_local $0) (get_local $1) ) @@ -5532,7 +5532,108 @@ ) ) ) - (func $std/array/Proxy#constructor (; 85 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#sort (; 85 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (if + (i32.le_s + (tee_local $2 + (i32.load offset=4 + (get_local $0) + ) + ) + (i32.const 1) + ) + (return + (get_local $0) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (if + (i32.eq + (get_local $2) + (i32.const 2) + ) + (block + (set_local $2 + (i32.load offset=8 + (i32.add + (get_local $3) + (i32.const 4) + ) + ) + ) + (set_local $4 + (i32.load offset=8 + (get_local $3) + ) + ) + (if + (block (result i32) + (set_global $~argc + (i32.const 2) + ) + (i32.lt_s + (call_indirect (type $iii) + (get_local $2) + (get_local $4) + (get_local $1) + ) + (i32.const 0) + ) + ) + (block + (i32.store offset=8 + (i32.add + (get_local $3) + (i32.const 4) + ) + (get_local $4) + ) + (i32.store offset=8 + (get_local $3) + (get_local $2) + ) + ) + ) + (return + (get_local $0) + ) + ) + ) + (call $~lib/internal/array/insertionSort + (get_local $0) + (get_local $1) + ) + ) + (func $std/array/assertSorted> (; 86 ;) (type $iiv) (param $0 i32) (param $1 i32) + (if + (i32.eqz + (call $std/array/isSorted + (call $~lib/array/Array>#sort + (get_local $0) + (get_local $1) + ) + (get_local $1) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 96) + (i32.const 605) + (i32.const 2) + ) + (unreachable) + ) + ) + ) + (func $std/array/Proxy#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (result i32) (get_local $0) @@ -5550,7 +5651,7 @@ ) ) ) - (func $std/array/createReverseOrderedElementsArray (; 86 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createReverseOrderedElementsArray (; 88 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (set_local $1 (call $~lib/array/Array#constructor @@ -5598,7 +5699,7 @@ ) (get_local $1) ) - (func $start~anonymous|48 (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $start~anonymous|48 (; 89 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.sub (i32.load (get_local $0) @@ -5608,7 +5709,7 @@ ) ) ) - (func $~lib/memory/compare_memory (; 88 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/compare_memory (; 90 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -5668,7 +5769,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__gt (; 89 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gt (; 91 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -5752,7 +5853,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lt (; 90 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lt (; 92 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -5836,7 +5937,7 @@ (i32.const 0) ) ) - (func $start~anonymous|49 (; 91 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $start~anonymous|49 (; 93 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.sub (call $~lib/string/String.__gt (get_local $0) @@ -5848,7 +5949,7 @@ ) ) ) - (func $~lib/string/String.__eq (; 92 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 94 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eq @@ -5910,7 +6011,7 @@ ) ) ) - (func $~lib/string/String.__ne (; 93 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 95 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.eqz (call $~lib/string/String.__eq (get_local $0) @@ -5918,7 +6019,7 @@ ) ) ) - (func $std/array/isArraysEqual (; 94 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/array/isArraysEqual (; 96 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (if (i32.eqz @@ -5979,7 +6080,7 @@ ) (i32.const 1) ) - (func $std/array/isArraysEqual|trampoline (; 95 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/array/isArraysEqual|trampoline (; 97 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -6002,7 +6103,7 @@ (get_local $2) ) ) - (func $~lib/internal/string/allocate (; 96 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocate (; 98 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (i32.eqz @@ -6049,7 +6150,7 @@ ) (get_local $1) ) - (func $~lib/string/String#charAt (; 97 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#charAt (; 99 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eqz @@ -6094,7 +6195,7 @@ ) (get_local $2) ) - (func $~lib/string/String#concat (; 98 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 100 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -6181,7 +6282,7 @@ ) (get_local $2) ) - (func $~lib/string/String.__concat (; 99 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 101 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -6195,7 +6296,7 @@ (get_local $1) ) ) - (func $std/array/createRandomString (; 100 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomString (; 102 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (set_local $1 @@ -6240,7 +6341,7 @@ ) (get_local $1) ) - (func $std/array/createRandomStringArray (; 101 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomStringArray (; 103 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (set_local $1 (call $~lib/array/Array#constructor @@ -6284,7 +6385,7 @@ ) (get_local $1) ) - (func $start (; 102 ;) (type $v) + (func $start (; 104 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -9503,7 +9604,7 @@ (i32.const 512) ) ) - (call $std/array/assertSorted + (call $std/array/assertSorted> (get_global $std/array/reversedNested512) (i32.const 47) ) @@ -9512,11 +9613,11 @@ (i32.const 512) ) ) - (call $std/array/assertSorted + (call $std/array/assertSorted> (get_global $std/array/reversedElements512) (i32.const 48) ) - (call $std/array/assertSorted + (call $std/array/assertSorted> (get_global $std/array/randomStringsActual) (i32.const 49) ) @@ -9548,7 +9649,7 @@ (i32.const 400) ) ) - (call $std/array/assertSorted + (call $std/array/assertSorted> (get_global $std/array/randomStrings400) (i32.const 50) ) diff --git a/tests/compiler/std/array.ts b/tests/compiler/std/array.ts index 2f16f4f7..db6c6750 100644 --- a/tests/compiler/std/array.ts +++ b/tests/compiler/std/array.ts @@ -672,8 +672,8 @@ assertSorted>(reversedElements512, (a: Proxy, b: Proxy): i3 // Test sorting strings -var randomStringsActual: string[] = ['a', 'b', 'a', 'ab', 'ba', '', null]; -var randomStringsExpected: string[] = ['', 'a', 'a', 'ab', 'b', 'ba', null]; +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)); assert(isArraysEqual(randomStringsActual, randomStringsExpected)); diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index 6fa54996..d8f63d4a 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -5720,7 +5720,7 @@ ) ) ) - (func $~lib/internal/array/insertionSort (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/insertionSort (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5885,7 +5885,7 @@ ) (func $~lib/allocator/arena/free_memory (; 88 ;) (type $iv) (param $0 i32) ) - (func $~lib/internal/array/weakHeapSort (; 89 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/weakHeapSort (; 89 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5971,7 +5971,7 @@ (i32.const 1) ) (i32.and - (i32.shr_s + (i32.shr_u (i32.load (i32.add (get_local $4) @@ -6218,7 +6218,7 @@ (i32.const 1) ) (i32.and - (i32.shr_s + (i32.shr_u (i32.load (i32.add (get_local $4) @@ -6589,19 +6589,21 @@ ) ) ) - (return - (if (result i32) - (i32.lt_s - (get_local $2) - (i32.const 256) - ) - (call $~lib/internal/array/insertionSort - (get_local $0) - (get_local $1) - ) - (call $~lib/internal/array/weakHeapSort - (get_local $0) - (get_local $1) + (block + (return + (if (result i32) + (i32.lt_s + (get_local $2) + (i32.const 256) + ) + (call $~lib/internal/array/insertionSort + (get_local $0) + (get_local $1) + ) + (call $~lib/internal/array/weakHeapSort + (get_local $0) + (get_local $1) + ) ) ) ) @@ -7087,7 +7089,7 @@ ) ) ) - (func $~lib/internal/array/insertionSort,Array> (; 106 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/insertionSort> (; 106 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -7250,589 +7252,7 @@ (get_local $0) ) ) - (func $~lib/internal/array/weakHeapSort,Array> (; 107 ;) (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 $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (local $23 i32) - (local $24 i32) - (local $25 i32) - (local $26 i32) - (nop) - (set_local $2 - (call $~lib/array/Array>#get:length - (get_local $0) - ) - ) - (set_local $3 - (i32.shl - (i32.shr_s - (i32.add - (get_local $2) - (i32.const 31) - ) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (set_local $4 - (call $~lib/allocator/arena/allocate_memory - (get_local $3) - ) - ) - (call $~lib/memory/set_memory - (get_local $4) - (i32.const 0) - (get_local $3) - ) - (set_local $5 - (i32.load - (get_local $0) - ) - ) - (block $break|0 - (set_local $6 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|0 - (if - (i32.gt_s - (get_local $6) - (i32.const 0) - ) - (block - (block - (set_local $7 - (get_local $6) - ) - (block $break|1 - (loop $continue|1 - (if - (i32.eq - (i32.and - (get_local $7) - (i32.const 1) - ) - (i32.and - (i32.shr_s - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $7) - (i32.const 6) - ) - (i32.const 2) - ) - ) - ) - (i32.and - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - (i32.const 31) - ) - ) - (i32.const 1) - ) - ) - (block - (set_local $7 - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - ) - (br $continue|1) - ) - ) - ) - ) - (set_local $8 - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - ) - (set_local $9 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.5 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.5 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $8) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (set_local $10 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.6 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.6 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $6) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (if - (i32.lt_s - (block (result i32) - (set_global $~argc - (i32.const 2) - ) - (call_indirect (type $iii) - (get_local $9) - (get_local $10) - (get_local $1) - ) - ) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $6) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (i32.xor - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $6) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.shl - (i32.const 1) - (i32.and - (get_local $6) - (i32.const 31) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.5 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $6) - (i32.const 2) - ) - ) - (get_local $9) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.6 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $8) - (i32.const 2) - ) - ) - (get_local $10) - ) - ) - ) - ) - ) - (set_local $6 - (i32.sub - (get_local $6) - (i32.const 1) - ) - ) - (br $continue|0) - ) - ) - ) - ) - (block $break|2 - (set_local $11 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|2 - (if - (i32.ge_s - (get_local $11) - (i32.const 2) - ) - (block - (block - (set_local $13 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.7 (result i32) - (set_local $12 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.7 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $12) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.7 - (set_local $14 - (i32.const 0) - ) - (set_local $15 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.8 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.8 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $11) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $14) - (i32.const 2) - ) - ) - (get_local $15) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.8 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $11) - (i32.const 2) - ) - ) - (get_local $13) - ) - ) - (set_local $16 - (i32.const 1) - ) - (block $break|3 - (loop $continue|3 - (if - (i32.lt_s - (tee_local $17 - (i32.add - (i32.shl - (get_local $16) - (i32.const 1) - ) - (i32.and - (i32.shr_s - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.and - (get_local $16) - (i32.const 31) - ) - ) - (i32.const 1) - ) - ) - ) - (get_local $11) - ) - (block - (set_local $16 - (get_local $17) - ) - (br $continue|3) - ) - ) - ) - ) - (block $break|4 - (loop $continue|4 - (if - (i32.gt_s - (get_local $16) - (i32.const 0) - ) - (block - (block - (set_local $13 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.9 (result i32) - (set_local $18 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.9 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $18) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (set_local $19 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.10 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.10 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $16) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (if - (i32.lt_s - (block (result i32) - (set_global $~argc - (i32.const 2) - ) - (call_indirect (type $iii) - (get_local $13) - (get_local $19) - (get_local $1) - ) - ) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (i32.xor - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.shl - (i32.const 1) - (i32.and - (get_local $16) - (i32.const 31) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.9 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $16) - (i32.const 2) - ) - ) - (get_local $13) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.10 - (set_local $20 - (i32.const 0) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $20) - (i32.const 2) - ) - ) - (get_local $19) - ) - ) - ) - ) - (set_local $16 - (i32.shr_s - (get_local $16) - (i32.const 1) - ) - ) - ) - (br $continue|4) - ) - ) - ) - ) - ) - (set_local $11 - (i32.sub - (get_local $11) - (i32.const 1) - ) - ) - (br $continue|2) - ) - ) - ) - ) - (call $~lib/allocator/arena/free_memory - (get_local $4) - ) - (set_local $22 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.11 (result i32) - (set_local $21 - (i32.const 1) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.11 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $21) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.11 - (set_local $23 - (i32.const 1) - ) - (set_local $25 - (block $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.12 (result i32) - (set_local $24 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Array>|inlined.12 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $24) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $23) - (i32.const 2) - ) - ) - (get_local $25) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Array>|inlined.12 - (set_local $26 - (i32.const 0) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $26) - (i32.const 2) - ) - ) - (get_local $22) - ) - ) - (return - (get_local $0) - ) - ) - (func $~lib/array/Array>#sort (; 108 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#sort (; 107 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -7954,24 +7374,16 @@ ) ) ) - (return - (if (result i32) - (i32.lt_s - (get_local $2) - (i32.const 256) - ) - (call $~lib/internal/array/insertionSort,Array> - (get_local $0) - (get_local $1) - ) - (call $~lib/internal/array/weakHeapSort,Array> + (block + (return + (call $~lib/internal/array/insertionSort> (get_local $0) (get_local $1) ) ) ) ) - (func $std/array/isSorted> (; 109 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/isSorted> (; 108 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (block $break|0 @@ -8036,7 +7448,7 @@ (i32.const 1) ) ) - (func $std/array/assertSorted> (; 110 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $std/array/assertSorted> (; 109 ;) (type $iiv) (param $0 i32) (param $1 i32) (if (i32.eqz (call $std/array/isSorted> @@ -8058,7 +7470,7 @@ ) ) ) - (func $~lib/array/Array>#constructor (; 111 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#constructor (; 110 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -8132,14 +7544,14 @@ ) (get_local $0) ) - (func $~lib/array/Array>#get:length (; 112 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/array/Array>#get:length (; 111 ;) (type $ii) (param $0 i32) (result i32) (return (i32.load offset=4 (get_local $0) ) ) ) - (func $std/array/Proxy#constructor (; 113 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/Proxy#constructor (; 112 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (block ) @@ -8164,7 +7576,7 @@ ) ) ) - (func $~lib/array/Array>#__set (; 114 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array>#__set (; 113 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (set_local $3 @@ -8240,7 +7652,7 @@ ) ) ) - (func $std/array/createReverseOrderedElementsArray (; 115 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createReverseOrderedElementsArray (; 114 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (set_local $1 @@ -8295,7 +7707,7 @@ (get_local $1) ) ) - (func $start~anonymous|48 (; 116 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $start~anonymous|48 (; 115 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.sub (i32.load (get_local $0) @@ -8305,7 +7717,7 @@ ) ) ) - (func $~lib/internal/array/insertionSort,Proxy> (; 117 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/insertionSort> (; 116 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -8468,589 +7880,7 @@ (get_local $0) ) ) - (func $~lib/internal/array/weakHeapSort,Proxy> (; 118 ;) (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 $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (local $23 i32) - (local $24 i32) - (local $25 i32) - (local $26 i32) - (nop) - (set_local $2 - (call $~lib/array/Array>#get:length - (get_local $0) - ) - ) - (set_local $3 - (i32.shl - (i32.shr_s - (i32.add - (get_local $2) - (i32.const 31) - ) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (set_local $4 - (call $~lib/allocator/arena/allocate_memory - (get_local $3) - ) - ) - (call $~lib/memory/set_memory - (get_local $4) - (i32.const 0) - (get_local $3) - ) - (set_local $5 - (i32.load - (get_local $0) - ) - ) - (block $break|0 - (set_local $6 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|0 - (if - (i32.gt_s - (get_local $6) - (i32.const 0) - ) - (block - (block - (set_local $7 - (get_local $6) - ) - (block $break|1 - (loop $continue|1 - (if - (i32.eq - (i32.and - (get_local $7) - (i32.const 1) - ) - (i32.and - (i32.shr_s - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $7) - (i32.const 6) - ) - (i32.const 2) - ) - ) - ) - (i32.and - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - (i32.const 31) - ) - ) - (i32.const 1) - ) - ) - (block - (set_local $7 - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - ) - (br $continue|1) - ) - ) - ) - ) - (set_local $8 - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - ) - (set_local $9 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.4 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.4 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $8) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (set_local $10 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.5 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.5 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $6) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (if - (i32.lt_s - (block (result i32) - (set_global $~argc - (i32.const 2) - ) - (call_indirect (type $iii) - (get_local $9) - (get_local $10) - (get_local $1) - ) - ) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $6) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (i32.xor - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $6) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.shl - (i32.const 1) - (i32.and - (get_local $6) - (i32.const 31) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.5 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $6) - (i32.const 2) - ) - ) - (get_local $9) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.6 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $8) - (i32.const 2) - ) - ) - (get_local $10) - ) - ) - ) - ) - ) - (set_local $6 - (i32.sub - (get_local $6) - (i32.const 1) - ) - ) - (br $continue|0) - ) - ) - ) - ) - (block $break|2 - (set_local $11 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|2 - (if - (i32.ge_s - (get_local $11) - (i32.const 2) - ) - (block - (block - (set_local $13 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.6 (result i32) - (set_local $12 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.6 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $12) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.7 - (set_local $14 - (i32.const 0) - ) - (set_local $15 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.7 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.7 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $11) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $14) - (i32.const 2) - ) - ) - (get_local $15) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.8 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $11) - (i32.const 2) - ) - ) - (get_local $13) - ) - ) - (set_local $16 - (i32.const 1) - ) - (block $break|3 - (loop $continue|3 - (if - (i32.lt_s - (tee_local $17 - (i32.add - (i32.shl - (get_local $16) - (i32.const 1) - ) - (i32.and - (i32.shr_s - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.and - (get_local $16) - (i32.const 31) - ) - ) - (i32.const 1) - ) - ) - ) - (get_local $11) - ) - (block - (set_local $16 - (get_local $17) - ) - (br $continue|3) - ) - ) - ) - ) - (block $break|4 - (loop $continue|4 - (if - (i32.gt_s - (get_local $16) - (i32.const 0) - ) - (block - (block - (set_local $13 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.8 (result i32) - (set_local $18 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.8 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $18) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (set_local $19 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.9 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.9 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $16) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (if - (i32.lt_s - (block (result i32) - (set_global $~argc - (i32.const 2) - ) - (call_indirect (type $iii) - (get_local $13) - (get_local $19) - (get_local $1) - ) - ) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (i32.xor - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.shl - (i32.const 1) - (i32.and - (get_local $16) - (i32.const 31) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.9 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $16) - (i32.const 2) - ) - ) - (get_local $13) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.10 - (set_local $20 - (i32.const 0) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $20) - (i32.const 2) - ) - ) - (get_local $19) - ) - ) - ) - ) - (set_local $16 - (i32.shr_s - (get_local $16) - (i32.const 1) - ) - ) - ) - (br $continue|4) - ) - ) - ) - ) - ) - (set_local $11 - (i32.sub - (get_local $11) - (i32.const 1) - ) - ) - (br $continue|2) - ) - ) - ) - ) - (call $~lib/allocator/arena/free_memory - (get_local $4) - ) - (set_local $22 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.10 (result i32) - (set_local $21 - (i32.const 1) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.10 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $21) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.11 - (set_local $23 - (i32.const 1) - ) - (set_local $25 - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.11 (result i32) - (set_local $24 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.11 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $24) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $23) - (i32.const 2) - ) - ) - (get_local $25) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe,Proxy>|inlined.12 - (set_local $26 - (i32.const 0) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $26) - (i32.const 2) - ) - ) - (get_local $22) - ) - ) - (return - (get_local $0) - ) - ) - (func $~lib/array/Array>#sort (; 119 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#sort (; 117 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9172,24 +8002,16 @@ ) ) ) - (return - (if (result i32) - (i32.lt_s - (get_local $2) - (i32.const 256) - ) - (call $~lib/internal/array/insertionSort,Proxy> - (get_local $0) - (get_local $1) - ) - (call $~lib/internal/array/weakHeapSort,Proxy> + (block + (return + (call $~lib/internal/array/insertionSort> (get_local $0) (get_local $1) ) ) ) ) - (func $~lib/array/Array>#__get (; 120 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#__get (; 118 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (set_local $2 (i32.load @@ -9207,8 +8029,8 @@ (i32.const 2) ) ) - (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.12 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.12 + (block $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.4 (result i32) + (br $~lib/internal/arraybuffer/loadUnsafe,Proxy>|inlined.4 (i32.load offset=8 (i32.add (get_local $2) @@ -9224,7 +8046,7 @@ ) ) ) - (func $std/array/isSorted> (; 121 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/isSorted> (; 119 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (block $break|0 @@ -9289,7 +8111,7 @@ (i32.const 1) ) ) - (func $std/array/assertSorted> (; 122 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $std/array/assertSorted> (; 120 ;) (type $iiv) (param $0 i32) (param $1 i32) (if (i32.eqz (call $std/array/isSorted> @@ -9311,7 +8133,7 @@ ) ) ) - (func $~lib/memory/compare_memory (; 123 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/compare_memory (; 121 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -9377,7 +8199,7 @@ ) ) ) - (func $~lib/string/String.__gt (; 124 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gt (; 122 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9476,7 +8298,7 @@ ) ) ) - (func $~lib/string/String.__lt (; 125 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lt (; 123 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9575,7 +8397,7 @@ ) ) ) - (func $start~anonymous|49 (; 126 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $start~anonymous|49 (; 124 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.sub (call $~lib/string/String.__gt (get_local $0) @@ -9587,14 +8409,14 @@ ) ) ) - (func $~lib/array/Array#get:length (; 127 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/array/Array#get:length (; 125 ;) (type $ii) (param $0 i32) (result i32) (return (i32.load offset=4 (get_local $0) ) ) ) - (func $~lib/internal/array/insertionSort (; 128 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/array/insertionSort (; 126 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -9757,589 +8579,7 @@ (get_local $0) ) ) - (func $~lib/internal/array/weakHeapSort (; 129 ;) (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 $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - (local $15 i32) - (local $16 i32) - (local $17 i32) - (local $18 i32) - (local $19 i32) - (local $20 i32) - (local $21 i32) - (local $22 i32) - (local $23 i32) - (local $24 i32) - (local $25 i32) - (local $26 i32) - (nop) - (set_local $2 - (call $~lib/array/Array#get:length - (get_local $0) - ) - ) - (set_local $3 - (i32.shl - (i32.shr_s - (i32.add - (get_local $2) - (i32.const 31) - ) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (set_local $4 - (call $~lib/allocator/arena/allocate_memory - (get_local $3) - ) - ) - (call $~lib/memory/set_memory - (get_local $4) - (i32.const 0) - (get_local $3) - ) - (set_local $5 - (i32.load - (get_local $0) - ) - ) - (block $break|0 - (set_local $6 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|0 - (if - (i32.gt_s - (get_local $6) - (i32.const 0) - ) - (block - (block - (set_local $7 - (get_local $6) - ) - (block $break|1 - (loop $continue|1 - (if - (i32.eq - (i32.and - (get_local $7) - (i32.const 1) - ) - (i32.and - (i32.shr_s - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $7) - (i32.const 6) - ) - (i32.const 2) - ) - ) - ) - (i32.and - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - (i32.const 31) - ) - ) - (i32.const 1) - ) - ) - (block - (set_local $7 - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - ) - (br $continue|1) - ) - ) - ) - ) - (set_local $8 - (i32.shr_s - (get_local $7) - (i32.const 1) - ) - ) - (set_local $9 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.4 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.4 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $8) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (set_local $10 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.5 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.5 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $6) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (if - (i32.lt_s - (block (result i32) - (set_global $~argc - (i32.const 2) - ) - (call_indirect (type $iii) - (get_local $9) - (get_local $10) - (get_local $1) - ) - ) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $6) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (i32.xor - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $6) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.shl - (i32.const 1) - (i32.and - (get_local $6) - (i32.const 31) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.4 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $6) - (i32.const 2) - ) - ) - (get_local $9) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.5 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $8) - (i32.const 2) - ) - ) - (get_local $10) - ) - ) - ) - ) - ) - (set_local $6 - (i32.sub - (get_local $6) - (i32.const 1) - ) - ) - (br $continue|0) - ) - ) - ) - ) - (block $break|2 - (set_local $11 - (i32.sub - (get_local $2) - (i32.const 1) - ) - ) - (loop $continue|2 - (if - (i32.ge_s - (get_local $11) - (i32.const 2) - ) - (block - (block - (set_local $13 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.6 (result i32) - (set_local $12 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.6 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $12) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.6 - (set_local $14 - (i32.const 0) - ) - (set_local $15 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.7 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.7 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $11) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $14) - (i32.const 2) - ) - ) - (get_local $15) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.7 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $11) - (i32.const 2) - ) - ) - (get_local $13) - ) - ) - (set_local $16 - (i32.const 1) - ) - (block $break|3 - (loop $continue|3 - (if - (i32.lt_s - (tee_local $17 - (i32.add - (i32.shl - (get_local $16) - (i32.const 1) - ) - (i32.and - (i32.shr_s - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.and - (get_local $16) - (i32.const 31) - ) - ) - (i32.const 1) - ) - ) - ) - (get_local $11) - ) - (block - (set_local $16 - (get_local $17) - ) - (br $continue|3) - ) - ) - ) - ) - (block $break|4 - (loop $continue|4 - (if - (i32.gt_s - (get_local $16) - (i32.const 0) - ) - (block - (block - (set_local $13 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.8 (result i32) - (set_local $18 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.8 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $18) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (set_local $19 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.9 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.9 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $16) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (if - (i32.lt_s - (block (result i32) - (set_global $~argc - (i32.const 2) - ) - (call_indirect (type $iii) - (get_local $13) - (get_local $19) - (get_local $1) - ) - ) - (i32.const 0) - ) - (block - (i32.store - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - (i32.xor - (i32.load - (i32.add - (get_local $4) - (i32.shl - (i32.shr_s - (get_local $16) - (i32.const 5) - ) - (i32.const 2) - ) - ) - ) - (i32.shl - (i32.const 1) - (i32.and - (get_local $16) - (i32.const 31) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.8 - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $16) - (i32.const 2) - ) - ) - (get_local $13) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.9 - (set_local $20 - (i32.const 0) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $20) - (i32.const 2) - ) - ) - (get_local $19) - ) - ) - ) - ) - (set_local $16 - (i32.shr_s - (get_local $16) - (i32.const 1) - ) - ) - ) - (br $continue|4) - ) - ) - ) - ) - ) - (set_local $11 - (i32.sub - (get_local $11) - (i32.const 1) - ) - ) - (br $continue|2) - ) - ) - ) - ) - (call $~lib/allocator/arena/free_memory - (get_local $4) - ) - (set_local $22 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.10 (result i32) - (set_local $21 - (i32.const 1) - ) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.10 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $21) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.10 - (set_local $23 - (i32.const 1) - ) - (set_local $25 - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.11 (result i32) - (set_local $24 - (i32.const 0) - ) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.11 - (i32.load offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $24) - (i32.const 2) - ) - ) - ) - ) - ) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $23) - (i32.const 2) - ) - ) - (get_local $25) - ) - ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.11 - (set_local $26 - (i32.const 0) - ) - (i32.store offset=8 - (i32.add - (get_local $5) - (i32.shl - (get_local $26) - (i32.const 2) - ) - ) - (get_local $22) - ) - ) - (return - (get_local $0) - ) - ) - (func $~lib/array/Array#sort (; 130 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#sort (; 127 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -10461,24 +8701,16 @@ ) ) ) - (return - (if (result i32) - (i32.lt_s - (get_local $2) - (i32.const 256) - ) - (call $~lib/internal/array/insertionSort - (get_local $0) - (get_local $1) - ) - (call $~lib/internal/array/weakHeapSort + (block + (return + (call $~lib/internal/array/insertionSort (get_local $0) (get_local $1) ) ) ) ) - (func $~lib/array/Array#__get (; 131 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 128 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (set_local $2 (i32.load @@ -10496,8 +8728,8 @@ (i32.const 2) ) ) - (block $~lib/internal/arraybuffer/loadUnsafe|inlined.12 (result i32) - (br $~lib/internal/arraybuffer/loadUnsafe|inlined.12 + (block $~lib/internal/arraybuffer/loadUnsafe|inlined.4 (result i32) + (br $~lib/internal/arraybuffer/loadUnsafe|inlined.4 (i32.load offset=8 (i32.add (get_local $2) @@ -10513,7 +8745,7 @@ ) ) ) - (func $std/array/isSorted (; 132 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $std/array/isSorted (; 129 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (block $break|0 @@ -10578,7 +8810,7 @@ (i32.const 1) ) ) - (func $std/array/assertSorted (; 133 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $std/array/assertSorted (; 130 ;) (type $iiv) (param $0 i32) (param $1 i32) (if (i32.eqz (call $std/array/isSorted @@ -10600,7 +8832,7 @@ ) ) ) - (func $~lib/string/String.__eq (; 134 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 131 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -10668,7 +8900,7 @@ ) ) ) - (func $~lib/string/String.__ne (; 135 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 132 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (return (i32.eqz (call $~lib/string/String.__eq @@ -10678,7 +8910,7 @@ ) ) ) - (func $std/array/isArraysEqual (; 136 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/array/isArraysEqual (; 133 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (if (i32.eqz @@ -10748,7 +8980,7 @@ (i32.const 1) ) ) - (func $std/array/isArraysEqual|trampoline (; 137 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $std/array/isArraysEqual|trampoline (; 134 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -10771,7 +9003,7 @@ (get_local $2) ) ) - (func $~lib/array/Array#constructor (; 138 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 135 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -10845,7 +9077,7 @@ ) (get_local $0) ) - (func $~lib/internal/string/allocate (; 139 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocate (; 136 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (if @@ -10896,7 +9128,7 @@ (get_local $2) ) ) - (func $~lib/string/String#charAt (; 140 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#charAt (; 137 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eqz @@ -10947,7 +9179,7 @@ (get_local $2) ) ) - (func $~lib/string/String#concat (; 141 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 138 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -11046,7 +9278,7 @@ (get_local $5) ) ) - (func $~lib/string/String.__concat (; 142 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 139 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -11062,7 +9294,7 @@ ) ) ) - (func $std/array/createRandomString (; 143 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomString (; 140 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 f64) @@ -11124,7 +9356,7 @@ (get_local $1) ) ) - (func $~lib/array/Array#__set (; 144 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 141 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (set_local $3 @@ -11187,7 +9419,7 @@ ) ) ) - (block $~lib/internal/arraybuffer/storeUnsafe|inlined.12 + (block $~lib/internal/arraybuffer/storeUnsafe|inlined.4 (i32.store offset=8 (i32.add (get_local $3) @@ -11200,7 +9432,7 @@ ) ) ) - (func $std/array/createRandomStringArray (; 145 ;) (type $ii) (param $0 i32) (result i32) + (func $std/array/createRandomStringArray (; 142 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (set_local $1 @@ -11251,7 +9483,7 @@ (get_local $1) ) ) - (func $start~anonymous|50 (; 146 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $start~anonymous|50 (; 143 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.sub (call $~lib/string/String.__gt (get_local $0) @@ -11263,7 +9495,7 @@ ) ) ) - (func $start (; 147 ;) (type $v) + (func $start (; 144 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add