diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 1fc0ca36..8d704b8f 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -229,17 +229,17 @@ export class String { return -1; } - lastIndexOf(searchString: String, fromIndex: i32 = 0): i32 { + lastIndexOf(searchString: String, fromIndex: i32 = i32.MAX_VALUE): 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); + var start = clamp(fromIndex, 0, len - searchLen); // TODO: multiple char codes - for (let k: isize = len - 1; k >= start; --k) { + for (let k = start; k >= 0; --k) { if (!compare_memory( changetype(this) + HEADER_SIZE + (k << 1), changetype(searchString) + HEADER_SIZE, diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index 800a37c8..4665e9e3 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 536)) + (global $HEAP_BASE i32 (i32.const 552)) (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") @@ -27,30 +27,32 @@ (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") + (data (i32.const 188) "\01\00\00\00g") + (data (i32.const 196) "\01\00\00\00i") + (data (i32.const 204) "\01\00\00\000") + (data (i32.const 212) "\01\00\00\001") + (data (i32.const 220) "\05\00\00\000\00b\001\000\001") + (data (i32.const 236) "\05\00\00\000\00o\007\000\007") + (data (i32.const 252) "\05\00\00\000\00x\00f\000\00f") + (data (i32.const 268) "\05\00\00\000\00x\00F\000\00F") + (data (i32.const 284) "\03\00\00\000\001\001") + (data (i32.const 296) "\04\00\00\000\00x\001\00g") + (data (i32.const 308) "\03\00\00\000\00.\001") + (data (i32.const 320) "\03\00\00\00.\002\005") + (data (i32.const 332) "\08\00\00\00.\001\00f\00o\00o\00b\00a\00r") + (data (i32.const 352) "\01\00\00\00a") + (data (i32.const 360) "\01\00\00\00b") + (data (i32.const 368) "\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 420) "\02\00\00\00a\00b") + (data (i32.const 428) "\02\00\00\00b\00a") + (data (i32.const 436) "\02\00\00\00a\00a") + (data (i32.const 444) "\03\00\00\00a\00b\00c") + (data (i32.const 456) "\03\00\00\001\002\003") + (data (i32.const 468) "\03\00\00\00a\00a\00a") + (data (i32.const 480) "\08\00\00\00a\00b\00a\00b\00a\00b\00a\00b") + (data (i32.const 500) "\05\00\00\00a\00a\00a\00a\00a") + (data (i32.const 516) "\06\00\00\00a\00a\00a\00a\00a\00a") + (data (i32.const 532) "\07\00\00\00a\00a\00a\00a\00a\00a\00a") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $start) @@ -526,42 +528,36 @@ (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) + (select + (tee_local $2 + (select + (get_local $2) + (tee_local $3 + (i32.sub + (get_local $3) + (get_local $4) + ) + ) + (i32.lt_s + (get_local $2) + (get_local $3) + ) + ) + ) + (i32.const 0) + (i32.gt_s + (get_local $2) + (i32.const 0) + ) ) ) (loop $repeat|0 (br_if $break|0 (i32.lt_s (get_local $3) - (get_local $2) + (i32.const 0) ) ) (if @@ -602,10 +598,33 @@ ) (i32.const -1) ) - (func $std/string/getString (; 9 ;) (type $i) (result i32) + (func $~lib/string/String#lastIndexOf|trampoline (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (block $1of1 + (block $0of1 + (block $oob + (br_table $0of1 $1of1 $oob + (i32.sub + (get_global $~argc) + (i32.const 1) + ) + ) + ) + (unreachable) + ) + (set_local $2 + (i32.const 2147483647) + ) + ) + (call $~lib/string/String#lastIndexOf + (get_local $0) + (get_local $1) + (get_local $2) + ) + ) + (func $std/string/getString (; 10 ;) (type $i) (result i32) (get_global $std/string/str) ) - (func $~lib/internal/string/parse (; 10 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/internal/string/parse (; 11 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local $3 i32) (local $4 i32) @@ -968,13 +987,13 @@ (get_local $5) ) ) - (func $~lib/string/parseInt (; 11 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt (; 12 ;) (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 (; 12 ;) (type $iF) (param $0 i32) (result f64) + (func $~lib/string/parseFloat (; 13 ;) (type $iF) (param $0 i32) (result f64) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1224,7 +1243,7 @@ (get_local $4) ) ) - (func $~lib/allocator/arena/allocate_memory (; 13 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/allocate_memory (; 14 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1310,7 +1329,7 @@ ) (i32.const 0) ) - (func $~lib/internal/string/allocate (; 14 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocate (; 15 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (tee_local $1 @@ -1333,7 +1352,7 @@ (block (call $~lib/env/abort (i32.const 0) - (i32.const 352) + (i32.const 368) (i32.const 25) (i32.const 2) ) @@ -1356,7 +1375,7 @@ ) (get_local $1) ) - (func $~lib/memory/copy_memory (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/copy_memory (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2742,7 +2761,7 @@ ) ) ) - (func $~lib/memory/move_memory (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/move_memory (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (if @@ -3034,7 +3053,7 @@ ) ) ) - (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) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3120,7 +3139,7 @@ ) (get_local $2) ) - (func $~lib/string/String.__concat (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -3134,7 +3153,7 @@ (get_local $1) ) ) - (func $~lib/string/String.__eq (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eq @@ -3197,7 +3216,7 @@ ) ) ) - (func $~lib/string/String.__ne (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.eqz (call $~lib/string/String.__eq (get_local $0) @@ -3205,7 +3224,7 @@ ) ) ) - (func $~lib/string/String.__gt (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gt (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3289,7 +3308,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__gte (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gte (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3373,7 +3392,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lt (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3457,7 +3476,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lte (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lte (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3541,7 +3560,7 @@ (i32.const 0) ) ) - (func $~lib/string/String#repeat (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#repeat (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3679,7 +3698,7 @@ ) (get_local $4) ) - (func $start (; 26 ;) (type $v) + (func $start (; 27 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -3945,8 +3964,11 @@ (unreachable) ) ) + (set_global $~argc + (i32.const 1) + ) (if - (call $~lib/string/String#lastIndexOf + (call $~lib/string/String#lastIndexOf|trampoline (i32.const 156) (i32.const 156) (i32.const 0) @@ -3961,9 +3983,12 @@ (unreachable) ) ) + (set_global $~argc + (i32.const 1) + ) (if (i32.ne - (call $~lib/string/String#lastIndexOf + (call $~lib/string/String#lastIndexOf|trampoline (i32.const 156) (i32.const 108) (i32.const 0) @@ -3980,9 +4005,12 @@ (unreachable) ) ) + (set_global $~argc + (i32.const 1) + ) (if (i32.ne - (call $~lib/string/String#lastIndexOf + (call $~lib/string/String#lastIndexOf|trampoline (get_global $std/string/str) (i32.const 156) (i32.const 0) @@ -4001,9 +4029,12 @@ (unreachable) ) ) + (set_global $~argc + (i32.const 1) + ) (if (i32.ne - (call $~lib/string/String#lastIndexOf + (call $~lib/string/String#lastIndexOf|trampoline (get_global $std/string/str) (i32.const 160) (i32.const 0) @@ -4020,9 +4051,12 @@ (unreachable) ) ) + (set_global $~argc + (i32.const 1) + ) (if (i32.ne - (call $~lib/string/String#lastIndexOf + (call $~lib/string/String#lastIndexOf|trampoline (get_global $std/string/str) (i32.const 168) (i32.const 0) @@ -4039,6 +4073,28 @@ (unreachable) ) ) + (set_global $~argc + (i32.const 1) + ) + (if + (i32.ne + (call $~lib/string/String#lastIndexOf|trampoline + (get_global $std/string/str) + (i32.const 188) + (i32.const 0) + ) + (i32.const 15) + ) + (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 @@ -4052,7 +4108,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 31) + (i32.const 32) (i32.const 0) ) (unreachable) @@ -4071,7 +4127,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 32) + (i32.const 33) (i32.const 0) ) (unreachable) @@ -4084,49 +4140,48 @@ (i32.const 176) (i32.const -1) ) - (i32.const 2) + (i32.const -1) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 33) + (i32.const 34) (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.ne + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) (i32.const 196) (i32.const 0) ) - (f64.const 1) + (i32.const -1) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 40) + (i32.const 35) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 108) + (i32.const 0) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 36) (i32.const 0) ) (unreachable) @@ -4138,25 +4193,7 @@ (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) + (f64.const 0) ) (block (call $~lib/env/abort @@ -4171,10 +4208,10 @@ (if (f64.ne (call $~lib/string/parseInt - (i32.const 236) + (i32.const 212) (i32.const 0) ) - (f64.const 3855) + (f64.const 1) ) (block (call $~lib/env/abort @@ -4186,6 +4223,42 @@ (unreachable) ) ) + (if + (f64.ne + (call $~lib/string/parseInt + (i32.const 220) + (i32.const 0) + ) + (f64.const 5) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 44) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseInt + (i32.const 236) + (i32.const 0) + ) + (f64.const 455) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 45) + (i32.const 0) + ) + (unreachable) + ) + ) (if (f64.ne (call $~lib/string/parseInt @@ -4198,7 +4271,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 44) + (i32.const 46) (i32.const 0) ) (unreachable) @@ -4210,13 +4283,13 @@ (i32.const 268) (i32.const 0) ) - (f64.const 11) + (f64.const 3855) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 45) + (i32.const 47) (i32.const 0) ) (unreachable) @@ -4225,27 +4298,10 @@ (if (f64.ne (call $~lib/string/parseInt - (i32.const 280) + (i32.const 284) (i32.const 0) ) - (f64.const 1) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 46) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 188) - ) - (f64.const 0) + (f64.const 11) ) (block (call $~lib/env/abort @@ -4259,8 +4315,9 @@ ) (if (f64.ne - (call $~lib/string/parseFloat - (i32.const 196) + (call $~lib/string/parseInt + (i32.const 296) + (i32.const 0) ) (f64.const 1) ) @@ -4277,26 +4334,9 @@ (if (f64.ne (call $~lib/string/parseFloat - (i32.const 292) + (i32.const 204) ) - (f64.const 0.1) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 50) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (f64.ne - (call $~lib/string/parseFloat - (i32.const 304) - ) - (f64.const 0.25) + (f64.const 0) ) (block (call $~lib/env/abort @@ -4311,9 +4351,9 @@ (if (f64.ne (call $~lib/string/parseFloat - (i32.const 316) + (i32.const 212) ) - (f64.const 0.1) + (f64.const 1) ) (block (call $~lib/env/abort @@ -4325,18 +4365,46 @@ (unreachable) ) ) - (set_global $std/string/c - (call $~lib/string/String.__concat - (i32.const 336) - (i32.const 344) + (if + (f64.ne + (call $~lib/string/parseFloat + (i32.const 308) + ) + (f64.const 0.1) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 53) + (i32.const 0) + ) + (unreachable) ) ) (if - (i32.eqz - (call $~lib/string/String.__eq - (get_global $std/string/c) - (i32.const 404) + (f64.ne + (call $~lib/string/parseFloat + (i32.const 320) ) + (f64.const 0.25) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 54) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (f64.ne + (call $~lib/string/parseFloat + (i32.const 332) + ) + (f64.const 0.1) ) (block (call $~lib/env/abort @@ -4348,18 +4416,41 @@ (unreachable) ) ) + (set_global $std/string/c + (call $~lib/string/String.__concat + (i32.const 352) + (i32.const 360) + ) + ) (if (i32.eqz - (call $~lib/string/String.__ne + (call $~lib/string/String.__eq (get_global $std/string/c) - (i32.const 336) + (i32.const 420) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 56) + (i32.const 58) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__ne + (get_global $std/string/c) + (i32.const 352) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 59) (i32.const 0) ) (unreachable) @@ -4376,7 +4467,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 57) + (i32.const 60) (i32.const 0) ) (unreachable) @@ -4389,40 +4480,6 @@ (get_global $std/string/nullStr) ) ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 58) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 344) - (i32.const 336) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 60) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 412) - (i32.const 336) - ) - ) (block (call $~lib/env/abort (i32.const 0) @@ -4433,28 +4490,11 @@ (unreachable) ) ) - (if - (i32.eqz - (call $~lib/string/String.__gte - (i32.const 412) - (i32.const 420) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 62) - (i32.const 0) - ) - (unreachable) - ) - ) (if (i32.eqz (call $~lib/string/String.__gt - (i32.const 412) - (i32.const 404) + (i32.const 360) + (i32.const 352) ) ) (block @@ -4468,9 +4508,11 @@ ) ) (if - (call $~lib/string/String.__lt - (i32.const 412) - (i32.const 404) + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 428) + (i32.const 352) + ) ) (block (call $~lib/env/abort @@ -4483,9 +4525,28 @@ ) ) (if - (call $~lib/string/String.__lt - (i32.const 344) - (get_global $std/string/nullStr) + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 428) + (i32.const 436) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 65) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 428) + (i32.const 420) + ) ) (block (call $~lib/env/abort @@ -4499,8 +4560,8 @@ ) (if (call $~lib/string/String.__lt - (get_global $std/string/nullStr) - (i32.const 344) + (i32.const 428) + (i32.const 420) ) (block (call $~lib/env/abort @@ -4513,11 +4574,9 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 428) - (i32.const 156) - ) + (call $~lib/string/String.__lt + (i32.const 360) + (get_global $std/string/nullStr) ) (block (call $~lib/env/abort @@ -4530,11 +4589,9 @@ ) ) (if - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 156) - (i32.const 428) - ) + (call $~lib/string/String.__lt + (get_global $std/string/nullStr) + (i32.const 360) ) (block (call $~lib/env/abort @@ -4548,28 +4605,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 428) + (call $~lib/string/String.__gt + (i32.const 444) (i32.const 156) ) ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 71) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__lte - (i32.const 156) - (i32.const 428) - ) - ) (block (call $~lib/env/abort (i32.const 0) @@ -4581,9 +4621,11 @@ ) ) (if - (call $~lib/string/String.__lt - (i32.const 428) - (i32.const 156) + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 156) + (i32.const 444) + ) ) (block (call $~lib/env/abort @@ -4596,9 +4638,11 @@ ) ) (if - (call $~lib/string/String.__gt - (i32.const 156) - (i32.const 428) + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 444) + (i32.const 156) + ) ) (block (call $~lib/env/abort @@ -4610,6 +4654,53 @@ (unreachable) ) ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 156) + (i32.const 444) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 75) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (i32.const 444) + (i32.const 156) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 76) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__gt + (i32.const 156) + (i32.const 444) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 77) + (i32.const 0) + ) + (unreachable) + ) + ) (if (call $~lib/string/String.__lt (i32.const 156) @@ -4619,7 +4710,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 75) + (i32.const 78) (i32.const 0) ) (unreachable) @@ -4634,7 +4725,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 76) + (i32.const 79) (i32.const 0) ) (unreachable) @@ -4651,7 +4742,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 77) + (i32.const 80) (i32.const 0) ) (unreachable) @@ -4668,7 +4759,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 78) + (i32.const 81) (i32.const 0) ) (unreachable) @@ -4677,7 +4768,7 @@ (if (i32.ne (i32.load - (i32.const 440) + (i32.const 456) ) (i32.const 3) ) @@ -4685,7 +4776,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 80) + (i32.const 83) (i32.const 0) ) (unreachable) @@ -4701,66 +4792,6 @@ (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) @@ -4775,10 +4806,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 3) + (i32.const 352) + (i32.const 0) ) - (i32.const 452) + (i32.const 156) ) ) (block @@ -4795,10 +4826,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 404) - (i32.const 4) + (i32.const 352) + (i32.const 1) ) - (i32.const 464) + (i32.const 352) ) ) (block @@ -4815,10 +4846,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 5) + (i32.const 352) + (i32.const 2) ) - (i32.const 484) + (i32.const 436) ) ) (block @@ -4835,10 +4866,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 6) + (i32.const 352) + (i32.const 3) ) - (i32.const 500) + (i32.const 468) ) ) (block @@ -4855,10 +4886,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 7) + (i32.const 420) + (i32.const 4) ) - (i32.const 516) + (i32.const 480) ) ) (block @@ -4871,5 +4902,65 @@ (unreachable) ) ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 352) + (i32.const 5) + ) + (i32.const 500) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 91) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 352) + (i32.const 6) + ) + (i32.const 516) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 92) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 352) + (i32.const 7) + ) + (i32.const 532) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 93) + (i32.const 0) + ) + (unreachable) + ) + ) ) ) diff --git a/tests/compiler/std/string.ts b/tests/compiler/std/string.ts index 1de90679..0726919a 100644 --- a/tests/compiler/std/string.ts +++ b/tests/compiler/std/string.ts @@ -28,9 +28,12 @@ assert("".lastIndexOf("hi") == -1); assert(str.lastIndexOf("") == str.length); assert(str.lastIndexOf(",") == 2); assert(str.lastIndexOf("x") == -1); +assert(str.lastIndexOf("g") == 15); assert(str.lastIndexOf(",", 2) == 2); assert(str.lastIndexOf(",", 3) == 2); -assert(str.lastIndexOf(", I", -1) == 2); +assert(str.lastIndexOf(", I", -1) == -1); +assert(str.lastIndexOf("i", 0) == -1); +assert(str.lastIndexOf("hi", 0) == 0); export function getString(): string { return str; diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index 9b699fe6..3e147173 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -48,7 +48,7 @@ (global $~lib/internal/string/CharCode.z i32 (i32.const 122)) (global $~lib/internal/string/EMPTY i32 (i32.const 156)) (global $std/string/c (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 536)) + (global $HEAP_BASE i32 (i32.const 552)) (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") @@ -61,30 +61,32 @@ (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") + (data (i32.const 188) "\01\00\00\00g\00") + (data (i32.const 196) "\01\00\00\00i\00") + (data (i32.const 204) "\01\00\00\000\00") + (data (i32.const 212) "\01\00\00\001\00") + (data (i32.const 220) "\05\00\00\000\00b\001\000\001\00") + (data (i32.const 236) "\05\00\00\000\00o\007\000\007\00") + (data (i32.const 252) "\05\00\00\000\00x\00f\000\00f\00") + (data (i32.const 268) "\05\00\00\000\00x\00F\000\00F\00") + (data (i32.const 284) "\03\00\00\000\001\001\00") + (data (i32.const 296) "\04\00\00\000\00x\001\00g\00") + (data (i32.const 308) "\03\00\00\000\00.\001\00") + (data (i32.const 320) "\03\00\00\00.\002\005\00") + (data (i32.const 332) "\08\00\00\00.\001\00f\00o\00o\00b\00a\00r\00") + (data (i32.const 352) "\01\00\00\00a\00") + (data (i32.const 360) "\01\00\00\00b\00") + (data (i32.const 368) "\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 420) "\02\00\00\00a\00b\00") + (data (i32.const 428) "\02\00\00\00b\00a\00") + (data (i32.const 436) "\02\00\00\00a\00a\00") + (data (i32.const 444) "\03\00\00\00a\00b\00c\00") + (data (i32.const 456) "\03\00\00\001\002\003\00") + (data (i32.const 468) "\03\00\00\00a\00a\00a\00") + (data (i32.const 480) "\08\00\00\00a\00b\00a\00b\00a\00b\00a\00b\00") + (data (i32.const 500) "\05\00\00\00a\00a\00a\00a\00a\00") + (data (i32.const 516) "\06\00\00\00a\00a\00a\00a\00a\00a\00") + (data (i32.const 532) "\07\00\00\00a\00a\00a\00a\00a\00a\00a\00") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $start) @@ -657,22 +659,22 @@ (set_local $9 (block $~lib/internal/string/clamp|inlined.3 (result i32) (set_local $5 - (i32.sub - (get_local $2) - (get_local $4) - ) + (i32.const 0) ) (set_local $6 - (i32.const 0) + (i32.sub + (get_local $3) + (get_local $4) + ) ) (select (tee_local $7 (select (tee_local $7 - (get_local $5) + (get_local $2) ) (tee_local $8 - (get_local $3) + (get_local $6) ) (i32.lt_s (get_local $7) @@ -681,7 +683,7 @@ ) ) (tee_local $8 - (get_local $6) + (get_local $5) ) (i32.gt_s (get_local $7) @@ -692,17 +694,14 @@ ) (block $break|0 (set_local $6 - (i32.sub - (get_local $3) - (i32.const 1) - ) + (get_local $9) ) (loop $repeat|0 (br_if $break|0 (i32.eqz (i32.ge_s (get_local $6) - (get_local $9) + (i32.const 0) ) ) ) @@ -744,10 +743,33 @@ ) (i32.const -1) ) - (func $std/string/getString (; 9 ;) (type $i) (result i32) + (func $~lib/string/String#lastIndexOf|trampoline (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (block $1of1 + (block $0of1 + (block $oob + (br_table $0of1 $1of1 $oob + (i32.sub + (get_global $~argc) + (i32.const 1) + ) + ) + ) + (unreachable) + ) + (set_local $2 + (i32.const 2147483647) + ) + ) + (call $~lib/string/String#lastIndexOf + (get_local $0) + (get_local $1) + (get_local $2) + ) + ) + (func $std/string/getString (; 10 ;) (type $i) (result i32) (get_global $std/string/str) ) - (func $~lib/internal/string/parse (; 10 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/internal/string/parse (; 11 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1137,13 +1159,13 @@ (get_local $7) ) ) - (func $~lib/string/parseInt (; 11 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt (; 12 ;) (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 (; 12 ;) (type $iF) (param $0 i32) (result f64) + (func $~lib/string/parseFloat (; 13 ;) (type $iF) (param $0 i32) (result f64) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1420,7 +1442,7 @@ (get_local $5) ) ) - (func $~lib/allocator/arena/allocate_memory (; 13 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/allocate_memory (; 14 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1528,7 +1550,7 @@ ) (i32.const 0) ) - (func $~lib/internal/string/allocate (; 14 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocate (; 15 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (if @@ -1550,7 +1572,7 @@ (block (call $~lib/env/abort (i32.const 0) - (i32.const 352) + (i32.const 368) (i32.const 25) (i32.const 2) ) @@ -1574,7 +1596,7 @@ ) (get_local $2) ) - (func $~lib/memory/copy_memory (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/copy_memory (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3376,7 +3398,7 @@ ) ) ) - (func $~lib/memory/move_memory (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/move_memory (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -3694,7 +3716,7 @@ ) ) ) - (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) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3791,7 +3813,7 @@ ) (get_local $5) ) - (func $~lib/string/String.__concat (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -3805,7 +3827,7 @@ (get_local $1) ) ) - (func $~lib/string/String.__eq (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (if @@ -3868,7 +3890,7 @@ ) ) ) - (func $~lib/string/String.__ne (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__ne (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (i32.eqz (call $~lib/string/String.__eq (get_local $0) @@ -3876,7 +3898,7 @@ ) ) ) - (func $~lib/string/String.__gt (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gt (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3967,7 +3989,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__gte (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__gte (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4060,7 +4082,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lt (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4151,7 +4173,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__lte (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__lte (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4244,7 +4266,7 @@ (i32.const 0) ) ) - (func $~lib/string/String#repeat (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#repeat (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4388,7 +4410,7 @@ ) (get_local $4) ) - (func $start (; 26 ;) (type $v) + (func $start (; 27 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -4690,10 +4712,15 @@ (if (i32.eqz (i32.eq - (call $~lib/string/String#lastIndexOf - (i32.const 156) - (i32.const 156) - (i32.const 0) + (block (result i32) + (set_global $~argc + (i32.const 1) + ) + (call $~lib/string/String#lastIndexOf|trampoline + (i32.const 156) + (i32.const 156) + (i32.const 0) + ) ) (i32.const 0) ) @@ -4711,10 +4738,15 @@ (if (i32.eqz (i32.eq - (call $~lib/string/String#lastIndexOf - (i32.const 156) - (i32.const 108) - (i32.const 0) + (block (result i32) + (set_global $~argc + (i32.const 1) + ) + (call $~lib/string/String#lastIndexOf|trampoline + (i32.const 156) + (i32.const 108) + (i32.const 0) + ) ) (i32.const -1) ) @@ -4732,10 +4764,15 @@ (if (i32.eqz (i32.eq - (call $~lib/string/String#lastIndexOf - (get_global $std/string/str) - (i32.const 156) - (i32.const 0) + (block (result i32) + (set_global $~argc + (i32.const 1) + ) + (call $~lib/string/String#lastIndexOf|trampoline + (get_global $std/string/str) + (i32.const 156) + (i32.const 0) + ) ) (i32.load (get_global $std/string/str) @@ -4755,10 +4792,15 @@ (if (i32.eqz (i32.eq - (call $~lib/string/String#lastIndexOf - (get_global $std/string/str) - (i32.const 160) - (i32.const 0) + (block (result i32) + (set_global $~argc + (i32.const 1) + ) + (call $~lib/string/String#lastIndexOf|trampoline + (get_global $std/string/str) + (i32.const 160) + (i32.const 0) + ) ) (i32.const 2) ) @@ -4776,10 +4818,15 @@ (if (i32.eqz (i32.eq - (call $~lib/string/String#lastIndexOf - (get_global $std/string/str) - (i32.const 168) - (i32.const 0) + (block (result i32) + (set_global $~argc + (i32.const 1) + ) + (call $~lib/string/String#lastIndexOf|trampoline + (get_global $std/string/str) + (i32.const 168) + (i32.const 0) + ) ) (i32.const -1) ) @@ -4797,12 +4844,17 @@ (if (i32.eqz (i32.eq - (call $~lib/string/String#lastIndexOf - (get_global $std/string/str) - (i32.const 160) - (i32.const 2) + (block (result i32) + (set_global $~argc + (i32.const 1) + ) + (call $~lib/string/String#lastIndexOf|trampoline + (get_global $std/string/str) + (i32.const 188) + (i32.const 0) + ) ) - (i32.const 2) + (i32.const 15) ) ) (block @@ -4821,7 +4873,7 @@ (call $~lib/string/String#lastIndexOf (get_global $std/string/str) (i32.const 160) - (i32.const 3) + (i32.const 2) ) (i32.const 2) ) @@ -4841,8 +4893,8 @@ (i32.eq (call $~lib/string/String#lastIndexOf (get_global $std/string/str) - (i32.const 176) - (i32.const -1) + (i32.const 160) + (i32.const 3) ) (i32.const 2) ) @@ -4859,19 +4911,20 @@ ) (if (i32.eqz - (f64.eq - (call $~lib/string/parseInt - (i32.const 188) - (i32.const 0) + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 176) + (i32.const -1) ) - (f64.const 0) + (i32.const -1) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 39) + (i32.const 34) (i32.const 0) ) (unreachable) @@ -4879,19 +4932,41 @@ ) (if (i32.eqz - (f64.eq - (call $~lib/string/parseInt + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) (i32.const 196) (i32.const 0) ) - (f64.const 1) + (i32.const -1) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 40) + (i32.const 35) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eq + (call $~lib/string/String#lastIndexOf + (get_global $std/string/str) + (i32.const 108) + (i32.const 0) + ) + (i32.const 0) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 36) (i32.const 0) ) (unreachable) @@ -4904,27 +4979,7 @@ (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) + (f64.const 0) ) ) (block @@ -4941,10 +4996,10 @@ (i32.eqz (f64.eq (call $~lib/string/parseInt - (i32.const 236) + (i32.const 212) (i32.const 0) ) - (f64.const 3855) + (f64.const 1) ) ) (block @@ -4957,6 +5012,46 @@ (unreachable) ) ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseInt + (i32.const 220) + (i32.const 0) + ) + (f64.const 5) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 44) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseInt + (i32.const 236) + (i32.const 0) + ) + (f64.const 455) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 45) + (i32.const 0) + ) + (unreachable) + ) + ) (if (i32.eqz (f64.eq @@ -4971,7 +5066,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 44) + (i32.const 46) (i32.const 0) ) (unreachable) @@ -4984,14 +5079,14 @@ (i32.const 268) (i32.const 0) ) - (f64.const 11) + (f64.const 3855) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 45) + (i32.const 47) (i32.const 0) ) (unreachable) @@ -5001,29 +5096,10 @@ (i32.eqz (f64.eq (call $~lib/string/parseInt - (i32.const 280) + (i32.const 284) (i32.const 0) ) - (f64.const 1) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 46) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 188) - ) - (f64.const 0) + (f64.const 11) ) ) (block @@ -5039,8 +5115,9 @@ (if (i32.eqz (f64.eq - (call $~lib/string/parseFloat - (i32.const 196) + (call $~lib/string/parseInt + (i32.const 296) + (i32.const 0) ) (f64.const 1) ) @@ -5059,28 +5136,9 @@ (i32.eqz (f64.eq (call $~lib/string/parseFloat - (i32.const 292) + (i32.const 204) ) - (f64.const 0.1) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 50) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (f64.eq - (call $~lib/string/parseFloat - (i32.const 304) - ) - (f64.const 0.25) + (f64.const 0) ) ) (block @@ -5097,9 +5155,9 @@ (i32.eqz (f64.eq (call $~lib/string/parseFloat - (i32.const 316) + (i32.const 212) ) - (f64.const 0.1) + (f64.const 1) ) ) (block @@ -5112,17 +5170,51 @@ (unreachable) ) ) - (set_global $std/string/c - (call $~lib/string/String.__concat - (i32.const 336) - (i32.const 344) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseFloat + (i32.const 308) + ) + (f64.const 0.1) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 53) + (i32.const 0) + ) + (unreachable) ) ) (if (i32.eqz - (call $~lib/string/String.__eq - (get_global $std/string/c) - (i32.const 404) + (f64.eq + (call $~lib/string/parseFloat + (i32.const 320) + ) + (f64.const 0.25) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 54) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (f64.eq + (call $~lib/string/parseFloat + (i32.const 332) + ) + (f64.const 0.1) ) ) (block @@ -5135,18 +5227,41 @@ (unreachable) ) ) + (set_global $std/string/c + (call $~lib/string/String.__concat + (i32.const 352) + (i32.const 360) + ) + ) (if (i32.eqz - (call $~lib/string/String.__ne + (call $~lib/string/String.__eq (get_global $std/string/c) - (i32.const 336) + (i32.const 420) ) ) (block (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 56) + (i32.const 58) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__ne + (get_global $std/string/c) + (i32.const 352) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 59) (i32.const 0) ) (unreachable) @@ -5163,7 +5278,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 57) + (i32.const 60) (i32.const 0) ) (unreachable) @@ -5176,40 +5291,6 @@ (get_global $std/string/nullStr) ) ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 58) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 344) - (i32.const 336) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 60) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 412) - (i32.const 336) - ) - ) (block (call $~lib/env/abort (i32.const 0) @@ -5220,28 +5301,11 @@ (unreachable) ) ) - (if - (i32.eqz - (call $~lib/string/String.__gte - (i32.const 412) - (i32.const 420) - ) - ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 62) - (i32.const 0) - ) - (unreachable) - ) - ) (if (i32.eqz (call $~lib/string/String.__gt - (i32.const 412) - (i32.const 404) + (i32.const 360) + (i32.const 352) ) ) (block @@ -5256,11 +5320,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 412) - (i32.const 404) - ) + (call $~lib/string/String.__gt + (i32.const 428) + (i32.const 352) ) ) (block @@ -5275,11 +5337,26 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 344) - (get_global $std/string/nullStr) - ) + (call $~lib/string/String.__gte + (i32.const 428) + (i32.const 436) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 65) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 428) + (i32.const 420) ) ) (block @@ -5296,8 +5373,8 @@ (i32.eqz (i32.eqz (call $~lib/string/String.__lt - (get_global $std/string/nullStr) - (i32.const 344) + (i32.const 428) + (i32.const 420) ) ) ) @@ -5313,9 +5390,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__gt - (i32.const 428) - (i32.const 156) + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 360) + (get_global $std/string/nullStr) + ) ) ) (block @@ -5330,9 +5409,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__lt - (i32.const 156) - (i32.const 428) + (i32.eqz + (call $~lib/string/String.__lt + (get_global $std/string/nullStr) + (i32.const 360) + ) ) ) (block @@ -5347,28 +5428,11 @@ ) (if (i32.eqz - (call $~lib/string/String.__gte - (i32.const 428) + (call $~lib/string/String.__gt + (i32.const 444) (i32.const 156) ) ) - (block - (call $~lib/env/abort - (i32.const 0) - (i32.const 44) - (i32.const 71) - (i32.const 0) - ) - (unreachable) - ) - ) - (if - (i32.eqz - (call $~lib/string/String.__lte - (i32.const 156) - (i32.const 428) - ) - ) (block (call $~lib/env/abort (i32.const 0) @@ -5381,11 +5445,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 428) - (i32.const 156) - ) + (call $~lib/string/String.__lt + (i32.const 156) + (i32.const 444) ) ) (block @@ -5400,11 +5462,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__gt - (i32.const 156) - (i32.const 428) - ) + (call $~lib/string/String.__gte + (i32.const 444) + (i32.const 156) ) ) (block @@ -5419,11 +5479,9 @@ ) (if (i32.eqz - (i32.eqz - (call $~lib/string/String.__lt - (i32.const 156) - (i32.const 156) - ) + (call $~lib/string/String.__lte + (i32.const 156) + (i32.const 444) ) ) (block @@ -5439,8 +5497,8 @@ (if (i32.eqz (i32.eqz - (call $~lib/string/String.__gt - (i32.const 156) + (call $~lib/string/String.__lt + (i32.const 444) (i32.const 156) ) ) @@ -5455,6 +5513,63 @@ (unreachable) ) ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 156) + (i32.const 444) + ) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 77) + (i32.const 0) + ) + (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 78) + (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 79) + (i32.const 0) + ) + (unreachable) + ) + ) (if (i32.eqz (call $~lib/string/String.__gte @@ -5466,7 +5581,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 77) + (i32.const 80) (i32.const 0) ) (unreachable) @@ -5483,7 +5598,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 78) + (i32.const 81) (i32.const 0) ) (unreachable) @@ -5493,7 +5608,7 @@ (i32.eqz (i32.eq (i32.load - (i32.const 440) + (i32.const 456) ) (i32.const 3) ) @@ -5502,7 +5617,7 @@ (call $~lib/env/abort (i32.const 0) (i32.const 44) - (i32.const 80) + (i32.const 83) (i32.const 0) ) (unreachable) @@ -5518,66 +5633,6 @@ (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) @@ -5592,10 +5647,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 3) + (i32.const 352) + (i32.const 0) ) - (i32.const 452) + (i32.const 156) ) ) (block @@ -5612,10 +5667,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 404) - (i32.const 4) + (i32.const 352) + (i32.const 1) ) - (i32.const 464) + (i32.const 352) ) ) (block @@ -5632,10 +5687,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 5) + (i32.const 352) + (i32.const 2) ) - (i32.const 484) + (i32.const 436) ) ) (block @@ -5652,10 +5707,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 6) + (i32.const 352) + (i32.const 3) ) - (i32.const 500) + (i32.const 468) ) ) (block @@ -5672,10 +5727,10 @@ (i32.eqz (call $~lib/string/String.__eq (call $~lib/string/String#repeat - (i32.const 336) - (i32.const 7) + (i32.const 420) + (i32.const 4) ) - (i32.const 516) + (i32.const 480) ) ) (block @@ -5688,5 +5743,65 @@ (unreachable) ) ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 352) + (i32.const 5) + ) + (i32.const 500) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 91) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 352) + (i32.const 6) + ) + (i32.const 516) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 92) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (call $~lib/string/String#repeat + (i32.const 352) + (i32.const 7) + ) + (i32.const 532) + ) + ) + (block + (call $~lib/env/abort + (i32.const 0) + (i32.const 44) + (i32.const 93) + (i32.const 0) + ) + (unreachable) + ) + ) ) )