diff --git a/std/assembly/string.ts b/std/assembly/string.ts index 0c52d2c1..3e969986 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -127,6 +127,91 @@ export class String { ); } + @operator("!=") + private static __ne(left: String, right: String): bool { + return !this.__eq(left, right); + } + + @operator(">") + private static __gt(left: String, right: String): bool { + if (!changetype(left) || !changetype(right)) { + return false; + } + + var leftLength = left.length; + var rightLength = right.length; + + if (!leftLength) return false; + if (!rightLength) return true; + + var length = min(leftLength, rightLength); + return compare_memory( + changetype(left) + HEADER_SIZE, + changetype(right) + HEADER_SIZE, + length << 1 + ) > 0; + } + + @operator(">=") + private static __gte(left: String, right: String): bool { + if (!changetype(left) || !changetype(right)) { + return false; + } + + var leftLength = left.length; + var rightLength = right.length; + + if (!leftLength) return !rightLength; + if (!rightLength) return true; + + var length = min(leftLength, rightLength); + return compare_memory( + changetype(left) + HEADER_SIZE, + changetype(right) + HEADER_SIZE, + length << 1 + ) >= 0; + } + + @operator("<") + private static __lt(left: String, right: String): bool { + if (!changetype(left) || !changetype(right)) { + return false; + } + + var leftLength = left.length; + var rightLength = right.length; + + if (!rightLength) return false; + if (!leftLength) return true; + + var length = min(leftLength, rightLength); + return compare_memory( + changetype(left) + HEADER_SIZE, + changetype(right) + HEADER_SIZE, + length << 1 + ) < 0; + } + + @operator("<=") + private static __lte(left: String, right: String): bool { + if (!changetype(left) || !changetype(right)) { + return false; + } + + var leftLength = left.length; + var rightLength = right.length; + + if (!rightLength) return !leftLength; + if (!leftLength) return true; + + var length = min(leftLength, rightLength); + return compare_memory( + changetype(left) + HEADER_SIZE, + changetype(right) + HEADER_SIZE, + length << 1 + ) <= 0; + } + includes(searchString: String, position: i32 = 0): bool { return this.indexOf(searchString, position) != -1; } diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index 1a34010c..7cb96c7d 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -12,9 +12,10 @@ (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $std/string/str (mut i32) (i32.const 4)) + (global $std/string/nullStr (mut i32) (i32.const 0)) (global $argumentCount (mut i32) (i32.const 0)) (global $std/string/c (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 344)) + (global $HEAP_BASE i32 (i32.const 372)) (memory $0 1) (data (i32.const 4) "\10\00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g") (data (i32.const 40) "\0d\00\00\00s\00t\00d\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") @@ -39,46 +40,13 @@ (data (i32.const 316) "\01\00\00\00a") (data (i32.const 324) "\01\00\00\00b") (data (i32.const 336) "\02\00\00\00a\00b") + (data (i32.const 344) "\02\00\00\00b\00a") + (data (i32.const 352) "\02\00\00\00a\00a") + (data (i32.const 360) "\03\00\00\00a\00b\00c") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $start) - (func $~lib/string/String#charCodeAt (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (if - (i32.eqz - (get_local $0) - ) - (block - (call $abort - (i32.const 0) - (i32.const 72) - (i32.const 40) - (i32.const 4) - ) - (unreachable) - ) - ) - (if - (i32.ge_u - (get_local $1) - (i32.load - (get_local $0) - ) - ) - (return - (i32.const -1) - ) - ) - (i32.load16_u offset=4 - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 1) - ) - ) - ) - ) - (func $~lib/memory/compare_memory (; 2 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -138,7 +106,7 @@ (i32.const 0) ) ) - (func $~lib/string/String.__eq (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 2 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (get_local $0) @@ -188,19 +156,69 @@ ) ) ) - (func $~lib/string/String#startsWith (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) + (func $~lib/string/String.__ne (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (i32.eqz + (call $~lib/string/String.__eq + (get_local $0) + (get_local $1) + ) + ) + ) + (func $~lib/string/String#charCodeAt (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz - (get_local $0) + (call $~lib/string/String.__ne + (get_local $0) + (i32.const 0) + ) ) (block (call $abort (i32.const 0) (i32.const 72) - (i32.const 158) + (i32.const 40) + (i32.const 4) + ) + (unreachable) + ) + ) + (if + (i32.ge_u + (get_local $1) + (i32.load + (get_local $0) + ) + ) + (return + (i32.const -1) + ) + ) + (i32.load16_u offset=4 + (i32.add + (get_local $0) + (i32.shl + (get_local $1) + (i32.const 1) + ) + ) + ) + ) + (func $~lib/string/String#startsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (if + (i32.eqz + (call $~lib/string/String.__ne + (get_local $0) + (i32.const 0) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 72) + (i32.const 243) (i32.const 4) ) (unreachable) @@ -278,7 +296,7 @@ ) ) ) - (func $~lib/string/String#startsWith|trampoline (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#startsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -301,11 +319,14 @@ (get_local $2) ) ) - (func $~lib/string/String#endsWith (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#endsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (if (i32.eqz - (get_local $0) + (call $~lib/string/String.__ne + (get_local $0) + (i32.const 0) + ) ) (block (call $abort @@ -387,7 +408,7 @@ ) ) ) - (func $~lib/string/String#endsWith|trampoline (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#endsWith|trampoline (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -410,19 +431,22 @@ (get_local $2) ) ) - (func $~lib/string/String#indexOf (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#indexOf (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) (if (i32.eqz - (get_local $0) + (call $~lib/string/String.__ne + (get_local $0) + (i32.const 0) + ) ) (block (call $abort (i32.const 0) (i32.const 72) - (i32.const 135) + (i32.const 220) (i32.const 4) ) (unreachable) @@ -516,7 +540,7 @@ ) (i32.const -1) ) - (func $~lib/string/String#includes (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#includes (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (i32.ne (call $~lib/string/String#indexOf (get_local $0) @@ -526,7 +550,7 @@ (i32.const -1) ) ) - (func $~lib/string/String#includes|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#includes|trampoline (; 11 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -549,7 +573,7 @@ (get_local $2) ) ) - (func $~lib/string/String#indexOf|trampoline (; 11 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#indexOf|trampoline (; 12 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -572,10 +596,10 @@ (get_local $2) ) ) - (func $std/string/getString (; 12 ;) (type $i) (result i32) + (func $std/string/getString (; 13 ;) (type $i) (result i32) (get_global $std/string/str) ) - (func $~lib/string/parse (; 13 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parse (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local $3 i32) (local $4 i32) @@ -940,13 +964,13 @@ (get_local $5) ) ) - (func $~lib/string/parseInt (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt (; 15 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (call $~lib/string/parse (get_local $0) (get_local $1) ) ) - (func $~lib/string/parseInt|trampoline (; 15 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt|trampoline (; 16 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (block $1of1 (block $0of1 (block $oob @@ -968,7 +992,7 @@ (get_local $1) ) ) - (func $~lib/string/parseFloat (; 16 ;) (type $iF) (param $0 i32) (result f64) + (func $~lib/string/parseFloat (; 17 ;) (type $iF) (param $0 i32) (result f64) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1134,7 +1158,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 484) + (i32.const 569) (i32.const 10) ) (unreachable) @@ -1220,7 +1244,7 @@ (get_local $4) ) ) - (func $~lib/allocator/arena/allocate_memory (; 17 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/allocate_memory (; 18 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1309,7 +1333,7 @@ ) (i32.const 0) ) - (func $~lib/string/allocate (; 18 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/string/allocate (; 19 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (i32.le_s @@ -1342,7 +1366,7 @@ ) (get_local $1) ) - (func $~lib/memory/copy_memory (; 19 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/copy_memory (; 20 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (loop $continue|0 @@ -2918,7 +2942,7 @@ ) ) ) - (func $~lib/memory/move_memory (; 20 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/move_memory (; 21 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -3208,13 +3232,16 @@ ) ) ) - (func $~lib/string/String#concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) (if (i32.eqz - (get_local $0) + (call $~lib/string/String.__ne + (get_local $0) + (i32.const 0) + ) ) (block (call $abort @@ -3296,7 +3323,7 @@ ) (get_local $2) ) - (func $~lib/string/String.__concat (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -3310,7 +3337,299 @@ (get_local $1) ) ) - (func $start (; 23 ;) (type $v) + (func $~lib/string/String.__gt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $3 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (tee_local $2 + (i32.load + (get_local $0) + ) + ) + ) + (return + (i32.const 0) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const 1) + ) + ) + (i32.gt_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (select + (get_local $2) + (get_local $3) + (i32.lt_s + (get_local $2) + (get_local $3) + ) + ) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + (func $~lib/string/String.__gte (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $3 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (tee_local $2 + (i32.load + (get_local $0) + ) + ) + ) + (return + (i32.eqz + (get_local $3) + ) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const 1) + ) + ) + (i32.ge_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (select + (get_local $2) + (get_local $3) + (i32.lt_s + (get_local $2) + (get_local $3) + ) + ) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + (func $~lib/string/String.__lt (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $2 + (i32.load + (get_local $0) + ) + ) + (if + (i32.eqz + (tee_local $3 + (i32.load + (get_local $1) + ) + ) + ) + (return + (i32.const 0) + ) + ) + (if + (i32.eqz + (get_local $2) + ) + (return + (i32.const 1) + ) + ) + (i32.lt_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (select + (get_local $2) + (get_local $3) + (i32.lt_s + (get_local $2) + (get_local $3) + ) + ) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + (func $~lib/string/String.__lte (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $2 + (i32.load + (get_local $0) + ) + ) + (if + (i32.eqz + (tee_local $3 + (i32.load + (get_local $1) + ) + ) + ) + (return + (i32.eqz + (get_local $2) + ) + ) + ) + (if + (i32.eqz + (get_local $2) + ) + (return + (i32.const 1) + ) + ) + (i32.le_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (select + (get_local $2) + (get_local $3) + (i32.lt_s + (get_local $2) + (get_local $3) + ) + ) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + (func $start (; 28 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -3332,7 +3651,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 8) + (i32.const 9) (i32.const 0) ) (unreachable) @@ -3349,7 +3668,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 10) + (i32.const 11) (i32.const 0) ) (unreachable) @@ -3367,7 +3686,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 11) + (i32.const 12) (i32.const 0) ) (unreachable) @@ -3390,7 +3709,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 12) + (i32.const 13) (i32.const 0) ) (unreachable) @@ -3413,7 +3732,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 13) + (i32.const 14) (i32.const 0) ) (unreachable) @@ -3436,7 +3755,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 14) + (i32.const 15) (i32.const 0) ) (unreachable) @@ -3460,7 +3779,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 15) + (i32.const 16) (i32.const 0) ) (unreachable) @@ -3484,7 +3803,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 16) + (i32.const 17) (i32.const 0) ) (unreachable) @@ -3507,7 +3826,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 22) + (i32.const 23) (i32.const 0) ) (unreachable) @@ -3530,7 +3849,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 23) + (i32.const 24) (i32.const 0) ) (unreachable) @@ -3553,7 +3872,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 24) + (i32.const 25) (i32.const 0) ) (unreachable) @@ -3576,7 +3895,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 25) + (i32.const 26) (i32.const 0) ) (unreachable) @@ -3599,7 +3918,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 26) + (i32.const 27) (i32.const 0) ) (unreachable) @@ -3622,7 +3941,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 27) + (i32.const 28) (i32.const 0) ) (unreachable) @@ -3645,7 +3964,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 28) + (i32.const 29) (i32.const 0) ) (unreachable) @@ -3668,7 +3987,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 29) + (i32.const 30) (i32.const 0) ) (unreachable) @@ -3685,7 +4004,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 31) + (i32.const 32) (i32.const 0) ) (unreachable) @@ -3702,7 +4021,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 32) + (i32.const 33) (i32.const 0) ) (unreachable) @@ -3719,7 +4038,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 33) + (i32.const 34) (i32.const 0) ) (unreachable) @@ -3736,7 +4055,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 34) + (i32.const 35) (i32.const 0) ) (unreachable) @@ -3753,7 +4072,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 35) + (i32.const 36) (i32.const 0) ) (unreachable) @@ -3776,7 +4095,333 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 38) + (i32.const 39) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__ne + (get_global $std/string/c) + (i32.const 316) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 40) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (i32.const 332) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 41) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__ne + (i32.const 332) + (get_global $std/string/nullStr) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 42) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 324) + (i32.const 316) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 44) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 344) + (i32.const 316) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 45) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 344) + (i32.const 352) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 46) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 344) + (i32.const 336) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 47) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (i32.const 344) + (i32.const 336) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 48) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (i32.const 324) + (get_global $std/string/nullStr) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 50) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (get_global $std/string/nullStr) + (i32.const 324) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 51) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 360) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 53) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 332) + (i32.const 360) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 54) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 360) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 55) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 332) + (i32.const 360) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 56) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (i32.const 360) + (i32.const 332) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 57) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__gt + (i32.const 332) + (i32.const 360) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 58) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__lt + (i32.const 332) + (i32.const 332) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 59) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (call $~lib/string/String.__gt + (i32.const 332) + (i32.const 332) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 60) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 332) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 61) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 332) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 62) (i32.const 0) ) (unreachable) diff --git a/tests/compiler/std/string.ts b/tests/compiler/std/string.ts index 40c87285..84cb3e7d 100644 --- a/tests/compiler/std/string.ts +++ b/tests/compiler/std/string.ts @@ -3,6 +3,7 @@ import "allocator/arena"; // preliminary var str: string = "hi, I'm a string"; +var nullStr: String; // exactly once in static memory assert(changetype(str) == changetype("hi, I'm a string")); @@ -36,3 +37,26 @@ assert(parseFloat(".1foobar") == 0.1); var c = "a" + "b"; assert(c == "ab"); +assert(c != "a"); +assert("" == ""); +assert("" != nullStr); + +assert("b" > "a"); +assert("ba" > "a"); +assert("ba" >= "aa"); +assert("ba" > "ab"); +assert(!("ba" < "ab")); + +assert(!("b" < nullStr)); +assert(!(nullStr < "b")); + +assert("abc" > ""); +assert("" < "abc"); +assert("abc" >= ""); +assert("" <= "abc"); +assert(!("abc" < "")); +assert(!("" > "abc")); +assert(!("" < "")); +assert(!("" > "")); +assert("" >= ""); +assert("" <= ""); diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index b5618e36..f1537176 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -16,6 +16,7 @@ (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $std/string/str (mut i32) (i32.const 4)) + (global $std/string/nullStr (mut i32) (i32.const 0)) (global $~lib/string/HEADER_SIZE i32 (i32.const 4)) (global $argumentCount (mut i32) (i32.const 0)) (global $~lib/string/CharCode.PLUS i32 (i32.const 43)) @@ -45,7 +46,7 @@ (global $~lib/string/CharCode.z i32 (i32.const 122)) (global $~lib/string/EMPTY i32 (i32.const 332)) (global $std/string/c (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 344)) + (global $HEAP_BASE i32 (i32.const 372)) (memory $0 1) (data (i32.const 4) "\10\00\00\00h\00i\00,\00 \00I\00\'\00m\00 \00a\00 \00s\00t\00r\00i\00n\00g\00") (data (i32.const 40) "\0d\00\00\00s\00t\00d\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") @@ -71,51 +72,13 @@ (data (i32.const 324) "\01\00\00\00b\00") (data (i32.const 332) "\00\00\00\00") (data (i32.const 336) "\02\00\00\00a\00b\00") + (data (i32.const 344) "\02\00\00\00b\00a\00") + (data (i32.const 352) "\02\00\00\00a\00a\00") + (data (i32.const 360) "\03\00\00\00a\00b\00c\00") (export "getString" (func $std/string/getString)) (export "memory" (memory $0)) (start $start) - (func $~lib/string/String#charCodeAt (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (if - (i32.eqz - (i32.ne - (get_local $0) - (i32.const 0) - ) - ) - (block - (call $abort - (i32.const 0) - (i32.const 72) - (i32.const 40) - (i32.const 4) - ) - (unreachable) - ) - ) - (if - (i32.ge_u - (get_local $1) - (i32.load - (get_local $0) - ) - ) - (return - (i32.const -1) - ) - ) - (return - (i32.load16_u offset=4 - (i32.add - (get_local $0) - (i32.shl - (get_local $1) - (i32.const 1) - ) - ) - ) - ) - ) - (func $~lib/memory/compare_memory (; 2 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (if (i32.eq (get_local $0) @@ -181,7 +144,7 @@ ) ) ) - (func $~lib/string/String.__eq (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__eq (; 2 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (if (i32.eqz @@ -236,16 +199,20 @@ ) ) ) - (func $~lib/string/String#startsWith (; 4 ;) (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) + (func $~lib/string/String.__ne (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (return + (i32.eqz + (call $~lib/string/String.__eq + (get_local $0) + (get_local $1) + ) + ) + ) + ) + (func $~lib/string/String#charCodeAt (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz - (i32.ne + (call $~lib/string/String.__ne (get_local $0) (i32.const 0) ) @@ -254,7 +221,54 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 158) + (i32.const 40) + (i32.const 4) + ) + (unreachable) + ) + ) + (if + (i32.ge_u + (get_local $1) + (i32.load + (get_local $0) + ) + ) + (return + (i32.const -1) + ) + ) + (return + (i32.load16_u offset=4 + (i32.add + (get_local $0) + (i32.shl + (get_local $1) + (i32.const 1) + ) + ) + ) + ) + ) + (func $~lib/string/String#startsWith (; 5 ;) (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) + (if + (i32.eqz + (call $~lib/string/String.__ne + (get_local $0) + (i32.const 0) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 72) + (i32.const 243) (i32.const 4) ) (unreachable) @@ -344,7 +358,7 @@ ) ) ) - (func $~lib/string/String#startsWith|trampoline (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#startsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -367,7 +381,7 @@ (get_local $2) ) ) - (func $~lib/string/String#endsWith (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#endsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -375,7 +389,7 @@ (local $7 i32) (if (i32.eqz - (i32.ne + (call $~lib/string/String.__ne (get_local $0) (i32.const 0) ) @@ -471,7 +485,7 @@ ) ) ) - (func $~lib/string/String#endsWith|trampoline (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#endsWith|trampoline (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -494,7 +508,7 @@ (get_local $2) ) ) - (func $~lib/string/String#indexOf (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#indexOf (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -503,7 +517,7 @@ (local $8 i32) (if (i32.eqz - (i32.ne + (call $~lib/string/String.__ne (get_local $0) (i32.const 0) ) @@ -512,7 +526,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 135) + (i32.const 220) (i32.const 4) ) (unreachable) @@ -623,7 +637,7 @@ (i32.const -1) ) ) - (func $~lib/string/String#includes (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#includes (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (return (i32.ne (call $~lib/string/String#indexOf @@ -635,7 +649,7 @@ ) ) ) - (func $~lib/string/String#includes|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#includes|trampoline (; 11 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -658,7 +672,7 @@ (get_local $2) ) ) - (func $~lib/string/String#indexOf|trampoline (; 11 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/string/String#indexOf|trampoline (; 12 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (block $1of1 (block $0of1 (block $oob @@ -681,12 +695,12 @@ (get_local $2) ) ) - (func $std/string/getString (; 12 ;) (type $i) (result i32) + (func $std/string/getString (; 13 ;) (type $i) (result i32) (return (get_global $std/string/str) ) ) - (func $~lib/string/parse (; 13 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parse (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1096,7 +1110,7 @@ ) ) ) - (func $~lib/string/parseInt (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt (; 15 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (return (call $~lib/string/parse (get_local $0) @@ -1104,7 +1118,7 @@ ) ) ) - (func $~lib/string/parseInt|trampoline (; 15 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $~lib/string/parseInt|trampoline (; 16 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (block $1of1 (block $0of1 (block $oob @@ -1126,7 +1140,7 @@ (get_local $1) ) ) - (func $~lib/string/parseFloat (; 16 ;) (type $iF) (param $0 i32) (result f64) + (func $~lib/string/parseFloat (; 17 ;) (type $iF) (param $0 i32) (result f64) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1314,7 +1328,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 484) + (i32.const 569) (i32.const 10) ) (unreachable) @@ -1409,7 +1423,7 @@ ) ) ) - (func $~lib/allocator/arena/allocate_memory (; 17 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/allocate_memory (; 18 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1520,7 +1534,7 @@ (i32.const 0) ) ) - (func $~lib/string/allocate (; 18 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/string/allocate (; 19 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (if (i32.eqz @@ -1558,7 +1572,7 @@ (get_local $1) ) ) - (func $~lib/memory/copy_memory (; 19 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/copy_memory (; 20 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3361,7 +3375,7 @@ ) ) ) - (func $~lib/memory/move_memory (; 20 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/move_memory (; 21 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (if (i32.eq @@ -3684,14 +3698,14 @@ ) ) ) - (func $~lib/string/String#concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (if (i32.eqz - (i32.ne + (call $~lib/string/String.__ne (get_local $0) (i32.const 0) ) @@ -3783,7 +3797,7 @@ (get_local $5) ) ) - (func $~lib/string/String.__concat (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (if (i32.eqz (get_local $0) @@ -3799,7 +3813,351 @@ ) ) ) - (func $start (; 23 ;) (type $v) + (func $~lib/string/String.__gt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (set_local $4 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const 0) + ) + ) + (if + (i32.eqz + (get_local $4) + ) + (return + (i32.const 1) + ) + ) + (set_local $6 + (select + (tee_local $2 + (get_local $3) + ) + (tee_local $5 + (get_local $4) + ) + (i32.lt_s + (get_local $2) + (get_local $5) + ) + ) + ) + (return + (i32.gt_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (get_local $6) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + ) + (func $~lib/string/String.__gte (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (set_local $4 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.eqz + (get_local $4) + ) + ) + ) + (if + (i32.eqz + (get_local $4) + ) + (return + (i32.const 1) + ) + ) + (set_local $6 + (select + (tee_local $2 + (get_local $3) + ) + (tee_local $5 + (get_local $4) + ) + (i32.lt_s + (get_local $2) + (get_local $5) + ) + ) + ) + (return + (i32.ge_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (get_local $6) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + ) + (func $~lib/string/String.__lt (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (set_local $4 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (get_local $4) + ) + (return + (i32.const 0) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const 1) + ) + ) + (set_local $6 + (select + (tee_local $2 + (get_local $3) + ) + (tee_local $5 + (get_local $4) + ) + (i32.lt_s + (get_local $2) + (get_local $5) + ) + ) + ) + (return + (i32.lt_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (get_local $6) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + ) + (func $~lib/string/String.__lte (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (if + (i32.and + (if (result i32) + (tee_local $2 + (i32.eqz + (get_local $0) + ) + ) + (get_local $2) + (i32.eqz + (get_local $1) + ) + ) + (i32.const 1) + ) + (return + (i32.const 0) + ) + ) + (set_local $3 + (i32.load + (get_local $0) + ) + ) + (set_local $4 + (i32.load + (get_local $1) + ) + ) + (if + (i32.eqz + (get_local $4) + ) + (return + (i32.eqz + (get_local $3) + ) + ) + ) + (if + (i32.eqz + (get_local $3) + ) + (return + (i32.const 1) + ) + ) + (set_local $6 + (select + (tee_local $2 + (get_local $3) + ) + (tee_local $5 + (get_local $4) + ) + (i32.lt_s + (get_local $2) + (get_local $5) + ) + ) + ) + (return + (i32.le_s + (call $~lib/memory/compare_memory + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.add + (get_local $1) + (i32.const 4) + ) + (i32.shl + (get_local $6) + (i32.const 1) + ) + ) + (i32.const 0) + ) + ) + ) + (func $start (; 28 ;) (type $v) (set_global $~lib/allocator/arena/startOffset (i32.and (i32.add @@ -3826,7 +4184,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 8) + (i32.const 9) (i32.const 0) ) (unreachable) @@ -3845,7 +4203,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 10) + (i32.const 11) (i32.const 0) ) (unreachable) @@ -3865,7 +4223,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 11) + (i32.const 12) (i32.const 0) ) (unreachable) @@ -3888,7 +4246,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 12) + (i32.const 13) (i32.const 0) ) (unreachable) @@ -3911,7 +4269,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 13) + (i32.const 14) (i32.const 0) ) (unreachable) @@ -3934,7 +4292,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 14) + (i32.const 15) (i32.const 0) ) (unreachable) @@ -3960,7 +4318,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 15) + (i32.const 16) (i32.const 0) ) (unreachable) @@ -3986,7 +4344,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 16) + (i32.const 17) (i32.const 0) ) (unreachable) @@ -4011,7 +4369,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 22) + (i32.const 23) (i32.const 0) ) (unreachable) @@ -4036,7 +4394,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 23) + (i32.const 24) (i32.const 0) ) (unreachable) @@ -4061,7 +4419,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 24) + (i32.const 25) (i32.const 0) ) (unreachable) @@ -4086,7 +4444,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 25) + (i32.const 26) (i32.const 0) ) (unreachable) @@ -4111,7 +4469,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 26) + (i32.const 27) (i32.const 0) ) (unreachable) @@ -4136,7 +4494,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 27) + (i32.const 28) (i32.const 0) ) (unreachable) @@ -4161,7 +4519,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 28) + (i32.const 29) (i32.const 0) ) (unreachable) @@ -4186,7 +4544,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 29) + (i32.const 30) (i32.const 0) ) (unreachable) @@ -4205,7 +4563,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 31) + (i32.const 32) (i32.const 0) ) (unreachable) @@ -4224,7 +4582,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 32) + (i32.const 33) (i32.const 0) ) (unreachable) @@ -4243,7 +4601,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 33) + (i32.const 34) (i32.const 0) ) (unreachable) @@ -4262,7 +4620,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 34) + (i32.const 35) (i32.const 0) ) (unreachable) @@ -4281,7 +4639,7 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 35) + (i32.const 36) (i32.const 0) ) (unreachable) @@ -4304,7 +4662,361 @@ (call $abort (i32.const 0) (i32.const 40) - (i32.const 38) + (i32.const 39) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__ne + (get_global $std/string/c) + (i32.const 316) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 40) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__eq + (i32.const 332) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 41) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__ne + (i32.const 332) + (get_global $std/string/nullStr) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 42) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 324) + (i32.const 316) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 44) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 344) + (i32.const 316) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 45) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 344) + (i32.const 352) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 46) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 344) + (i32.const 336) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 47) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 344) + (i32.const 336) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 48) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 324) + (get_global $std/string/nullStr) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 50) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (get_global $std/string/nullStr) + (i32.const 324) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 51) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 360) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 53) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 332) + (i32.const 360) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 54) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 360) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 55) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 332) + (i32.const 360) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 56) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 360) + (i32.const 332) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 57) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 332) + (i32.const 360) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 58) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__lt + (i32.const 332) + (i32.const 332) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 59) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (i32.eqz + (call $~lib/string/String.__gt + (i32.const 332) + (i32.const 332) + ) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 60) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__gte + (i32.const 332) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 61) + (i32.const 0) + ) + (unreachable) + ) + ) + (if + (i32.eqz + (call $~lib/string/String.__lte + (i32.const 332) + (i32.const 332) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 40) + (i32.const 62) (i32.const 0) ) (unreachable)