From 365884ff73a9c00b394aa873bc01925e7dd75a5d Mon Sep 17 00:00:00 2001 From: Max Graey Date: Tue, 10 Jul 2018 04:31:51 +0300 Subject: [PATCH] Add String#lastIndexOf and improve tests (#163) --- std/assembly/index.d.ts | 3 +- std/assembly/internal/string.ts | 5 + std/assembly/string.ts | 54 +- std/portable/index.d.ts | 8 +- tests/compiler/std/array-access.optimized.wat | 30 +- tests/compiler/std/array-access.untouched.wat | 56 +- tests/compiler/std/array.optimized.wat | 6 +- tests/compiler/std/array.untouched.wat | 6 +- tests/compiler/std/string.optimized.wat | 1476 +++++++++------ tests/compiler/std/string.ts | 16 + tests/compiler/std/string.untouched.wat | 1624 +++++++++++------ 11 files changed, 2112 insertions(+), 1172 deletions(-) diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 7c0c8c7d..863ac120 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -431,7 +431,8 @@ declare class String { charCodeAt(index: u32): u16; concat(other: string): string; endsWith(other: string): bool; - indexOf(other: string): u32; + indexOf(other: string, fromIndex?: i32): u32; + lastIndexOf(other: string, fromIndex?: i32): i32; includes(other: string): bool; startsWith(other: string): bool; substr(start: u32, length?: u32): string; diff --git a/std/assembly/internal/string.ts b/std/assembly/internal/string.ts index d80f9285..35d3ebe4 100644 --- a/std/assembly/internal/string.ts +++ b/std/assembly/internal/string.ts @@ -15,6 +15,11 @@ export const MAX_LENGTH = (MAX_SIZE_32 - HEADER_SIZE) >>> 1; /** Singleton empty String. */ export const EMPTY = changetype(""); // TODO: is this a bad idea with '===' in place? +@inline +export function clamp(val: T, lo: T, hi: T): T { + return max(min(val, hi), lo); +} + /** Allocates a raw String with uninitialized contents. */ export function allocate(length: i32): String { assert(length > 0 && length <= MAX_LENGTH); diff --git a/std/assembly/string.ts b/std/assembly/string.ts index cfc9f5a0..1fc0ca36 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -2,6 +2,7 @@ import { HEADER_SIZE, MAX_LENGTH, EMPTY, + clamp, allocate, isWhiteSpaceOrLineTerminator, CharCode, @@ -97,7 +98,7 @@ export class String { endsWith(searchString: String, endPosition: i32 = MAX_LENGTH): bool { assert(this !== null); if (searchString === null) return false; - var end: isize = min(max(endPosition, 0), this.length); + var end = clamp(endPosition, 0, this.length); var searchLength: isize = searchString.length; var start: isize = end - searchLength; if (start < 0) return false; @@ -206,21 +207,44 @@ export class String { return this.indexOf(searchString, position) != -1; } - indexOf(searchString: String, position: i32 = 0): i32 { + indexOf(searchString: String, fromIndex: i32 = 0): i32 { assert(this !== null); if (searchString === null) searchString = changetype("null"); - var pos: isize = position; + var searchLen: isize = searchString.length; + if (!searchLen) return 0; var len: isize = this.length; - var start: isize = min(max(pos, 0), len); - var searchLen: isize = searchString.length; - - // TODO: two-way, multiple char codes - for (let k: usize = start; k + searchLen <= len; ++k) { + if (!len) return -1; + var start = clamp(fromIndex, 0, len); + len -= searchLen; + // TODO: multiple char codes + for (let k: isize = start; k <= len; ++k) { if (!compare_memory( changetype(this) + HEADER_SIZE + (k << 1), changetype(searchString) + HEADER_SIZE, - searchLen << 1) - ) { + searchLen << 1 + )) { + return k; + } + } + return -1; + } + + lastIndexOf(searchString: String, fromIndex: i32 = 0): i32 { + assert(this !== null); + if (searchString === null) searchString = changetype("null"); + var len: isize = this.length; + var searchLen: isize = searchString.length; + if (!searchLen) return len; + if (!len) return -1; + var start = clamp(fromIndex - searchLen, 0, len); + + // TODO: multiple char codes + for (let k: isize = len - 1; k >= start; --k) { + if (!compare_memory( + changetype(this) + HEADER_SIZE + (k << 1), + changetype(searchString) + HEADER_SIZE, + searchLen << 1 + )) { return k; } } @@ -233,8 +257,8 @@ export class String { var pos: isize = position; var len: isize = this.length; - var start: isize = min(max(pos, 0), len); - var searchLength: isize = searchString.length; + var start = clamp(pos, 0, len); + var searchLength: isize = searchString.length; if (searchLength + start > len) { return false; } @@ -253,7 +277,7 @@ export class String { if (intStart < 0) { intStart = max(size + intStart, 0); } - var resultLength: isize = min(max(end, 0), size - intStart); + var resultLength = clamp(end, 0, size - intStart); if (resultLength <= 0) { return EMPTY; } @@ -269,8 +293,8 @@ export class String { substring(start: i32, end: i32 = i32.MAX_VALUE): String { assert(this !== null); var len = this.length; - var finalStart = min(max(start, 0), len); - var finalEnd = min(max(end, 0), len); + var finalStart = clamp(start, 0, len); + var finalEnd = clamp(end, 0, len); var from = min(finalStart, finalEnd); var to = max(finalStart, finalEnd); len = to - from; diff --git a/std/portable/index.d.ts b/std/portable/index.d.ts index 4ad5f738..186f2320 100644 --- a/std/portable/index.d.ts +++ b/std/portable/index.d.ts @@ -280,14 +280,14 @@ declare class String { private constructor(); - indexOf(subject: string, position?: i32): i32; + indexOf(other: string, fromIndex?: i32): i32; + lastIndexOf(other: string, fromIndex?: i32): i32; includes(other: string): bool; - lastIndexOf(subject: string, position?: i32): i32; charAt(index: i32): string; charCodeAt(index: i32): i32; substring(from: i32, to?: i32): string; - startsWith(subject: string): bool; - endsWith(subject: string): bool; + startsWith(other: string): bool; + endsWith(other: string): bool; replace(search: string, replacement: string): string; repeat(count?: i32): string; toString(): string; diff --git a/tests/compiler/std/array-access.optimized.wat b/tests/compiler/std/array-access.optimized.wat index de030a08..f654b759 100644 --- a/tests/compiler/std/array-access.optimized.wat +++ b/tests/compiler/std/array-access.optimized.wat @@ -132,7 +132,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 12) - (i32.const 231) + (i32.const 255) (i32.const 4) ) (unreachable) @@ -154,31 +154,31 @@ (get_local $1) ) ) - (tee_local $3 + (tee_local $2 (select - (tee_local $3 + (tee_local $2 (select (get_local $2) - (i32.const 0) - (i32.gt_s + (tee_local $3 + (i32.load + (get_local $0) + ) + ) + (i32.lt_s (get_local $2) - (i32.const 0) + (get_local $3) ) ) ) - (tee_local $2 - (i32.load - (get_local $0) - ) - ) - (i32.lt_s - (get_local $3) + (i32.const 0) + (i32.gt_s (get_local $2) + (i32.const 0) ) ) ) ) - (get_local $2) + (get_local $3) ) (return (i32.const 0) @@ -192,7 +192,7 @@ (i32.const 4) ) (i32.shl - (get_local $3) + (get_local $2) (i32.const 1) ) ) diff --git a/tests/compiler/std/array-access.untouched.wat b/tests/compiler/std/array-access.untouched.wat index ec79b2a5..9cd1df33 100644 --- a/tests/compiler/std/array-access.untouched.wat +++ b/tests/compiler/std/array-access.untouched.wat @@ -201,6 +201,7 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) (if (i32.eqz (i32.ne @@ -212,7 +213,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 12) - (i32.const 231) + (i32.const 255) (i32.const 4) ) (unreachable) @@ -235,32 +236,37 @@ (get_local $0) ) ) - (set_local $7 - (select - (tee_local $5 - (select - (tee_local $5 - (get_local $3) - ) - (tee_local $6 - (i32.const 0) - ) - (i32.gt_s - (get_local $5) - (get_local $6) + (set_local $8 + (block $~lib/internal/string/clamp|inlined.0 (result i32) + (set_local $5 + (i32.const 0) + ) + (select + (tee_local $6 + (select + (tee_local $6 + (get_local $3) + ) + (tee_local $7 + (get_local $4) + ) + (i32.lt_s + (get_local $6) + (get_local $7) + ) ) ) - ) - (tee_local $6 - (get_local $4) - ) - (i32.lt_s - (get_local $5) - (get_local $6) + (tee_local $7 + (get_local $5) + ) + (i32.gt_s + (get_local $6) + (get_local $7) + ) ) ) ) - (set_local $8 + (set_local $9 (i32.load (get_local $1) ) @@ -268,8 +274,8 @@ (if (i32.gt_s (i32.add + (get_local $9) (get_local $8) - (get_local $7) ) (get_local $4) ) @@ -285,7 +291,7 @@ (i32.const 4) ) (i32.shl - (get_local $7) + (get_local $8) (i32.const 1) ) ) @@ -294,7 +300,7 @@ (i32.const 4) ) (i32.shl - (get_local $8) + (get_local $9) (i32.const 1) ) ) diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index c5043c63..ecd698b9 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -5823,7 +5823,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 728) - (i32.const 20) + (i32.const 25) (i32.const 2) ) (unreachable) @@ -5855,7 +5855,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 696) - (i32.const 18) + (i32.const 19) (i32.const 4) ) (unreachable) @@ -5903,7 +5903,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 696) - (i32.const 74) + (i32.const 75) (i32.const 4) ) (unreachable) diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index c49cd975..f6616bf4 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -8611,7 +8611,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 728) - (i32.const 20) + (i32.const 25) (i32.const 2) ) (unreachable) @@ -8647,7 +8647,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 696) - (i32.const 18) + (i32.const 19) (i32.const 4) ) (unreachable) @@ -8699,7 +8699,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 696) - (i32.const 74) + (i32.const 75) (i32.const 4) ) (unreachable) diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index 62b259b4..800a37c8 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -15,7 +15,7 @@ (global $std/string/nullStr (mut i32) (i32.const 0)) (global $~argc (mut i32) (i32.const 0)) (global $std/string/c (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 524)) + (global $HEAP_BASE i32 (i32.const 536)) (memory $0 1) (data (i32.const 8) "\10\00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g") (data (i32.const 44) "\0d\00\00\00s\00t\00d\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") @@ -24,32 +24,33 @@ (data (i32.const 116) "\04\00\00\00n\00u\00l\00l") (data (i32.const 128) "\06\00\00\00s\00t\00r\00i\00n\00g") (data (i32.const 144) "\03\00\00\00I\00\'\00m") - (data (i32.const 156) "\01\00\00\00,") - (data (i32.const 164) "\01\00\00\00x") - (data (i32.const 172) "\01\00\00\000") - (data (i32.const 180) "\01\00\00\001") - (data (i32.const 188) "\05\00\00\000\00b\001\000\001") - (data (i32.const 204) "\05\00\00\000\00o\007\000\007") - (data (i32.const 220) "\05\00\00\000\00x\00f\000\00f") - (data (i32.const 236) "\05\00\00\000\00x\00F\000\00F") - (data (i32.const 252) "\03\00\00\000\001\001") - (data (i32.const 264) "\04\00\00\000\00x\001\00g") - (data (i32.const 276) "\03\00\00\000\00.\001") - (data (i32.const 288) "\03\00\00\00.\002\005") - (data (i32.const 300) "\08\00\00\00.\001\00f\00o\00o\00b\00a\00r") - (data (i32.const 320) "\01\00\00\00a") - (data (i32.const 328) "\01\00\00\00b") - (data (i32.const 340) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 392) "\02\00\00\00a\00b") - (data (i32.const 400) "\02\00\00\00b\00a") - (data (i32.const 408) "\02\00\00\00a\00a") - (data (i32.const 416) "\03\00\00\00a\00b\00c") - (data (i32.const 428) "\03\00\00\001\002\003") - (data (i32.const 440) "\03\00\00\00a\00a\00a") - (data (i32.const 452) "\08\00\00\00a\00b\00a\00b\00a\00b\00a\00b") - (data (i32.const 472) "\05\00\00\00a\00a\00a\00a\00a") - (data (i32.const 488) "\06\00\00\00a\00a\00a\00a\00a\00a") - (data (i32.const 504) "\07\00\00\00a\00a\00a\00a\00a\00a\00a") + (data (i32.const 160) "\01\00\00\00,") + (data (i32.const 168) "\01\00\00\00x") + (data (i32.const 176) "\03\00\00\00,\00 \00I") + (data (i32.const 188) "\01\00\00\000") + (data (i32.const 196) "\01\00\00\001") + (data (i32.const 204) "\05\00\00\000\00b\001\000\001") + (data (i32.const 220) "\05\00\00\000\00o\007\000\007") + (data (i32.const 236) "\05\00\00\000\00x\00f\000\00f") + (data (i32.const 252) "\05\00\00\000\00x\00F\000\00F") + (data (i32.const 268) "\03\00\00\000\001\001") + (data (i32.const 280) "\04\00\00\000\00x\001\00g") + (data (i32.const 292) "\03\00\00\000\00.\001") + (data (i32.const 304) "\03\00\00\00.\002\005") + (data (i32.const 316) "\08\00\00\00.\001\00f\00o\00o\00b\00a\00r") + (data (i32.const 336) "\01\00\00\00a") + (data (i32.const 344) "\01\00\00\00b") + (data (i32.const 352) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 404) "\02\00\00\00a\00b") + (data (i32.const 412) "\02\00\00\00b\00a") + (data (i32.const 420) "\02\00\00\00a\00a") + (data (i32.const 428) "\03\00\00\00a\00b\00c") + (data (i32.const 440) "\03\00\00\001\002\003") + (data (i32.const 452) "\03\00\00\00a\00a\00a") + (data (i32.const 464) "\08\00\00\00a\00b\00a\00b\00a\00b\00a\00b") + (data (i32.const 484) "\05\00\00\00a\00a\00a\00a\00a") + (data (i32.const 500) "\06\00\00\00a\00a\00a\00a\00a\00a") + (data (i32.const 516) "\07\00\00\00a\00a\00a\00a\00a\00a\00a") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $start) @@ -62,7 +63,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 37) + (i32.const 38) (i32.const 4) ) (unreachable) @@ -162,7 +163,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 231) + (i32.const 255) (i32.const 4) ) (unreachable) @@ -184,31 +185,31 @@ (get_local $1) ) ) - (tee_local $3 + (tee_local $2 (select - (tee_local $3 + (tee_local $2 (select (get_local $2) - (i32.const 0) - (i32.gt_s + (tee_local $3 + (i32.load + (get_local $0) + ) + ) + (i32.lt_s (get_local $2) - (i32.const 0) + (get_local $3) ) ) ) - (tee_local $2 - (i32.load - (get_local $0) - ) - ) - (i32.lt_s - (get_local $3) + (i32.const 0) + (i32.gt_s (get_local $2) + (i32.const 0) ) ) ) ) - (get_local $2) + (get_local $3) ) (return (i32.const 0) @@ -222,7 +223,7 @@ (i32.const 4) ) (i32.shl - (get_local $3) + (get_local $2) (i32.const 1) ) ) @@ -247,7 +248,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 98) + (i32.const 99) (i32.const 4) ) (unreachable) @@ -269,21 +270,21 @@ (tee_local $2 (select (get_local $2) - (i32.const 0) - (i32.gt_s + (tee_local $3 + (i32.load + (get_local $0) + ) + ) + (i32.lt_s (get_local $2) - (i32.const 0) + (get_local $3) ) ) ) - (tee_local $3 - (i32.load - (get_local $0) - ) - ) - (i32.lt_s + (i32.const 0) + (i32.gt_s (get_local $2) - (get_local $3) + (i32.const 0) ) ) (tee_local $2 @@ -356,7 +357,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 210) + (i32.const 211) (i32.const 4) ) (unreachable) @@ -370,43 +371,61 @@ (i32.const 116) ) ) - (set_local $3 - (i32.load - (get_local $1) - ) - ) - (block $break|0 - (set_local $2 - (select - (tee_local $2 - (select - (get_local $2) - (i32.const 0) - (i32.gt_s - (get_local $2) - (i32.const 0) - ) - ) - ) - (tee_local $4 - (i32.load - (get_local $0) - ) - ) - (i32.lt_s - (get_local $2) - (get_local $4) + (if + (i32.eqz + (tee_local $4 + (i32.load + (get_local $1) ) ) ) - (loop $repeat|0 - (br_if $break|0 - (i32.gt_s - (i32.add + (return + (i32.const 0) + ) + ) + (if + (i32.eqz + (tee_local $3 + (i32.load + (get_local $0) + ) + ) + ) + (return + (i32.const -1) + ) + ) + (set_local $2 + (select + (tee_local $2 + (select + (get_local $2) + (get_local $3) + (i32.lt_s (get_local $2) (get_local $3) ) - (get_local $4) + ) + ) + (i32.const 0) + (i32.gt_s + (get_local $2) + (i32.const 0) + ) + ) + ) + (set_local $3 + (i32.sub + (get_local $3) + (get_local $4) + ) + ) + (block $break|0 + (loop $repeat|0 + (br_if $break|0 + (i32.gt_s + (get_local $2) + (get_local $3) ) ) (if @@ -426,7 +445,7 @@ (i32.const 4) ) (i32.shl - (get_local $3) + (get_local $4) (i32.const 1) ) ) @@ -457,10 +476,136 @@ (i32.const -1) ) ) - (func $std/string/getString (; 8 ;) (type $i) (result i32) + (func $~lib/string/String#lastIndexOf (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (if + (i32.eqz + (get_local $0) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 76) + (i32.const 233) + (i32.const 4) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (get_local $1) + ) + (set_local $1 + (i32.const 116) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (if + (i32.eqz + (tee_local $4 + (i32.load + (get_local $1) + ) + ) + ) + (return + (get_local $3) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const -1) + ) + ) + (set_local $2 + (select + (tee_local $2 + (select + (tee_local $2 + (i32.sub + (get_local $2) + (get_local $4) + ) + ) + (get_local $3) + (i32.lt_s + (get_local $2) + (get_local $3) + ) + ) + ) + (i32.const 0) + (i32.gt_s + (get_local $2) + (i32.const 0) + ) + ) + ) + (block $break|0 + (set_local $3 + (i32.sub + (get_local $3) + (i32.const 1) + ) + ) + (loop $repeat|0 + (br_if $break|0 + (i32.lt_s + (get_local $3) + (get_local $2) + ) + ) + (if + (call $~lib/memory/compare_memory + (i32.add + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.shl + (get_local $3) + (i32.const 1) + ) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (get_local $4) + (i32.const 1) + ) + ) + (block + (set_local $3 + (i32.sub + (get_local $3) + (i32.const 1) + ) + ) + (br $repeat|0) + ) + (return + (get_local $3) + ) + ) + ) + ) + (i32.const -1) + ) + (func $std/string/getString (; 9 ;) (type $i) (result i32) (get_global $std/string/str) ) - (func $~lib/internal/string/parse (; 9 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/internal/string/parse (; 10 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local $3 i32) (local $4 i32) @@ -823,13 +968,13 @@ (get_local $5) ) ) - (func $~lib/string/parseInt (; 10 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt (; 11 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (call $~lib/internal/string/parse (get_local $0) (get_local $1) ) ) - (func $~lib/string/parseFloat (; 11 ;) (type $iF) (param $0 i32) (result f64) + (func $~lib/string/parseFloat (; 12 ;) (type $iF) (param $0 i32) (result f64) (local $1 i32) (local $2 i32) (local $3 i32) @@ -993,7 +1138,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 529) + (i32.const 553) (i32.const 10) ) (unreachable) @@ -1079,7 +1224,7 @@ (get_local $4) ) ) - (func $~lib/allocator/arena/allocate_memory (; 12 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/allocate_memory (; 13 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1165,7 +1310,7 @@ ) (i32.const 0) ) - (func $~lib/internal/string/allocate (; 13 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocate (; 14 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (tee_local $1 @@ -1188,8 +1333,8 @@ (block (call $~lib/env/abort (i32.const 0) - (i32.const 340) - (i32.const 20) + (i32.const 352) + (i32.const 25) (i32.const 2) ) (unreachable) @@ -1211,7 +1356,7 @@ ) (get_local $1) ) - (func $~lib/memory/copy_memory (; 14 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/copy_memory (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2597,7 +2742,7 @@ ) ) ) - (func $~lib/memory/move_memory (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/move_memory (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (if @@ -2889,7 +3034,7 @@ ) ) ) - (func $~lib/string/String#concat (; 16 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2902,7 +3047,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 74) + (i32.const 75) (i32.const 4) ) (unreachable) @@ -2934,7 +3079,7 @@ ) ) (return - (i32.const 336) + (i32.const 156) ) ) (call $~lib/memory/move_memory @@ -2975,7 +3120,7 @@ ) (get_local $2) ) - (func $~lib/string/String.__concat (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -2989,7 +3134,7 @@ (get_local $1) ) ) - (func $~lib/string/String.__eq (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eq @@ -3052,7 +3197,7 @@ ) ) ) - (func $~lib/string/String.__ne (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.eqz (call $~lib/string/String.__eq (get_local $0) @@ -3060,7 +3205,7 @@ ) ) ) - (func $~lib/string/String.__gt (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gt (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3144,7 +3289,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__gte (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gte (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3228,7 +3373,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lt (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lt (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3312,7 +3457,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lte (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lte (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3396,7 +3541,7 @@ (i32.const 0) ) ) - (func $~lib/string/String#repeat (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#repeat (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3408,7 +3553,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 383) + (i32.const 407) (i32.const 4) ) (unreachable) @@ -3444,7 +3589,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 388) + (i32.const 412) (i32.const 6) ) (unreachable) @@ -3467,7 +3612,7 @@ (if (get_local $2) (return - (i32.const 336) + (i32.const 156) ) ) (if @@ -3534,7 +3679,7 @@ ) (get_local $4) ) - (func $start (; 25 ;) (type $v) + (func $start (; 26 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -3655,32 +3800,10 @@ ) ) (if - (i32.ne - (call $~lib/string/String#indexOf - (get_global $std/string/str) - (i32.const 156) - (i32.const 0) - ) - (i32.const 2) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 16) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.ne - (call $~lib/string/String#indexOf - (get_global $std/string/str) - (i32.const 164) - (i32.const 0) - ) - (i32.const -1) + (call $~lib/string/String#indexOf + (i32.const 156) + (i32.const 156) + (i32.const 0) ) (block (call $~lib/env/abort @@ -3693,12 +3816,105 @@ ) ) (if - (f64.ne - (call $~lib/string/parseInt - (i32.const 172) + (i32.ne + (call $~lib/string/String#indexOf + (i32.const 156) + (i32.const 108) (i32.const 0) ) - (f64.const 0) + (i32.const -1) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 18) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 156) + (i32.const 0) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 19) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 0) + ) + (i32.const 2) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 20) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 168) + (i32.const 0) + ) + (i32.const -1) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 21) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 2) + ) + (i32.const 2) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 22) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 3) + ) + (i32.const -1) ) (block (call $~lib/env/abort @@ -3711,12 +3927,13 @@ ) ) (if - (f64.ne - (call $~lib/string/parseInt - (i32.const 180) - (i32.const 0) + (i32.ne + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 176) + (i32.const -1) ) - (f64.const 1) + (i32.const 2) ) (block (call $~lib/env/abort @@ -3729,30 +3946,10 @@ ) ) (if - (f64.ne - (call $~lib/string/parseInt - (i32.const 188) - (i32.const 0) - ) - (f64.const 5) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 25) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseInt - (i32.const 204) - (i32.const 0) - ) - (f64.const 455) + (call $~lib/string/String#lastIndexOf + (i32.const 156) + (i32.const 156) + (i32.const 0) ) (block (call $~lib/env/abort @@ -3765,12 +3962,13 @@ ) ) (if - (f64.ne - (call $~lib/string/parseInt - (i32.const 220) + (i32.ne + (call $~lib/string/String#lastIndexOf + (i32.const 156) + (i32.const 108) (i32.const 0) ) - (f64.const 3855) + (i32.const -1) ) (block (call $~lib/env/abort @@ -3782,6 +3980,194 @@ (unreachable) ) ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 156) + (i32.const 0) + ) + (i32.load + (get_global $std/string/str) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 28) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 0) + ) + (i32.const 2) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 29) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 168) + (i32.const 0) + ) + (i32.const -1) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 30) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 2) + ) + (i32.const 2) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 31) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 3) + ) + (i32.const 2) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 32) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 176) + (i32.const -1) + ) + (i32.const 2) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 33) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseInt + (i32.const 188) + (i32.const 0) + ) + (f64.const 0) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 39) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseInt + (i32.const 196) + (i32.const 0) + ) + (f64.const 1) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 40) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseInt + (i32.const 204) + (i32.const 0) + ) + (f64.const 5) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 41) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseInt + (i32.const 220) + (i32.const 0) + ) + (f64.const 455) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 42) + (i32.const 0) + ) + (unreachable) + ) + ) (if (f64.ne (call $~lib/string/parseInt @@ -3794,7 +4180,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 28) + (i32.const 43) (i32.const 0) ) (unreachable) @@ -3806,13 +4192,13 @@ (i32.const 252) (i32.const 0) ) - (f64.const 11) + (f64.const 3855) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 29) + (i32.const 44) (i32.const 0) ) (unreachable) @@ -3821,203 +4207,10 @@ (if (f64.ne (call $~lib/string/parseInt - (i32.const 264) + (i32.const 268) (i32.const 0) ) - (f64.const 1) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 30) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 172) - ) - (f64.const 0) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 32) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 180) - ) - (f64.const 1) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 33) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 276) - ) - (f64.const 0.1) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 34) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 288) - ) - (f64.const 0.25) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 35) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 300) - ) - (f64.const 0.1) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 36) - (i32.const 0) - ) - (unreachable) - ) - ) - (set_global $std/string/c - (call $~lib/string/String.__concat - (i32.const 320) - (i32.const 328) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__eq - (get_global $std/string/c) - (i32.const 392) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 39) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__ne - (get_global $std/string/c) - (i32.const 320) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 40) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__eq - (i32.const 336) - (i32.const 336) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 41) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__ne - (i32.const 336) - (get_global $std/string/nullStr) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 42) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 328) - (i32.const 320) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 44) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 400) - (i32.const 320) - ) + (f64.const 11) ) (block (call $~lib/env/abort @@ -4030,11 +4223,12 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__gte - (i32.const 400) - (i32.const 408) + (f64.ne + (call $~lib/string/parseInt + (i32.const 280) + (i32.const 0) ) + (f64.const 1) ) (block (call $~lib/env/abort @@ -4047,26 +4241,11 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 400) - (i32.const 392) + (f64.ne + (call $~lib/string/parseFloat + (i32.const 188) ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 47) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (call $~lib/string/String.__lt - (i32.const 400) - (i32.const 392) + (f64.const 0) ) (block (call $~lib/env/abort @@ -4079,9 +4258,28 @@ ) ) (if - (call $~lib/string/String.__lt - (i32.const 328) - (get_global $std/string/nullStr) + (f64.ne + (call $~lib/string/parseFloat + (i32.const 196) + ) + (f64.const 1) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 49) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseFloat + (i32.const 292) + ) + (f64.const 0.1) ) (block (call $~lib/env/abort @@ -4094,9 +4292,11 @@ ) ) (if - (call $~lib/string/String.__lt - (get_global $std/string/nullStr) - (i32.const 328) + (f64.ne + (call $~lib/string/parseFloat + (i32.const 304) + ) + (f64.const 0.25) ) (block (call $~lib/env/abort @@ -4109,44 +4309,33 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 416) - (i32.const 336) + (f64.ne + (call $~lib/string/parseFloat + (i32.const 316) ) + (f64.const 0.1) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 53) + (i32.const 52) (i32.const 0) ) (unreachable) ) ) - (if - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 336) - (i32.const 416) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 54) - (i32.const 0) - ) - (unreachable) + (set_global $std/string/c + (call $~lib/string/String.__concat + (i32.const 336) + (i32.const 344) ) ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 416) - (i32.const 336) + (call $~lib/string/String.__eq + (get_global $std/string/c) + (i32.const 404) ) ) (block @@ -4161,9 +4350,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__lte + (call $~lib/string/String.__ne + (get_global $std/string/c) (i32.const 336) - (i32.const 416) ) ) (block @@ -4177,9 +4366,11 @@ ) ) (if - (call $~lib/string/String.__lt - (i32.const 416) - (i32.const 336) + (i32.eqz + (call $~lib/string/String.__eq + (i32.const 156) + (i32.const 156) + ) ) (block (call $~lib/env/abort @@ -4192,9 +4383,11 @@ ) ) (if - (call $~lib/string/String.__gt - (i32.const 336) - (i32.const 416) + (i32.eqz + (call $~lib/string/String.__ne + (i32.const 156) + (get_global $std/string/nullStr) + ) ) (block (call $~lib/env/abort @@ -4207,24 +4400,11 @@ ) ) (if - (call $~lib/string/String.__lt - (i32.const 336) - (i32.const 336) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 59) - (i32.const 0) + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 344) + (i32.const 336) ) - (unreachable) - ) - ) - (if - (call $~lib/string/String.__gt - (i32.const 336) - (i32.const 336) ) (block (call $~lib/env/abort @@ -4238,8 +4418,8 @@ ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 336) + (call $~lib/string/String.__gt + (i32.const 412) (i32.const 336) ) ) @@ -4255,9 +4435,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__lte - (i32.const 336) - (i32.const 336) + (call $~lib/string/String.__gte + (i32.const 412) + (i32.const 420) ) ) (block @@ -4271,11 +4451,26 @@ ) ) (if - (i32.ne - (i32.load - (i32.const 428) + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 412) + (i32.const 404) ) - (i32.const 3) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 63) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (i32.const 412) + (i32.const 404) ) (block (call $~lib/env/abort @@ -4288,14 +4483,9 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 100) - ) - (i32.const 336) - ) + (call $~lib/string/String.__lt + (i32.const 344) + (get_global $std/string/nullStr) ) (block (call $~lib/env/abort @@ -4308,14 +4498,9 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 0) - ) - (i32.const 336) - ) + (call $~lib/string/String.__lt + (get_global $std/string/nullStr) + (i32.const 344) ) (block (call $~lib/env/abort @@ -4329,32 +4514,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 1) - ) - (i32.const 320) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 68) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 2) - ) - (i32.const 408) + (call $~lib/string/String.__gt + (i32.const 428) + (i32.const 156) ) ) (block @@ -4369,12 +4531,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 3) - ) - (i32.const 440) + (call $~lib/string/String.__lt + (i32.const 156) + (i32.const 428) ) ) (block @@ -4389,12 +4548,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 392) - (i32.const 4) - ) - (i32.const 452) + (call $~lib/string/String.__gte + (i32.const 428) + (i32.const 156) ) ) (block @@ -4409,12 +4565,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 5) - ) - (i32.const 472) + (call $~lib/string/String.__lte + (i32.const 156) + (i32.const 428) ) ) (block @@ -4428,14 +4581,9 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 6) - ) - (i32.const 488) - ) + (call $~lib/string/String.__lt + (i32.const 428) + (i32.const 156) ) (block (call $~lib/env/abort @@ -4448,14 +4596,9 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 7) - ) - (i32.const 504) - ) + (call $~lib/string/String.__gt + (i32.const 156) + (i32.const 428) ) (block (call $~lib/env/abort @@ -4467,5 +4610,266 @@ (unreachable) ) ) + (if + (call $~lib/string/String.__lt + (i32.const 156) + (i32.const 156) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 75) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__gt + (i32.const 156) + (i32.const 156) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 76) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 156) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 77) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 156) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 78) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.ne + (i32.load + (i32.const 440) + ) + (i32.const 3) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 80) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 156) + (i32.const 100) + ) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 82) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 0) + ) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 83) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 1) + ) + (i32.const 336) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 84) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 2) + ) + (i32.const 420) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 85) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 3) + ) + (i32.const 452) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 86) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 404) + (i32.const 4) + ) + (i32.const 464) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 87) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 5) + ) + (i32.const 484) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 88) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 6) + ) + (i32.const 500) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 89) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 7) + ) + (i32.const 516) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 90) + (i32.const 0) + ) + (unreachable) + ) + ) ) ) diff --git a/tests/compiler/std/string.ts b/tests/compiler/std/string.ts index a014aebb..1de90679 100644 --- a/tests/compiler/std/string.ts +++ b/tests/compiler/std/string.ts @@ -13,8 +13,24 @@ assert(str.charCodeAt(0) == 0x68); assert(str.startsWith("hi")); assert(str.endsWith("string")); assert(str.includes("I'm")); + +assert("".indexOf("") == 0); +assert("".indexOf("hi") == -1); +assert(str.indexOf("") == 0); assert(str.indexOf(",") == 2); assert(str.indexOf("x") == -1); +assert(str.indexOf(",", 2) == 2); +assert(str.indexOf(",", 3) == -1); +assert(str.indexOf(", I", -1) == 2); + +assert("".lastIndexOf("") == 0); +assert("".lastIndexOf("hi") == -1); +assert(str.lastIndexOf("") == str.length); +assert(str.lastIndexOf(",") == 2); +assert(str.lastIndexOf("x") == -1); +assert(str.lastIndexOf(",", 2) == 2); +assert(str.lastIndexOf(",", 3) == 2); +assert(str.lastIndexOf(", I", -1) == 2); export function getString(): string { return str; diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index 32e9b1a3..9b699fe6 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -46,9 +46,9 @@ (global $~lib/internal/string/CharCode.o i32 (i32.const 111)) (global $~lib/internal/string/CharCode.x i32 (i32.const 120)) (global $~lib/internal/string/CharCode.z i32 (i32.const 122)) - (global $~lib/internal/string/EMPTY i32 (i32.const 336)) + (global $~lib/internal/string/EMPTY i32 (i32.const 156)) (global $std/string/c (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 524)) + (global $HEAP_BASE i32 (i32.const 536)) (memory $0 1) (data (i32.const 8) "\10\00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g\00") (data (i32.const 44) "\0d\00\00\00s\00t\00d\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") @@ -57,33 +57,34 @@ (data (i32.const 116) "\04\00\00\00n\00u\00l\00l\00") (data (i32.const 128) "\06\00\00\00s\00t\00r\00i\00n\00g\00") (data (i32.const 144) "\03\00\00\00I\00\'\00m\00") - (data (i32.const 156) "\01\00\00\00,\00") - (data (i32.const 164) "\01\00\00\00x\00") - (data (i32.const 172) "\01\00\00\000\00") - (data (i32.const 180) "\01\00\00\001\00") - (data (i32.const 188) "\05\00\00\000\00b\001\000\001\00") - (data (i32.const 204) "\05\00\00\000\00o\007\000\007\00") - (data (i32.const 220) "\05\00\00\000\00x\00f\000\00f\00") - (data (i32.const 236) "\05\00\00\000\00x\00F\000\00F\00") - (data (i32.const 252) "\03\00\00\000\001\001\00") - (data (i32.const 264) "\04\00\00\000\00x\001\00g\00") - (data (i32.const 276) "\03\00\00\000\00.\001\00") - (data (i32.const 288) "\03\00\00\00.\002\005\00") - (data (i32.const 300) "\08\00\00\00.\001\00f\00o\00o\00b\00a\00r\00") - (data (i32.const 320) "\01\00\00\00a\00") - (data (i32.const 328) "\01\00\00\00b\00") - (data (i32.const 336) "\00\00\00\00") - (data (i32.const 340) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 392) "\02\00\00\00a\00b\00") - (data (i32.const 400) "\02\00\00\00b\00a\00") - (data (i32.const 408) "\02\00\00\00a\00a\00") - (data (i32.const 416) "\03\00\00\00a\00b\00c\00") - (data (i32.const 428) "\03\00\00\001\002\003\00") - (data (i32.const 440) "\03\00\00\00a\00a\00a\00") - (data (i32.const 452) "\08\00\00\00a\00b\00a\00b\00a\00b\00a\00b\00") - (data (i32.const 472) "\05\00\00\00a\00a\00a\00a\00a\00") - (data (i32.const 488) "\06\00\00\00a\00a\00a\00a\00a\00a\00") - (data (i32.const 504) "\07\00\00\00a\00a\00a\00a\00a\00a\00a\00") + (data (i32.const 156) "\00\00\00\00") + (data (i32.const 160) "\01\00\00\00,\00") + (data (i32.const 168) "\01\00\00\00x\00") + (data (i32.const 176) "\03\00\00\00,\00 \00I\00") + (data (i32.const 188) "\01\00\00\000\00") + (data (i32.const 196) "\01\00\00\001\00") + (data (i32.const 204) "\05\00\00\000\00b\001\000\001\00") + (data (i32.const 220) "\05\00\00\000\00o\007\000\007\00") + (data (i32.const 236) "\05\00\00\000\00x\00f\000\00f\00") + (data (i32.const 252) "\05\00\00\000\00x\00F\000\00F\00") + (data (i32.const 268) "\03\00\00\000\001\001\00") + (data (i32.const 280) "\04\00\00\000\00x\001\00g\00") + (data (i32.const 292) "\03\00\00\000\00.\001\00") + (data (i32.const 304) "\03\00\00\00.\002\005\00") + (data (i32.const 316) "\08\00\00\00.\001\00f\00o\00o\00b\00a\00r\00") + (data (i32.const 336) "\01\00\00\00a\00") + (data (i32.const 344) "\01\00\00\00b\00") + (data (i32.const 352) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 404) "\02\00\00\00a\00b\00") + (data (i32.const 412) "\02\00\00\00b\00a\00") + (data (i32.const 420) "\02\00\00\00a\00a\00") + (data (i32.const 428) "\03\00\00\00a\00b\00c\00") + (data (i32.const 440) "\03\00\00\001\002\003\00") + (data (i32.const 452) "\03\00\00\00a\00a\00a\00") + (data (i32.const 464) "\08\00\00\00a\00b\00a\00b\00a\00b\00a\00b\00") + (data (i32.const 484) "\05\00\00\00a\00a\00a\00a\00a\00") + (data (i32.const 500) "\06\00\00\00a\00a\00a\00a\00a\00a\00") + (data (i32.const 516) "\07\00\00\00a\00a\00a\00a\00a\00a\00a\00") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $start) @@ -99,7 +100,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 37) + (i32.const 38) (i32.const 4) ) (unreachable) @@ -197,6 +198,7 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) (if (i32.eqz (i32.ne @@ -208,7 +210,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 231) + (i32.const 255) (i32.const 4) ) (unreachable) @@ -231,32 +233,37 @@ (get_local $0) ) ) - (set_local $7 - (select - (tee_local $5 - (select - (tee_local $5 - (get_local $3) - ) - (tee_local $6 - (i32.const 0) - ) - (i32.gt_s - (get_local $5) - (get_local $6) + (set_local $8 + (block $~lib/internal/string/clamp|inlined.0 (result i32) + (set_local $5 + (i32.const 0) + ) + (select + (tee_local $6 + (select + (tee_local $6 + (get_local $3) + ) + (tee_local $7 + (get_local $4) + ) + (i32.lt_s + (get_local $6) + (get_local $7) + ) ) ) - ) - (tee_local $6 - (get_local $4) - ) - (i32.lt_s - (get_local $5) - (get_local $6) + (tee_local $7 + (get_local $5) + ) + (i32.gt_s + (get_local $6) + (get_local $7) + ) ) ) ) - (set_local $8 + (set_local $9 (i32.load (get_local $1) ) @@ -264,8 +271,8 @@ (if (i32.gt_s (i32.add + (get_local $9) (get_local $8) - (get_local $7) ) (get_local $4) ) @@ -281,7 +288,7 @@ (i32.const 4) ) (i32.shl - (get_local $7) + (get_local $8) (i32.const 1) ) ) @@ -290,7 +297,7 @@ (i32.const 4) ) (i32.shl - (get_local $8) + (get_local $9) (i32.const 1) ) ) @@ -302,6 +309,8 @@ (local $5 i32) (local $6 i32) (local $7 i32) + (local $8 i32) + (local $9 i32) (if (i32.eqz (i32.ne @@ -313,7 +322,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 98) + (i32.const 99) (i32.const 4) ) (unreachable) @@ -328,47 +337,55 @@ (i32.const 0) ) ) - (set_local $5 - (select - (tee_local $3 - (select - (tee_local $3 - (get_local $2) - ) - (tee_local $4 - (i32.const 0) - ) - (i32.gt_s - (get_local $3) - (get_local $4) - ) - ) + (set_local $7 + (block $~lib/internal/string/clamp|inlined.1 (result i32) + (set_local $3 + (i32.const 0) ) - (tee_local $4 + (set_local $4 (i32.load (get_local $0) ) ) - (i32.lt_s - (get_local $3) - (get_local $4) + (select + (tee_local $5 + (select + (tee_local $5 + (get_local $2) + ) + (tee_local $6 + (get_local $4) + ) + (i32.lt_s + (get_local $5) + (get_local $6) + ) + ) + ) + (tee_local $6 + (get_local $3) + ) + (i32.gt_s + (get_local $5) + (get_local $6) + ) ) ) ) - (set_local $6 + (set_local $8 (i32.load (get_local $1) ) ) - (set_local $7 + (set_local $9 (i32.sub - (get_local $5) - (get_local $6) + (get_local $7) + (get_local $8) ) ) (if (i32.lt_s - (get_local $7) + (get_local $9) (i32.const 0) ) (return @@ -383,7 +400,7 @@ (i32.const 4) ) (i32.shl - (get_local $7) + (get_local $9) (i32.const 1) ) ) @@ -392,7 +409,7 @@ (i32.const 4) ) (i32.shl - (get_local $6) + (get_local $8) (i32.const 1) ) ) @@ -439,7 +456,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 210) + (i32.const 211) (i32.const 4) ) (unreachable) @@ -455,55 +472,76 @@ ) ) (set_local $3 - (get_local $2) + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const 0) + ) ) (set_local $4 (i32.load (get_local $0) ) ) - (set_local $7 - (select - (tee_local $5 - (select - (tee_local $5 - (get_local $3) - ) - (tee_local $6 - (i32.const 0) - ) - (i32.gt_s - (get_local $5) - (get_local $6) - ) - ) - ) - (tee_local $6 - (get_local $4) - ) - (i32.lt_s - (get_local $5) - (get_local $6) - ) + (if + (i32.eqz + (get_local $4) + ) + (return + (i32.const -1) ) ) (set_local $8 - (i32.load - (get_local $1) + (block $~lib/internal/string/clamp|inlined.2 (result i32) + (set_local $5 + (i32.const 0) + ) + (select + (tee_local $6 + (select + (tee_local $6 + (get_local $2) + ) + (tee_local $7 + (get_local $4) + ) + (i32.lt_s + (get_local $6) + (get_local $7) + ) + ) + ) + (tee_local $7 + (get_local $5) + ) + (i32.gt_s + (get_local $6) + (get_local $7) + ) + ) + ) + ) + (set_local $4 + (i32.sub + (get_local $4) + (get_local $3) ) ) (block $break|0 (set_local $5 - (get_local $7) + (get_local $8) ) (loop $repeat|0 (br_if $break|0 (i32.eqz (i32.le_s - (i32.add - (get_local $5) - (get_local $8) - ) + (get_local $5) (get_local $4) ) ) @@ -526,7 +564,7 @@ (i32.const 4) ) (i32.shl - (get_local $8) + (get_local $3) (i32.const 1) ) ) @@ -556,10 +594,160 @@ (i32.const -1) ) ) - (func $std/string/getString (; 8 ;) (type $i) (result i32) + (func $~lib/string/String#lastIndexOf (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (if + (i32.eqz + (i32.ne + (get_local $0) + (i32.const 0) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 76) + (i32.const 233) + (i32.const 4) + ) + (unreachable) + ) + ) + (if + (i32.eq + (get_local $1) + (i32.const 0) + ) + (set_local $1 + (i32.const 116) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (set_local $4 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (get_local $4) + ) + (return + (get_local $3) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const -1) + ) + ) + (set_local $9 + (block $~lib/internal/string/clamp|inlined.3 (result i32) + (set_local $5 + (i32.sub + (get_local $2) + (get_local $4) + ) + ) + (set_local $6 + (i32.const 0) + ) + (select + (tee_local $7 + (select + (tee_local $7 + (get_local $5) + ) + (tee_local $8 + (get_local $3) + ) + (i32.lt_s + (get_local $7) + (get_local $8) + ) + ) + ) + (tee_local $8 + (get_local $6) + ) + (i32.gt_s + (get_local $7) + (get_local $8) + ) + ) + ) + ) + (block $break|0 + (set_local $6 + (i32.sub + (get_local $3) + (i32.const 1) + ) + ) + (loop $repeat|0 + (br_if $break|0 + (i32.eqz + (i32.ge_s + (get_local $6) + (get_local $9) + ) + ) + ) + (if + (i32.eqz + (call $~lib/memory/compare_memory + (i32.add + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.shl + (get_local $6) + (i32.const 1) + ) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (get_local $4) + (i32.const 1) + ) + ) + ) + (return + (get_local $6) + ) + ) + (set_local $6 + (i32.sub + (get_local $6) + (i32.const 1) + ) + ) + (br $repeat|0) + ) + ) + (i32.const -1) + ) + (func $std/string/getString (; 9 ;) (type $i) (result i32) (get_global $std/string/str) ) - (func $~lib/internal/string/parse (; 9 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/internal/string/parse (; 10 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local $3 i32) (local $4 i32) @@ -949,13 +1137,13 @@ (get_local $7) ) ) - (func $~lib/string/parseInt (; 10 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt (; 11 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (call $~lib/internal/string/parse (get_local $0) (get_local $1) ) ) - (func $~lib/string/parseFloat (; 11 ;) (type $iF) (param $0 i32) (result f64) + (func $~lib/string/parseFloat (; 12 ;) (type $iF) (param $0 i32) (result f64) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1139,7 +1327,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 529) + (i32.const 553) (i32.const 10) ) (unreachable) @@ -1232,7 +1420,7 @@ (get_local $5) ) ) - (func $~lib/allocator/arena/allocate_memory (; 12 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/allocate_memory (; 13 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1340,7 +1528,7 @@ ) (i32.const 0) ) - (func $~lib/internal/string/allocate (; 13 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocate (; 14 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (if @@ -1362,8 +1550,8 @@ (block (call $~lib/env/abort (i32.const 0) - (i32.const 340) - (i32.const 20) + (i32.const 352) + (i32.const 25) (i32.const 2) ) (unreachable) @@ -1386,7 +1574,7 @@ ) (get_local $2) ) - (func $~lib/memory/copy_memory (; 14 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/copy_memory (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3188,7 +3376,7 @@ ) ) ) - (func $~lib/memory/move_memory (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/move_memory (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -3506,7 +3694,7 @@ ) ) ) - (func $~lib/string/String#concat (; 16 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3522,7 +3710,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 74) + (i32.const 75) (i32.const 4) ) (unreachable) @@ -3559,7 +3747,7 @@ (i32.const 0) ) (return - (i32.const 336) + (i32.const 156) ) ) (set_local $5 @@ -3603,7 +3791,7 @@ ) (get_local $5) ) - (func $~lib/string/String.__concat (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -3617,7 +3805,7 @@ (get_local $1) ) ) - (func $~lib/string/String.__eq (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3680,7 +3868,7 @@ ) ) ) - (func $~lib/string/String.__ne (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.eqz (call $~lib/string/String.__eq (get_local $0) @@ -3688,7 +3876,7 @@ ) ) ) - (func $~lib/string/String.__gt (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gt (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3779,7 +3967,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__gte (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gte (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3872,7 +4060,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lt (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lt (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3963,7 +4151,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lte (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lte (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4056,7 +4244,7 @@ (i32.const 0) ) ) - (func $~lib/string/String#repeat (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#repeat (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4073,7 +4261,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 383) + (i32.const 407) (i32.const 4) ) (unreachable) @@ -4108,7 +4296,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 76) - (i32.const 388) + (i32.const 412) (i32.const 6) ) (unreachable) @@ -4128,7 +4316,7 @@ ) ) (return - (i32.const 336) + (i32.const 156) ) ) (if @@ -4200,7 +4388,7 @@ ) (get_local $4) ) - (func $start (; 25 ;) (type $v) + (func $start (; 26 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -4335,32 +4523,11 @@ (i32.eqz (i32.eq (call $~lib/string/String#indexOf - (get_global $std/string/str) + (i32.const 156) (i32.const 156) (i32.const 0) ) - (i32.const 2) - ) - ) - (block - (call $~lib/env/abort (i32.const 0) - (i32.const 44) - (i32.const 16) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (i32.eq - (call $~lib/string/String#indexOf - (get_global $std/string/str) - (i32.const 164) - (i32.const 0) - ) - (i32.const -1) ) ) (block @@ -4375,12 +4542,118 @@ ) (if (i32.eqz - (f64.eq - (call $~lib/string/parseInt - (i32.const 172) + (i32.eq + (call $~lib/string/String#indexOf + (i32.const 156) + (i32.const 108) (i32.const 0) ) - (f64.const 0) + (i32.const -1) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 18) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 156) + (i32.const 0) + ) + (i32.const 0) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 19) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 0) + ) + (i32.const 2) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 20) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 168) + (i32.const 0) + ) + (i32.const -1) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 21) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 2) + ) + (i32.const 2) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 22) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 3) + ) + (i32.const -1) ) ) (block @@ -4395,12 +4668,13 @@ ) (if (i32.eqz - (f64.eq - (call $~lib/string/parseInt - (i32.const 180) - (i32.const 0) + (i32.eq + (call $~lib/string/String#indexOf + (get_global $std/string/str) + (i32.const 176) + (i32.const -1) ) - (f64.const 1) + (i32.const 2) ) ) (block @@ -4415,32 +4689,13 @@ ) (if (i32.eqz - (f64.eq - (call $~lib/string/parseInt - (i32.const 188) + (i32.eq + (call $~lib/string/String#lastIndexOf + (i32.const 156) + (i32.const 156) (i32.const 0) ) - (f64.const 5) - ) - ) - (block - (call $~lib/env/abort (i32.const 0) - (i32.const 44) - (i32.const 25) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseInt - (i32.const 204) - (i32.const 0) - ) - (f64.const 455) ) ) (block @@ -4455,12 +4710,13 @@ ) (if (i32.eqz - (f64.eq - (call $~lib/string/parseInt - (i32.const 220) + (i32.eq + (call $~lib/string/String#lastIndexOf + (i32.const 156) + (i32.const 108) (i32.const 0) ) - (f64.const 3855) + (i32.const -1) ) ) (block @@ -4473,6 +4729,214 @@ (unreachable) ) ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 156) + (i32.const 0) + ) + (i32.load + (get_global $std/string/str) + ) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 28) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 0) + ) + (i32.const 2) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 29) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 168) + (i32.const 0) + ) + (i32.const -1) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 30) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 2) + ) + (i32.const 2) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 31) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 160) + (i32.const 3) + ) + (i32.const 2) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 32) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 176) + (i32.const -1) + ) + (i32.const 2) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 33) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseInt + (i32.const 188) + (i32.const 0) + ) + (f64.const 0) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 39) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseInt + (i32.const 196) + (i32.const 0) + ) + (f64.const 1) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 40) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseInt + (i32.const 204) + (i32.const 0) + ) + (f64.const 5) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 41) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseInt + (i32.const 220) + (i32.const 0) + ) + (f64.const 455) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 42) + (i32.const 0) + ) + (unreachable) + ) + ) (if (i32.eqz (f64.eq @@ -4487,7 +4951,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 28) + (i32.const 43) (i32.const 0) ) (unreachable) @@ -4500,14 +4964,14 @@ (i32.const 252) (i32.const 0) ) - (f64.const 11) + (f64.const 3855) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 29) + (i32.const 44) (i32.const 0) ) (unreachable) @@ -4517,213 +4981,10 @@ (i32.eqz (f64.eq (call $~lib/string/parseInt - (i32.const 264) + (i32.const 268) (i32.const 0) ) - (f64.const 1) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 30) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 172) - ) - (f64.const 0) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 32) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 180) - ) - (f64.const 1) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 33) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 276) - ) - (f64.const 0.1) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 34) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 288) - ) - (f64.const 0.25) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 35) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 300) - ) - (f64.const 0.1) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 36) - (i32.const 0) - ) - (unreachable) - ) - ) - (set_global $std/string/c - (call $~lib/string/String.__concat - (i32.const 320) - (i32.const 328) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__eq - (get_global $std/string/c) - (i32.const 392) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 39) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__ne - (get_global $std/string/c) - (i32.const 320) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 40) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__eq - (i32.const 336) - (i32.const 336) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 41) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__ne - (i32.const 336) - (get_global $std/string/nullStr) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 42) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 328) - (i32.const 320) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 44) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 400) - (i32.const 320) + (f64.const 11) ) ) (block @@ -4738,9 +4999,12 @@ ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 400) - (i32.const 408) + (f64.eq + (call $~lib/string/parseInt + (i32.const 280) + (i32.const 0) + ) + (f64.const 1) ) ) (block @@ -4755,28 +5019,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__gt - (i32.const 400) - (i32.const 392) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 47) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 400) - (i32.const 392) + (f64.eq + (call $~lib/string/parseFloat + (i32.const 188) ) + (f64.const 0) ) ) (block @@ -4791,11 +5038,30 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 328) - (get_global $std/string/nullStr) + (f64.eq + (call $~lib/string/parseFloat + (i32.const 196) ) + (f64.const 1) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 49) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseFloat + (i32.const 292) + ) + (f64.const 0.1) ) ) (block @@ -4810,11 +5076,11 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (get_global $std/string/nullStr) - (i32.const 328) + (f64.eq + (call $~lib/string/parseFloat + (i32.const 304) ) + (f64.const 0.25) ) ) (block @@ -4829,43 +5095,34 @@ ) (if (i32.eqz - (call $~lib/string/String.__gt - (i32.const 416) - (i32.const 336) + (f64.eq + (call $~lib/string/parseFloat + (i32.const 316) + ) + (f64.const 0.1) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 53) + (i32.const 52) (i32.const 0) ) (unreachable) ) ) - (if - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 336) - (i32.const 416) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 54) - (i32.const 0) - ) - (unreachable) + (set_global $std/string/c + (call $~lib/string/String.__concat + (i32.const 336) + (i32.const 344) ) ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 416) - (i32.const 336) + (call $~lib/string/String.__eq + (get_global $std/string/c) + (i32.const 404) ) ) (block @@ -4880,9 +5137,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__lte + (call $~lib/string/String.__ne + (get_global $std/string/c) (i32.const 336) - (i32.const 416) ) ) (block @@ -4897,11 +5154,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 416) - (i32.const 336) - ) + (call $~lib/string/String.__eq + (i32.const 156) + (i32.const 156) ) ) (block @@ -4916,11 +5171,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 336) - (i32.const 416) - ) + (call $~lib/string/String.__ne + (i32.const 156) + (get_global $std/string/nullStr) ) ) (block @@ -4935,30 +5188,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 336) - (i32.const 336) - ) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 59) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 336) - (i32.const 336) - ) + (call $~lib/string/String.__gt + (i32.const 344) + (i32.const 336) ) ) (block @@ -4973,8 +5205,8 @@ ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 336) + (call $~lib/string/String.__gt + (i32.const 412) (i32.const 336) ) ) @@ -4990,9 +5222,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__lte - (i32.const 336) - (i32.const 336) + (call $~lib/string/String.__gte + (i32.const 412) + (i32.const 420) ) ) (block @@ -5007,11 +5239,28 @@ ) (if (i32.eqz - (i32.eq - (i32.load - (i32.const 428) + (call $~lib/string/String.__gt + (i32.const 412) + (i32.const 404) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 63) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 412) + (i32.const 404) ) - (i32.const 3) ) ) (block @@ -5026,12 +5275,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 100) + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 344) + (get_global $std/string/nullStr) ) - (i32.const 336) ) ) (block @@ -5046,12 +5294,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 0) + (i32.eqz + (call $~lib/string/String.__lt + (get_global $std/string/nullStr) + (i32.const 344) ) - (i32.const 336) ) ) (block @@ -5066,32 +5313,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 1) - ) - (i32.const 320) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 68) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 2) - ) - (i32.const 408) + (call $~lib/string/String.__gt + (i32.const 428) + (i32.const 156) ) ) (block @@ -5106,12 +5330,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 3) - ) - (i32.const 440) + (call $~lib/string/String.__lt + (i32.const 156) + (i32.const 428) ) ) (block @@ -5126,12 +5347,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 392) - (i32.const 4) - ) - (i32.const 452) + (call $~lib/string/String.__gte + (i32.const 428) + (i32.const 156) ) ) (block @@ -5146,12 +5364,9 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 5) - ) - (i32.const 472) + (call $~lib/string/String.__lte + (i32.const 156) + (i32.const 428) ) ) (block @@ -5166,12 +5381,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 6) + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 428) + (i32.const 156) ) - (i32.const 488) ) ) (block @@ -5186,12 +5400,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__eq - (call $~lib/string/String#repeat - (i32.const 320) - (i32.const 7) + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 156) + (i32.const 428) ) - (i32.const 504) ) ) (block @@ -5204,5 +5417,276 @@ (unreachable) ) ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 156) + (i32.const 156) + ) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 75) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 156) + (i32.const 156) + ) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 76) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 156) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 77) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 156) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 78) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (i32.load + (i32.const 440) + ) + (i32.const 3) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 80) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 156) + (i32.const 100) + ) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 82) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 0) + ) + (i32.const 156) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 83) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 1) + ) + (i32.const 336) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 84) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 2) + ) + (i32.const 420) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 85) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 3) + ) + (i32.const 452) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 86) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 404) + (i32.const 4) + ) + (i32.const 464) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 87) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 5) + ) + (i32.const 484) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 88) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 6) + ) + (i32.const 500) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 89) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 336) + (i32.const 7) + ) + (i32.const 516) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 90) + (i32.const 0) + ) + (unreachable) + ) + ) ) )