From 4f7bc3d3017e58af4f77b286e78b2b18722e6901 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 16 Nov 2018 16:21:34 +0200 Subject: [PATCH 01/87] init (wip) --- std/assembly/internal/string.ts | 1 + std/assembly/internal/uri.ts | 99 +++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 std/assembly/internal/uri.ts diff --git a/std/assembly/internal/string.ts b/std/assembly/internal/string.ts index 000431a347..eb454f0f65 100644 --- a/std/assembly/internal/string.ts +++ b/std/assembly/internal/string.ts @@ -110,6 +110,7 @@ export function repeatUnsafe(dest: String, destOffset: usize, src: String, count // Helpers export const enum CharCode { + PERCENT = 0x25, PLUS = 0x2B, MINUS = 0x2D, DOT = 0x2E, diff --git a/std/assembly/internal/uri.ts b/std/assembly/internal/uri.ts new file mode 100644 index 0000000000..12bf1fe76c --- /dev/null +++ b/std/assembly/internal/uri.ts @@ -0,0 +1,99 @@ +// References: +// https://github.com/vmg/houdini +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/escape_utils.c +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini.h +// +// https://github.com/JetBrains/jdk8u_nashorn/blob/master/src/jdk/nashorn/internal/runtime/URIUtils.java + +import { + HEADER_SIZE, + CharCode +} from "./string"; + +@inline +export function URI_SAFE(): u8[] { + const table: u8[] = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ]; + return table; +} + +@inline +export function URL_SAFE(): u8[] { + const table: u8[] = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + return table; +} + +export function escape(buffer: usize, source: usize, table: u8[], len: isize): bool { + const HEX_CHARS: u8[] = [ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 + ]; + + var hexStr0: u16 = CharCode.PERCENT; // % + var hexStr12: u32 = 0; + + var i: isize = 0, org: isize, offset: usize = 0; + while (i < len) { + org = i; + let ch = source[i]; + while (i < len && table[ch] != 0) ++i; + if (i > org) { + if (!org) { + if (i >= len) return false; + // reallocUnsafe(buffer, len * 12 / 10); + } + // gh_buf_put(buffer, source + org, i - org); + memory.copy( + buffer + HEADER_SIZE + (offset << 1), + source + HEADER_SIZE + (org << 1), + (i - org) << 1 + ); + offset += (i - org); + } + /* escaping */ + if (i >= len) break; + + hexStr12 = HEX_CHARS[(ch >>> 4) & 0x0F] | (HEX_CHARS[ch & 0x0F] << 16); + // gh_buf_put(buffer, hexStr0) + // gh_buf_put(buffer, hexStr12); + store(buffer + (offset << 1), hexStr0, HEADER_SIZE); + store(buffer + (offset << 1), hexStr12, HEADER_SIZE + 2); + offset += 3; + ++i; + } + return true; +} From b0fbf217171a377eb3c2af542f1a7dc87717e33b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 17 Nov 2018 06:44:32 +0200 Subject: [PATCH 02/87] wip --- std/assembly/internal/uri.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/std/assembly/internal/uri.ts b/std/assembly/internal/uri.ts index 12bf1fe76c..29342a5539 100644 --- a/std/assembly/internal/uri.ts +++ b/std/assembly/internal/uri.ts @@ -57,42 +57,42 @@ export function URL_SAFE(): u8[] { return table; } -export function escape(buffer: usize, source: usize, table: u8[], len: isize): bool { +export function escapeUnsafe(dest: usize, source: usize, table: u8[], len: isize): bool { const HEX_CHARS: u8[] = [ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]; - var hexStr0: u16 = CharCode.PERCENT; // % - var hexStr12: u32 = 0; - + var hex0: u16 = CharCode.PERCENT; // % var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; - let ch = source[i]; - while (i < len && table[ch] != 0) ++i; + let ch = load(source + (i << 1), HEADER_SIZE); + while (i < len && ch <= 127 && table[ch] != 0) { + ++i; + ch = load(source + (i << 1), HEADER_SIZE); + } if (i > org) { if (!org) { if (i >= len) return false; - // reallocUnsafe(buffer, len * 12 / 10); + // reallocUnsafe(dest, len * 12 / 10); } - // gh_buf_put(buffer, source + org, i - org); + let size = (i - org) << 1; memory.copy( - buffer + HEADER_SIZE + (offset << 1), + dest + HEADER_SIZE + offset, source + HEADER_SIZE + (org << 1), - (i - org) << 1 + size ); - offset += (i - org); + offset += size; } /* escaping */ if (i >= len) break; - hexStr12 = HEX_CHARS[(ch >>> 4) & 0x0F] | (HEX_CHARS[ch & 0x0F] << 16); - // gh_buf_put(buffer, hexStr0) - // gh_buf_put(buffer, hexStr12); - store(buffer + (offset << 1), hexStr0, HEADER_SIZE); - store(buffer + (offset << 1), hexStr12, HEADER_SIZE + 2); - offset += 3; + ch = load(source + (i << 1), HEADER_SIZE); + let hex1 = HEX_CHARS[(ch >>> 4) & 0x0F] | (HEX_CHARS[ch & 0x0F] << 16); + store(dest + offset, hex0, HEADER_SIZE + 0); + store(dest + offset, hex1, HEADER_SIZE + 2); + offset += 3 << 1; ++i; } return true; From 82da34841ba1c5e511608b4607c1b5220f6c56b4 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 21 Aug 2020 12:12:03 +0300 Subject: [PATCH 03/87] refactor --- std/assembly/internal/uri.ts | 99 ------------------------------------ std/assembly/util/string.ts | 1 + std/assembly/util/uri.ts | 88 ++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 99 deletions(-) delete mode 100644 std/assembly/internal/uri.ts create mode 100644 std/assembly/util/uri.ts diff --git a/std/assembly/internal/uri.ts b/std/assembly/internal/uri.ts deleted file mode 100644 index 29342a5539..0000000000 --- a/std/assembly/internal/uri.ts +++ /dev/null @@ -1,99 +0,0 @@ -// References: -// https://github.com/vmg/houdini -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/escape_utils.c -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini.h -// -// https://github.com/JetBrains/jdk8u_nashorn/blob/master/src/jdk/nashorn/internal/runtime/URIUtils.java - -import { - HEADER_SIZE, - CharCode -} from "./string"; - -@inline -export function URI_SAFE(): u8[] { - const table: u8[] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ]; - return table; -} - -@inline -export function URL_SAFE(): u8[] { - const table: u8[] = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]; - return table; -} - -export function escapeUnsafe(dest: usize, source: usize, table: u8[], len: isize): bool { - const HEX_CHARS: u8[] = [ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 - ]; - - var hex0: u16 = CharCode.PERCENT; // % - var i: isize = 0, org: isize, offset: usize = 0; - while (i < len) { - org = i; - let ch = load(source + (i << 1), HEADER_SIZE); - while (i < len && ch <= 127 && table[ch] != 0) { - ++i; - ch = load(source + (i << 1), HEADER_SIZE); - } - if (i > org) { - if (!org) { - if (i >= len) return false; - // reallocUnsafe(dest, len * 12 / 10); - } - let size = (i - org) << 1; - memory.copy( - dest + HEADER_SIZE + offset, - source + HEADER_SIZE + (org << 1), - size - ); - offset += size; - } - /* escaping */ - if (i >= len) break; - - ch = load(source + (i << 1), HEADER_SIZE); - let hex1 = HEX_CHARS[(ch >>> 4) & 0x0F] | (HEX_CHARS[ch & 0x0F] << 16); - store(dest + offset, hex0, HEADER_SIZE + 0); - store(dest + offset, hex1, HEADER_SIZE + 2); - offset += 3 << 1; - ++i; - } - return true; -} diff --git a/std/assembly/util/string.ts b/std/assembly/util/string.ts index 76e993ec96..d22e3e4ad8 100644 --- a/std/assembly/util/string.ts +++ b/std/assembly/util/string.ts @@ -458,6 +458,7 @@ import { ipow32 } from "../math"; // @ts-ignore: decorator @inline export const enum CharCode { + PERCENT = 0x25, PLUS = 0x2B, MINUS = 0x2D, DOT = 0x2E, diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts new file mode 100644 index 0000000000..fe1b0e1799 --- /dev/null +++ b/std/assembly/util/uri.ts @@ -0,0 +1,88 @@ +// References: +// https://github.com/vmg/houdini +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/escape_utils.c +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini.h +// +// https://github.com/JetBrains/jdk8u_nashorn/blob/master/src/jdk/nashorn/internal/runtime/URIUtils.java + +import { CharCode } from "./string"; + +const URI_SAFE = memory.data([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]); + +const URL_SAFE = memory.data([ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]); + +export function escapeUnsafe(dest: usize, source: usize, table: u8[], len: isize): bool { + const HEX_CHARS: u8[] = [ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 + ]; + + var hex0: u16 = CharCode.PERCENT; // % + var i: isize = 0, org: isize, offset: usize = 0; + while (i < len) { + org = i; + let ch = load(source + (i << 1)); + while (i < len && ch <= 127 && table[ch] != 0) { + ++i; + ch = load(source + (i << 1)); + } + if (i > org) { + if (!org) { + if (i >= len) return false; + // reallocUnsafe(dest, len * 12 / 10); + } + let size = (i - org) << 1; + memory.copy( + dest + offset, + source + (org << 1), + size + ); + offset += size; + } + /* escaping */ + if (i >= len) break; + + ch = load(source + (i << 1)); + let hex1 = HEX_CHARS[(ch >>> 4) & 0x0F] | (HEX_CHARS[ch & 0x0F] << 16); + store(dest + offset, hex0, 0); + store(dest + offset, hex1, 2); + offset += 3 << 1; + ++i; + } + return true; +} From f8308f8e90e986dcbd4bcb1610b52cc929a3c69a Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 21 Aug 2020 12:40:52 +0300 Subject: [PATCH 04/87] more --- std/assembly/util/uri.ts | 57 +++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index fe1b0e1799..96d3d4b197 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -8,7 +8,8 @@ import { CharCode } from "./string"; -const URI_SAFE = memory.data([ +// @ts-ignore: decorator +@lazy const URI_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -27,7 +28,8 @@ const URI_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]); -const URL_SAFE = memory.data([ +// @ts-ignore: decorator +@lazy const URL_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, @@ -46,30 +48,30 @@ const URL_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]); -export function escapeUnsafe(dest: usize, source: usize, table: u8[], len: isize): bool { - const HEX_CHARS: u8[] = [ +export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): bool { + const HEX_CHARS = memory.data([ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 - ]; + ]); var hex0: u16 = CharCode.PERCENT; // % var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; - let ch = load(source + (i << 1)); - while (i < len && ch <= 127 && table[ch] != 0) { + let ch = load(src + (i << 1)); + while (i < len && ch <= 127 && load(table + ch) != 0) { ++i; - ch = load(source + (i << 1)); + ch = load(src + (i << 1)); } if (i > org) { if (!org) { if (i >= len) return false; - // reallocUnsafe(dest, len * 12 / 10); + dst = __realloc(dst, len * 12 / 10); } let size = (i - org) << 1; memory.copy( - dest + offset, - source + (org << 1), + dst + offset, + src + (org << 1), size ); offset += size; @@ -77,12 +79,37 @@ export function escapeUnsafe(dest: usize, source: usize, table: u8[], len: isize /* escaping */ if (i >= len) break; - ch = load(source + (i << 1)); - let hex1 = HEX_CHARS[(ch >>> 4) & 0x0F] | (HEX_CHARS[ch & 0x0F] << 16); - store(dest + offset, hex0, 0); - store(dest + offset, hex1, 2); + ch = load(src + (i << 1)); + let hex1 = ( + (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | + (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) + ); + store(dst + offset, hex0, 0); + store(dst + offset, hex1, 2); offset += 3 << 1; ++i; } return true; } + +export function escapeURI(str: string): string | null { + var len = str.length; + if (!len) return str; + var result = __alloc(1, idof()); + if (!escapeUnsafe(result, changetype(str), len, URI_SAFE)) { + __free(result); + return null; + } + return changetype(result); // retain +} + +export function escapeURIComponent(str: string): string | null { + var len = str.length; + if (!len) return str; + var result = __alloc(1, idof()); + if (!escapeUnsafe(result, changetype(str), len, URL_SAFE)) { + __free(result); + return null; + } + return changetype(result); // retain +} From 68e8cc951f017ed7b8a3c9c745d698ade9fea407 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 21 Aug 2020 12:50:35 +0300 Subject: [PATCH 05/87] wip --- std/assembly/util/uri.ts | 43 +++++++++++++--------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 96d3d4b197..4903c7d9dc 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -17,15 +17,7 @@ import { CharCode } from "./string"; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 ]); // @ts-ignore: decorator @@ -37,32 +29,25 @@ import { CharCode } from "./string"; 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 ]); export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): bool { const HEX_CHARS = memory.data([ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]); - - var hex0: u16 = CharCode.PERCENT; // % + const h0: u16 = CharCode.PERCENT; // % var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; let ch = load(src + (i << 1)); - while (i < len && ch <= 127 && load(table + ch) != 0) { - ++i; - ch = load(src + (i << 1)); - } + + while ( + i < len && ch <= 127 && + load(table + load(src + (i << 1))) != 0 + ) ++i; + if (i > org) { if (!org) { if (i >= len) return false; @@ -80,12 +65,12 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): if (i >= len) break; ch = load(src + (i << 1)); - let hex1 = ( + let h1 = ( (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) ); - store(dst + offset, hex0, 0); - store(dst + offset, hex1, 2); + store(dst + offset, h0, 0); + store(dst + offset, h1, 2); offset += 3 << 1; ++i; } From 2f6a92c068295549767896c5586bf67ddff639ad Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 21 Aug 2020 13:11:57 +0300 Subject: [PATCH 06/87] wip --- std/assembly/util/uri.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 4903c7d9dc..05eb7cd09d 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -9,7 +9,7 @@ import { CharCode } from "./string"; // @ts-ignore: decorator -@lazy const URI_SAFE = memory.data([ +@lazy export const URI_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -21,7 +21,7 @@ import { CharCode } from "./string"; ]); // @ts-ignore: decorator -@lazy const URL_SAFE = memory.data([ +@lazy export const URL_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, @@ -45,7 +45,7 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): while ( i < len && ch <= 127 && - load(table + load(src + (i << 1))) != 0 + load(table + (ch = load(src + (i << 1)))) != 0 ) ++i; if (i > org) { From 76f3ac8a527d6221f98208cf881ce3c8a54153da Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 21 Aug 2020 14:27:25 +0300 Subject: [PATCH 07/87] more --- std/assembly/util/uri.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 05eb7cd09d..387d6a9fd4 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -43,10 +43,16 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): org = i; let ch = load(src + (i << 1)); - while ( - i < len && ch <= 127 && - load(table + (ch = load(src + (i << 1)))) != 0 - ) ++i; + while (i < len) { + if (ch <= 127) { + if (!load(table + ch)) break; + ++i; + ch = load(src + (i << 1)); + continue; + } + if (ch > 0xD800 || ch == h0) break; + ++i; + } if (i > org) { if (!org) { From 0f99ff11b73c1edb58f6b6bc4fb63f371a090015 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 21 Aug 2020 14:30:04 +0300 Subject: [PATCH 08/87] refactor --- std/assembly/util/uri.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 387d6a9fd4..5a9e9bccfe 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -41,16 +41,14 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; - let ch = load(src + (i << 1)); - + let ch: u32; while (i < len) { + ch = load(src + (i << 1)); if (ch <= 127) { if (!load(table + ch)) break; - ++i; - ch = load(src + (i << 1)); - continue; + } else { + if (ch > 0xD800 || ch == h0) break; } - if (ch > 0xD800 || ch == h0) break; ++i; } From d403720e6fffbae5eed8463906e6b9e9326bb12e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 23 Aug 2020 00:46:56 +0300 Subject: [PATCH 09/87] more --- std/assembly/util/uri.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 5a9e9bccfe..c37c4965fb 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -47,7 +47,7 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): if (ch <= 127) { if (!load(table + ch)) break; } else { - if (ch > 0xD800 || ch == h0) break; + if (ch >= 0xD800 || ch == h0) break; } ++i; } From ac22e36661f580369401061fe77d2fcc8144fb3e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 16 Mar 2021 17:19:18 +0200 Subject: [PATCH 10/87] remove some verbosity --- std/assembly/util/uri.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index c37c4965fb..61d8971b93 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -1,10 +1,5 @@ // References: -// https://github.com/vmg/houdini // https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/escape_utils.c -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini.h -// -// https://github.com/JetBrains/jdk8u_nashorn/blob/master/src/jdk/nashorn/internal/runtime/URIUtils.java import { CharCode } from "./string"; From 8a30361ca971dae2edf001ffb8717cd337b806a3 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 16 Mar 2021 17:42:53 +0200 Subject: [PATCH 11/87] update heap methods --- std/assembly/util/uri.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 61d8971b93..66c7191488 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -50,7 +50,7 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): if (i > org) { if (!org) { if (i >= len) return false; - dst = __realloc(dst, len * 12 / 10); + dst = __renew(dst, len * 12 / 10); } let size = (i - org) << 1; memory.copy( @@ -79,21 +79,19 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): export function escapeURI(str: string): string | null { var len = str.length; if (!len) return str; - var result = __alloc(1, idof()); + var result = __new(1, idof()); if (!escapeUnsafe(result, changetype(str), len, URI_SAFE)) { - __free(result); return null; } - return changetype(result); // retain + return changetype(result); } export function escapeURIComponent(str: string): string | null { var len = str.length; if (!len) return str; - var result = __alloc(1, idof()); + var result = __new(1, idof()); if (!escapeUnsafe(result, changetype(str), len, URL_SAFE)) { - __free(result); return null; } - return changetype(result); // retain + return changetype(result); } From 342da70d823906088514b0d0489760e716a00f7c Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 16 Mar 2021 17:46:21 +0200 Subject: [PATCH 12/87] fix --- std/assembly/util/uri.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 66c7191488..322e09817d 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -79,7 +79,7 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): export function escapeURI(str: string): string | null { var len = str.length; if (!len) return str; - var result = __new(1, idof()); + var result = __new(len, idof()); if (!escapeUnsafe(result, changetype(str), len, URI_SAFE)) { return null; } @@ -89,7 +89,7 @@ export function escapeURI(str: string): string | null { export function escapeURIComponent(str: string): string | null { var len = str.length; if (!len) return str; - var result = __new(1, idof()); + var result = __new(len, idof()); if (!escapeUnsafe(result, changetype(str), len, URL_SAFE)) { return null; } From 7051dc491ee295c056a96f0f1de5302619f20838 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 16 Mar 2021 18:38:55 +0200 Subject: [PATCH 13/87] add more refs --- std/assembly/util/uri.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 322e09817d..e4403023f1 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -1,4 +1,5 @@ // References: +// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_e.c // https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c import { CharCode } from "./string"; From 514a4c7155919c72991ee2ead2081c625f97dca2 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 04:44:06 +0200 Subject: [PATCH 14/87] simplify --- std/assembly/util/uri.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index e4403023f1..ea65cf895d 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -42,9 +42,7 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): ch = load(src + (i << 1)); if (ch <= 127) { if (!load(table + ch)) break; - } else { - if (ch >= 0xD800 || ch == h0) break; - } + } else if (ch >= 0xD800) break; ++i; } From 6b01c7d081cfc384c38e345c274d667d0212a950 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 14:23:16 +0200 Subject: [PATCH 15/87] store utf8 code points --- std/assembly/util/uri.ts | 94 +++++++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 25 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index ea65cf895d..c0c23c7e7c 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -5,7 +5,7 @@ import { CharCode } from "./string"; // @ts-ignore: decorator -@lazy export const URI_SAFE = memory.data([ +@lazy const URI_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -17,7 +17,7 @@ import { CharCode } from "./string"; ]); // @ts-ignore: decorator -@lazy export const URL_SAFE = memory.data([ +@lazy const URL_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, @@ -28,23 +28,48 @@ import { CharCode } from "./string"; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 ]); +// @ts-ignore: decorator +@lazy const HEX_CHARS = memory.data([ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 +]); + +function encodeHexPoint(dst: usize, offset: usize, c: u32): isize { + const U: u16 = 0x75; // u + const P: u16 = CharCode.PERCENT; // % + + store(dst + offset, P); // % + offset += 1 << 1; + if (c >= 0xFF) { + store(dst + offset, U); // u + let hex = ( + (load(HEX_CHARS + ((c >>> 12) & 0x0F))) | + (load(HEX_CHARS + ((c >>> 8) & 0x0F)) << 16) + ); + store(dst + offset, hex, 2); // XX + offset += 3 << 1; + } + let hex = ( + (load(HEX_CHARS + ((c >>> 4) & 0x0F))) | + (load(HEX_CHARS + ((c >>> 0) & 0x0F)) << 16) + ); + store(dst + offset, hex); // XX + offset += 2 << 1; + return offset; +} + export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): bool { - const HEX_CHARS = memory.data([ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 - ]); - const h0: u16 = CharCode.PERCENT; // % var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; - let ch: u32; - while (i < len) { - ch = load(src + (i << 1)); - if (ch <= 127) { - if (!load(table + ch)) break; - } else if (ch >= 0xD800) break; + let c: u32, c1: u32; + do { + c = load(src + (i << 1)); + if (c <= 127) { + if (!load(table + c)) break; + } else break; ++i; - } + } while (i < len); if (i > org) { if (!org) { @@ -59,18 +84,37 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): ); offset += size; } - /* escaping */ - if (i >= len) break; - ch = load(src + (i << 1)); - let h1 = ( - (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | - (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) - ); - store(dst + offset, h0, 0); - store(dst + offset, h1, 2); - offset += 3 << 1; - ++i; + if (c >= 0xDC00 && c <= 0xDFFF) { + // throw new Error("invalid character"); + return false; + } + + if (c >= 0xD800 && c <= 0xDBFF) { + c1 = load(src + (i << 1)); + ++i; + if (c1 < 0xDC00 || c1 > 0xDFFF) { + // throw new Error("expecting surrogate pair"); + return false; + } + c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; + } + + if (c <= 0x7F) { + offset += encodeHexPoint(dst, offset, c); + } else { + if (c <= 0x800) { + offset += encodeHexPoint(dst, offset, (c >> 6) | 0xC0); + } else { + if (c < 0x10000) { + offset += encodeHexPoint(dst, offset, (c >> 12) | 0xE0); + } else { + offset += encodeHexPoint(dst, offset, (c >> 18) | 0xF0); + offset += encodeHexPoint(dst, offset, ((c >> 12) & 0x3F) | 0x80); + } + offset += encodeHexPoint(dst, offset, ((c >> 6) & 0x3F) | 0x80); + } + } } return true; } From bf5e656673545fdd8f8e49ab76d02ccd88f183d2 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 14:25:39 +0200 Subject: [PATCH 16/87] simplify names --- std/assembly/util/uri.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index c0c23c7e7c..709bdeb909 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -34,7 +34,7 @@ import { CharCode } from "./string"; 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]); -function encodeHexPoint(dst: usize, offset: usize, c: u32): isize { +function encode(dst: usize, offset: usize, c: u32): isize { const U: u16 = 0x75; // u const P: u16 = CharCode.PERCENT; // % @@ -58,7 +58,7 @@ function encodeHexPoint(dst: usize, offset: usize, c: u32): isize { return offset; } -export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): bool { +export function escape(dst: usize, src: usize, len: isize, table: usize): bool { var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; @@ -101,18 +101,18 @@ export function escapeUnsafe(dst: usize, src: usize, len: isize, table: usize): } if (c <= 0x7F) { - offset += encodeHexPoint(dst, offset, c); + offset += encode(dst, offset, c); } else { if (c <= 0x800) { - offset += encodeHexPoint(dst, offset, (c >> 6) | 0xC0); + offset += encode(dst, offset, (c >> 6) | 0xC0); } else { if (c < 0x10000) { - offset += encodeHexPoint(dst, offset, (c >> 12) | 0xE0); + offset += encode(dst, offset, (c >> 12) | 0xE0); } else { - offset += encodeHexPoint(dst, offset, (c >> 18) | 0xF0); - offset += encodeHexPoint(dst, offset, ((c >> 12) & 0x3F) | 0x80); + offset += encode(dst, offset, (c >> 18) | 0xF0); + offset += encode(dst, offset, ((c >> 12) & 0x3F) | 0x80); } - offset += encodeHexPoint(dst, offset, ((c >> 6) & 0x3F) | 0x80); + offset += encode(dst, offset, ((c >> 6) & 0x3F) | 0x80); } } } @@ -123,7 +123,7 @@ export function escapeURI(str: string): string | null { var len = str.length; if (!len) return str; var result = __new(len, idof()); - if (!escapeUnsafe(result, changetype(str), len, URI_SAFE)) { + if (!escape(result, changetype(str), len, URI_SAFE)) { return null; } return changetype(result); @@ -133,7 +133,7 @@ export function escapeURIComponent(str: string): string | null { var len = str.length; if (!len) return str; var result = __new(len, idof()); - if (!escapeUnsafe(result, changetype(str), len, URL_SAFE)) { + if (!escape(result, changetype(str), len, URL_SAFE)) { return null; } return changetype(result); From 6f0d5fa47f8073fe4e5f24b48643ba1b3424c3f6 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 14:28:24 +0200 Subject: [PATCH 17/87] refactor --- std/assembly/util/uri.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 709bdeb909..37955dc896 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -65,7 +65,7 @@ export function escape(dst: usize, src: usize, len: isize, table: usize): bool { let c: u32, c1: u32; do { c = load(src + (i << 1)); - if (c <= 127) { + if (c < 0x80) { if (!load(table + c)) break; } else break; ++i; @@ -100,7 +100,7 @@ export function escape(dst: usize, src: usize, len: isize, table: usize): bool { c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } - if (c <= 0x7F) { + if (c < 0x80) { offset += encode(dst, offset, c); } else { if (c <= 0x800) { From 9abda8f126c8dfbb03734811de91041308201810 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 14:31:00 +0200 Subject: [PATCH 18/87] more --- std/assembly/util/string.ts | 1 + std/assembly/util/uri.ts | 9 +++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/std/assembly/util/string.ts b/std/assembly/util/string.ts index 5a4355e2e4..325359d237 100644 --- a/std/assembly/util/string.ts +++ b/std/assembly/util/string.ts @@ -485,6 +485,7 @@ export const enum CharCode { e = 0x65, n = 0x6E, o = 0x6F, + u = 0x75, x = 0x78, z = 0x7A } diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 37955dc896..cde96f300d 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -35,13 +35,10 @@ import { CharCode } from "./string"; ]); function encode(dst: usize, offset: usize, c: u32): isize { - const U: u16 = 0x75; // u - const P: u16 = CharCode.PERCENT; // % - - store(dst + offset, P); // % + store(dst + offset, CharCode.PERCENT); // % offset += 1 << 1; - if (c >= 0xFF) { - store(dst + offset, U); // u + if (c > 0x80) { + store(dst + offset, CharCode.u); // u let hex = ( (load(HEX_CHARS + ((c >>> 12) & 0x0F))) | (load(HEX_CHARS + ((c >>> 8) & 0x0F)) << 16) From 651702f61b6ef5f0216b7052e2d61654a09536ed Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 18:02:31 +0200 Subject: [PATCH 19/87] fixes --- std/assembly/util/uri.ts | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index cde96f300d..d73e15dc64 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -34,25 +34,14 @@ import { CharCode } from "./string"; 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]); -function encode(dst: usize, offset: usize, c: u32): isize { - store(dst + offset, CharCode.PERCENT); // % - offset += 1 << 1; - if (c > 0x80) { - store(dst + offset, CharCode.u); // u - let hex = ( - (load(HEX_CHARS + ((c >>> 12) & 0x0F))) | - (load(HEX_CHARS + ((c >>> 8) & 0x0F)) << 16) - ); - store(dst + offset, hex, 2); // XX - offset += 3 << 1; - } +function encode(dst: usize, offset: usize, ch: u32): usize { let hex = ( - (load(HEX_CHARS + ((c >>> 4) & 0x0F))) | - (load(HEX_CHARS + ((c >>> 0) & 0x0F)) << 16) + (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | + (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) ); - store(dst + offset, hex); // XX - offset += 2 << 1; - return offset; + store(dst + offset, CharCode.PERCENT, 0); // % + store(dst + offset, hex, 2); // XX + return offset + (3 << 1); } export function escape(dst: usize, src: usize, len: isize, table: usize): bool { From f6c50510e0d78720b4b9fef530f8212c99f9f974 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 18:07:29 +0200 Subject: [PATCH 20/87] refactors --- std/assembly/util/uri.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index d73e15dc64..917c2a02aa 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -34,7 +34,7 @@ import { CharCode } from "./string"; 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]); -function encode(dst: usize, offset: usize, ch: u32): usize { +function storeHex(dst: usize, offset: usize, ch: u32): usize { let hex = ( (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) @@ -44,7 +44,7 @@ function encode(dst: usize, offset: usize, ch: u32): usize { return offset + (3 << 1); } -export function escape(dst: usize, src: usize, len: isize, table: usize): bool { +function encode(dst: usize, src: usize, len: isize, table: usize): bool { var i: isize = 0, org: isize, offset: usize = 0; while (i < len) { org = i; @@ -87,39 +87,39 @@ export function escape(dst: usize, src: usize, len: isize, table: usize): bool { } if (c < 0x80) { - offset += encode(dst, offset, c); + offset += storeHex(dst, offset, c); } else { if (c <= 0x800) { - offset += encode(dst, offset, (c >> 6) | 0xC0); + offset += storeHex(dst, offset, (c >> 6) | 0xC0); } else { if (c < 0x10000) { - offset += encode(dst, offset, (c >> 12) | 0xE0); + offset += storeHex(dst, offset, (c >> 12) | 0xE0); } else { - offset += encode(dst, offset, (c >> 18) | 0xF0); - offset += encode(dst, offset, ((c >> 12) & 0x3F) | 0x80); + offset += storeHex(dst, offset, (c >> 18) | 0xF0); + offset += storeHex(dst, offset, ((c >> 12) & 0x3F) | 0x80); } - offset += encode(dst, offset, ((c >> 6) & 0x3F) | 0x80); + offset += storeHex(dst, offset, ((c >> 6) & 0x3F) | 0x80); } } } return true; } -export function escapeURI(str: string): string | null { +export function encodeURI(str: string): string | null { var len = str.length; if (!len) return str; var result = __new(len, idof()); - if (!escape(result, changetype(str), len, URI_SAFE)) { + if (!encode(result, changetype(str), len, URI_SAFE)) { return null; } return changetype(result); } -export function escapeURIComponent(str: string): string | null { +export function encodeURIComponent(str: string): string | null { var len = str.length; if (!len) return str; var result = __new(len, idof()); - if (!escape(result, changetype(str), len, URL_SAFE)) { + if (!encode(result, changetype(str), len, URL_SAFE)) { return null; } return changetype(result); From 2408cf21c7b15a1234668ea4c0416b36c0ae5a10 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 20:49:55 +0200 Subject: [PATCH 21/87] progress --- std/assembly/index.d.ts | 4 + std/assembly/uri.ts | 17 + std/assembly/util/uri.ts | 53 +- tests/compiler/std/uri.json | 5 + tests/compiler/std/uri.optimized.wat | 2552 +++++++++++++++ tests/compiler/std/uri.ts | 15 + tests/compiler/std/uri.untouched.wat | 4382 ++++++++++++++++++++++++++ 7 files changed, 6992 insertions(+), 36 deletions(-) create mode 100644 std/assembly/uri.ts create mode 100644 tests/compiler/std/uri.json create mode 100644 tests/compiler/std/uri.optimized.wat create mode 100644 tests/compiler/std/uri.ts create mode 100644 tests/compiler/std/uri.untouched.wat diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 89ca2f76be..41e58e2c20 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -216,6 +216,10 @@ declare function fmod(x: f64, y: f64): f64; declare function fmodf(x: f32, y: f32): f32; /** Returns the number of parameters in the given function signature type. */ declare function lengthof any>(func?: T): i32; +/** Encodes a text string as a valid Uniform Resource Identifier (URI). */ +declare function encodeURI(str: string): string; +/** Encodes a text string as a valid component of a Uniform Resource Identifier (URI). */ +declare function encodeURIComponent(str: string): string; /** Atomic operations. */ declare namespace atomic { diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts new file mode 100644 index 0000000000..46bb0a3d94 --- /dev/null +++ b/std/assembly/uri.ts @@ -0,0 +1,17 @@ +import { encode, URI_SAFE, URL_SAFE } from "./util/uri"; + +export function encodeURI(str: string): string { + var len = str.length; + if (!len) return str; + var result = __new(len << 1, idof()); + encode(result, changetype(str), len, URI_SAFE); + return changetype(result); +} + +export function encodeURIComponent(str: string): string { + var len = str.length; + if (!len) return str; + var result = __new(len << 1, idof()); + encode(result, changetype(str), len, URL_SAFE); + return changetype(result); +} diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 917c2a02aa..eacacbd677 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -5,27 +5,27 @@ import { CharCode } from "./string"; // @ts-ignore: decorator -@lazy const URI_SAFE = memory.data([ +@lazy export const URI_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 ]); // @ts-ignore: decorator -@lazy const URL_SAFE = memory.data([ +@lazy export const URL_SAFE = memory.data([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 ]); // @ts-ignore: decorator @@ -44,8 +44,9 @@ function storeHex(dst: usize, offset: usize, ch: u32): usize { return offset + (3 << 1); } -function encode(dst: usize, src: usize, len: isize, table: usize): bool { +export function encode(dst: usize, src: usize, len: isize, table: usize): void { var i: isize = 0, org: isize, offset: usize = 0; + var outLen = len; while (i < len) { org = i; let c: u32, c1: u32; @@ -57,11 +58,12 @@ function encode(dst: usize, src: usize, len: isize, table: usize): bool { ++i; } while (i < len); + if (offset >= (outLen << 1)) { + outLen = outLen * 12 / 10; + dst = __renew(dst, outLen << 1); + } + if (i > org) { - if (!org) { - if (i >= len) return false; - dst = __renew(dst, len * 12 / 10); - } let size = (i - org) << 1; memory.copy( dst + offset, @@ -71,17 +73,17 @@ function encode(dst: usize, src: usize, len: isize, table: usize): bool { offset += size; } + // if (i >= len) break; + if (c >= 0xDC00 && c <= 0xDFFF) { - // throw new Error("invalid character"); - return false; + throw new Error("invalid character"); } if (c >= 0xD800 && c <= 0xDBFF) { c1 = load(src + (i << 1)); ++i; if (c1 < 0xDC00 || c1 > 0xDFFF) { - // throw new Error("expecting surrogate pair"); - return false; + throw new Error("expecting surrogate pair"); } c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } @@ -102,25 +104,4 @@ function encode(dst: usize, src: usize, len: isize, table: usize): bool { } } } - return true; -} - -export function encodeURI(str: string): string | null { - var len = str.length; - if (!len) return str; - var result = __new(len, idof()); - if (!encode(result, changetype(str), len, URI_SAFE)) { - return null; - } - return changetype(result); -} - -export function encodeURIComponent(str: string): string | null { - var len = str.length; - if (!len) return str; - var result = __new(len, idof()); - if (!encode(result, changetype(str), len, URL_SAFE)) { - return null; - } - return changetype(result); } diff --git a/tests/compiler/std/uri.json b/tests/compiler/std/uri.json new file mode 100644 index 0000000000..b83788465e --- /dev/null +++ b/tests/compiler/std/uri.json @@ -0,0 +1,5 @@ +{ + "asc_flags": [ + ], + "asc_rtrace": true +} diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat new file mode 100644 index 0000000000..7b4ba062cd --- /dev/null +++ b/tests/compiler/std/uri.optimized.wat @@ -0,0 +1,2552 @@ +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (type $none_=>_none (func)) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_=>_none (func (param i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 1036) "\1c") + (data (i32.const 1048) "\01") + (data (i32.const 1068) "<") + (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data (i32.const 1132) "<") + (data (i32.const 1144) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data (i32.const 1260) "<") + (data (i32.const 1272) "\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data (i32.const 1324) ",") + (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data (i32.const 1404) "<") + (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data (i32.const 1501) "\01\00\00\00\00\00\01\01\01\01\00\00\01\01\00\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\01") + (data (i32.const 1596) "<") + (data (i32.const 1608) "\01\00\00\00\"\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r") + (data (i32.const 1660) "<") + (data (i32.const 1672) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1724) "L") + (data (i32.const 1736) "\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r") + (data (i32.const 1804) "0123456789ABCDEF") + (data (i32.const 1820) ",") + (data (i32.const 1832) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1868) "\1c") + (data (i32.const 1880) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1900) "\1c") + (data (i32.const 1912) "\01\00\00\00\04\00\00\00a\001") + (data (i32.const 1932) "\1c") + (data (i32.const 1944) "\01\00\00\00\06\00\00\00a\00b\00_") + (data (i32.const 1964) "\\") + (data (i32.const 1976) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 2064) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18476)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) + local.get $0 + local.get $0 + i32.store offset=4 + local.get $0 + local.get $0 + i32.store offset=8 + local.get $0 + ) + (func $~lib/rt/itcms/visitRoots + (local $0 i32) + (local $1 i32) + i32.const 1280 + call $~lib/rt/itcms/__visit + i32.const 1088 + call $~lib/rt/itcms/__visit + global.get $~lib/rt/itcms/pinSpace + local.tee $1 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.ne + if + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1152 + i32.const 159 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#set:color (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + i32.or + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#set:next (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#linkTo (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + local.get $1 + i32.load offset=8 + local.set $3 + local.get $0 + local.get $1 + local.get $2 + i32.or + i32.store offset=4 + local.get $0 + local.get $3 + i32.store offset=8 + local.get $3 + local.get $0 + call $~lib/rt/itcms/Object#set:next + local.get $1 + local.get $0 + i32.store offset=8 + ) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load offset=8 + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 147 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $1 + global.set $~lib/rt/itcms/iter + end + block $__inlined_func$~lib/rt/itcms/Object#unlink + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.tee $1 + i32.eqz + if + i32.const 0 + local.get $0 + i32.const 18476 + i32.lt_u + local.get $0 + i32.load offset=8 + select + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 127 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + br $__inlined_func$~lib/rt/itcms/Object#unlink + end + local.get $0 + i32.load offset=8 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 131 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:next + end + local.get $0 + global.get $~lib/rt/itcms/toSpace + local.get $0 + i32.load offset=12 + local.tee $1 + i32.const 1 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 2064 + i32.load + i32.gt_u + if + i32.const 1280 + i32.const 1344 + i32.const 22 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 3 + i32.shl + i32.const 2068 + i32.add + i32.load + i32.const 32 + i32.and + end + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/rt/itcms/__visit (param $0 i32) + local.get $0 + i32.eqz + if + return + end + global.get $~lib/rt/itcms/white + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.tee $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 273 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const -4 + i32.and + local.tee $2 + i32.const 1073741820 + i32.lt_u + i32.const 0 + local.get $2 + i32.const 12 + i32.ge_u + select + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 275 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 256 + i32.lt_u + if + local.get $2 + i32.const 4 + i32.shr_u + local.set $2 + else + local.get $2 + i32.const 31 + local.get $2 + i32.clz + i32.sub + local.tee $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $2 + local.get $3 + i32.const 7 + i32.sub + local.set $3 + end + local.get $2 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $3 + i32.const 23 + i32.lt_u + select + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 288 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=8 + local.set $4 + local.get $1 + i32.load offset=4 + local.tee $5 + if + local.get $5 + local.get $4 + i32.store offset=8 + end + local.get $4 + if + local.get $4 + local.get $5 + i32.store offset=4 + end + local.get $1 + local.get $0 + local.get $2 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + i32.eq + if + local.get $0 + local.get $2 + local.get $3 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + local.get $4 + i32.store offset=96 + local.get $4 + i32.eqz + if + local.get $0 + local.get $3 + i32.const 2 + i32.shl + i32.add + local.tee $4 + i32.load offset=4 + i32.const -2 + local.get $2 + i32.rotl + i32.and + local.set $1 + local.get $4 + local.get $1 + i32.store offset=4 + local.get $1 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const -2 + local.get $3 + i32.rotl + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.tee $4 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $5 + i32.load + local.tee $2 + i32.const 1 + i32.and + if + local.get $4 + i32.const -4 + i32.and + i32.const 4 + i32.add + local.get $2 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.const 1073741820 + i32.lt_u + if + local.get $0 + local.get $5 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 + local.get $4 + i32.const 3 + i32.and + i32.or + local.tee $4 + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $5 + i32.load + local.set $2 + end + end + local.get $4 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load + local.tee $3 + i32.load + local.tee $7 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 224 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $7 + i32.const -4 + i32.and + i32.const 4 + i32.add + local.get $4 + i32.const -4 + i32.and + i32.add + local.tee $8 + i32.const 1073741820 + i32.lt_u + if (result i32) + local.get $0 + local.get $3 + call $~lib/rt/tlsf/removeBlock + local.get $3 + local.get $8 + local.get $7 + i32.const 3 + i32.and + i32.or + local.tee $4 + i32.store + local.get $3 + else + local.get $1 + end + local.set $1 + end + local.get $5 + local.get $2 + i32.const 2 + i32.or + i32.store + local.get $4 + i32.const -4 + i32.and + local.tee $3 + i32.const 1073741820 + i32.lt_u + i32.const 0 + local.get $3 + i32.const 12 + i32.ge_u + select + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 239 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $5 + local.get $3 + local.get $1 + i32.const 4 + i32.add + i32.add + i32.ne + if + i32.const 0 + i32.const 1424 + i32.const 240 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $5 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $3 + i32.const 256 + i32.lt_u + if + local.get $3 + i32.const 4 + i32.shr_u + local.set $3 + else + local.get $3 + i32.const 31 + local.get $3 + i32.clz + i32.sub + local.tee $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $3 + local.get $4 + i32.const 7 + i32.sub + local.set $6 + end + local.get $3 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $6 + i32.const 23 + i32.lt_u + select + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 256 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $3 + local.get $6 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $4 + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + local.get $4 + i32.store offset=8 + local.get $4 + if + local.get $4 + local.get $1 + i32.store offset=4 + end + local.get $0 + local.get $3 + local.get $6 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $6 + i32.shl + i32.or + i32.store + local.get $0 + local.get $6 + i32.const 2 + i32.shl + i32.add + local.tee $0 + local.get $0 + i32.load offset=4 + i32.const 1 + local.get $3 + i32.shl + i32.or + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + local.get $1 + local.get $2 + i32.gt_u + if + i32.const 0 + i32.const 1424 + i32.const 381 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $2 + i32.const -16 + i32.and + local.get $0 + i32.load offset=1568 + local.tee $2 + if + local.get $1 + local.get $2 + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + i32.const 1424 + i32.const 388 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $1 + i32.const 16 + i32.sub + i32.eq + if + local.get $2 + i32.load + local.set $4 + local.get $1 + i32.const 16 + i32.sub + local.set $1 + end + else + local.get $1 + local.get $0 + i32.const 1572 + i32.add + i32.lt_u + if + i32.const 0 + i32.const 1424 + i32.const 401 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $1 + i32.sub + local.tee $2 + i32.const 20 + i32.lt_u + if + return + end + local.get $1 + local.get $4 + i32.const 2 + i32.and + local.get $2 + i32.const 8 + i32.sub + local.tee $2 + i32.const 1 + i32.or + i32.or + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $2 + local.get $1 + i32.const 4 + i32.add + i32.add + local.tee $2 + i32.const 2 + i32.store + local.get $0 + local.get $2 + i32.store offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + memory.size + local.tee $0 + i32.const 1 + i32.lt_s + if (result i32) + i32.const 1 + local.get $0 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 18480 + i32.const 0 + i32.store + i32.const 20048 + i32.const 0 + i32.store + loop $for-loop|0 + local.get $1 + i32.const 23 + i32.lt_u + if + local.get $1 + i32.const 2 + i32.shl + i32.const 18480 + i32.add + i32.const 0 + i32.store offset=4 + i32.const 0 + local.set $0 + loop $for-loop|1 + local.get $0 + i32.const 16 + i32.lt_u + if + local.get $0 + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.const 18480 + i32.add + i32.const 0 + i32.store offset=96 + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|1 + end + end + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|0 + end + end + i32.const 18480 + i32.const 20052 + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + i32.const 18480 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $folding-inner0 + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + br_table $case0|0 $case1|0 $case2|0 $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + br $folding-inner0 + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + br $folding-inner0 + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + i32.eq + if + global.get $~lib/memory/__stack_pointer + local.set $0 + loop $while-continue|0 + local.get $0 + i32.const 18476 + i32.lt_u + if + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $0 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $0 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + br $folding-inner0 + end + global.get $~lib/rt/itcms/iter + local.tee $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/white + i32.eqz + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.ne + if + i32.const 0 + i32.const 1152 + i32.const 228 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 18476 + i32.lt_u + if + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + else + global.get $~lib/rt/itcms/total + local.get $0 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.sub + global.set $~lib/rt/itcms/total + local.get $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 18476 + i32.ge_u + if + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $1 + i32.const 4 + i32.sub + local.set $0 + local.get $1 + i32.const 15 + i32.and + i32.eqz + i32.const 0 + local.get $1 + select + if (result i32) + local.get $0 + i32.load + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 565 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $0 + i32.load + i32.const 1 + i32.or + i32.store + local.get $0 + call $~lib/rt/tlsf/insertBlock + end + end + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=4 + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=8 + i32.const 0 + global.set $~lib/rt/itcms/state + end + i32.const 0 + return + end + global.get $~lib/rt/itcms/visitCount + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shr_u + local.set $1 + else + i32.const 31 + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.get $1 + local.get $1 + i32.const 536870910 + i32.lt_u + select + local.tee $1 + i32.clz + i32.sub + local.set $2 + local.get $1 + local.get $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $1 + local.get $2 + i32.const 7 + i32.sub + local.set $2 + end + local.get $1 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $2 + i32.const 23 + i32.lt_u + select + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const -1 + local.get $1 + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + local.get $0 + i32.load + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $1 + i32.const 1073741820 + i32.ge_u + if + i32.const 1088 + i32.const 1424 + i32.const 462 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 12 + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.get $1 + i32.const 12 + i32.le_u + select + local.tee $2 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 4 + memory.size + local.tee $1 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + local.get $0 + i32.load offset=1568 + i32.ne + i32.shl + local.get $2 + i32.const 1 + i32.const 27 + local.get $2 + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.get $2 + local.get $2 + i32.const 536870910 + i32.lt_u + select + i32.add + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.set $3 + local.get $1 + local.get $3 + local.get $1 + local.get $3 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $3 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $0 + local.get $1 + i32.const 16 + i32.shl + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + local.get $0 + local.get $2 + call $~lib/rt/tlsf/searchBlock + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 1424 + i32.const 500 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.gt_u + if + i32.const 0 + i32.const 1424 + i32.const 502 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + i32.load + local.set $3 + local.get $2 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 1424 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.get $2 + i32.sub + local.tee $4 + i32.const 16 + i32.ge_u + if + local.get $1 + local.get $2 + local.get $3 + i32.const 2 + i32.and + i32.or + i32.store + local.get $2 + local.get $1 + i32.const 4 + i32.add + i32.add + local.tee $2 + local.get $4 + i32.const 4 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $0 + local.get $2 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $3 + i32.const -2 + i32.and + i32.store + local.get $1 + i32.const 4 + i32.add + local.tee $0 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.get $0 + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + i32.load + i32.const -3 + i32.and + i32.store + end + local.get $1 + ) + (func $~lib/memory/memory.fill (param $0 i32) (param $1 i32) + (local $2 i32) + block $~lib/util/memory/memset|inlined.0 + local.get $1 + i32.eqz + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store8 + local.get $0 + local.get $1 + i32.add + i32.const 4 + i32.sub + local.tee $2 + i32.const 0 + i32.store8 offset=3 + local.get $1 + i32.const 2 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store8 offset=1 + local.get $0 + i32.const 0 + i32.store8 offset=2 + local.get $2 + i32.const 0 + i32.store8 offset=2 + local.get $2 + i32.const 0 + i32.store8 offset=1 + local.get $1 + i32.const 6 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store8 offset=3 + local.get $2 + i32.const 0 + i32.store8 + local.get $1 + i32.const 8 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + local.get $0 + i32.sub + i32.const 3 + i32.and + local.tee $2 + i32.add + local.tee $0 + i32.const 0 + i32.store + local.get $0 + local.get $1 + local.get $2 + i32.sub + i32.const -4 + i32.and + local.tee $2 + i32.add + i32.const 28 + i32.sub + local.tee $1 + i32.const 0 + i32.store offset=24 + local.get $2 + i32.const 8 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 0 + i32.store offset=16 + local.get $1 + i32.const 0 + i32.store offset=20 + local.get $2 + i32.const 24 + i32.le_u + br_if $~lib/util/memory/memset|inlined.0 + local.get $0 + i32.const 0 + i32.store offset=12 + local.get $0 + i32.const 0 + i32.store offset=16 + local.get $0 + i32.const 0 + i32.store offset=20 + local.get $0 + i32.const 0 + i32.store offset=24 + local.get $1 + i32.const 0 + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 0 + i32.store offset=12 + local.get $0 + local.get $0 + i32.const 4 + i32.and + i32.const 24 + i32.add + local.tee $1 + i32.add + local.set $0 + local.get $2 + local.get $1 + i32.sub + local.set $1 + loop $while-continue|0 + local.get $1 + i32.const 32 + i32.ge_u + if + local.get $0 + i64.const 0 + i64.store + local.get $0 + i64.const 0 + i64.store offset=8 + local.get $0 + i64.const 0 + i64.store offset=16 + local.get $0 + i64.const 0 + i64.store offset=24 + local.get $1 + i32.const 32 + i32.sub + local.set $1 + local.get $0 + i32.const 32 + i32.add + local.set $0 + br $while-continue|0 + end + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 1088 + i32.const 1152 + i32.const 260 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/interrupt + i32.const 2048 + local.set $2 + loop $do-continue|0 + local.get $2 + call $~lib/rt/itcms/step + i32.sub + local.set $2 + global.get $~lib/rt/itcms/state + i32.eqz + if + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + br $__inlined_func$~lib/rt/itcms/interrupt + end + local.get $2 + i32.const 0 + i32.gt_s + br_if $do-continue|0 + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.const 10 + i32.shl + i32.add + global.set $~lib/rt/itcms/threshold + end + end + local.get $0 + i32.const 16 + i32.add + local.set $2 + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $2 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + local.get $1 + i32.store offset=12 + local.get $2 + local.get $0 + i32.store offset=16 + local.get $2 + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $2 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.add + global.set $~lib/rt/itcms/total + local.get $2 + i32.const 20 + i32.add + local.tee $1 + local.get $0 + call $~lib/memory/memory.fill + local.get $1 + ) + (func $~lib/memory/memory.copy (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + block $~lib/util/memory/memmove|inlined.0 + local.get $2 + local.set $4 + local.get $0 + local.get $1 + i32.eq + br_if $~lib/util/memory/memmove|inlined.0 + local.get $0 + local.get $1 + i32.lt_u + if + local.get $1 + i32.const 7 + i32.and + local.get $0 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|0 + local.get $0 + i32.const 7 + i32.and + if + local.get $4 + i32.eqz + br_if $~lib/util/memory/memmove|inlined.0 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $0 + local.tee $2 + i32.const 1 + i32.add + local.set $0 + local.get $1 + local.tee $3 + i32.const 1 + i32.add + local.set $1 + local.get $2 + local.get $3 + i32.load8_u + i32.store8 + br $while-continue|0 + end + end + loop $while-continue|1 + local.get $4 + i32.const 8 + i32.ge_u + if + local.get $0 + local.get $1 + i64.load + i64.store + local.get $4 + i32.const 8 + i32.sub + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + br $while-continue|1 + end + end + end + loop $while-continue|2 + local.get $4 + if + local.get $0 + local.tee $2 + i32.const 1 + i32.add + local.set $0 + local.get $1 + local.tee $3 + i32.const 1 + i32.add + local.set $1 + local.get $2 + local.get $3 + i32.load8_u + i32.store8 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + br $while-continue|2 + end + end + else + local.get $1 + i32.const 7 + i32.and + local.get $0 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|3 + local.get $0 + local.get $4 + i32.add + i32.const 7 + i32.and + if + local.get $4 + i32.eqz + br_if $~lib/util/memory/memmove|inlined.0 + local.get $4 + i32.const 1 + i32.sub + local.tee $4 + local.get $0 + i32.add + local.get $1 + local.get $4 + i32.add + i32.load8_u + i32.store8 + br $while-continue|3 + end + end + loop $while-continue|4 + local.get $4 + i32.const 8 + i32.ge_u + if + local.get $4 + i32.const 8 + i32.sub + local.tee $4 + local.get $0 + i32.add + local.get $1 + local.get $4 + i32.add + i64.load + i64.store + br $while-continue|4 + end + end + end + loop $while-continue|5 + local.get $4 + if + local.get $4 + i32.const 1 + i32.sub + local.tee $4 + local.get $0 + i32.add + local.get $1 + local.get $4 + i32.add + i32.load8_u + i32.store8 + br $while-continue|5 + end + end + end + end + ) + (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + local.get $2 + i32.const 4 + i32.shr_u + i32.const 15 + i32.and + i32.const 1804 + i32.add + i32.load8_u + local.get $2 + i32.const 15 + i32.and + i32.const 1804 + i32.add + i32.load8_u + i32.const 16 + i32.shl + i32.or + local.set $2 + local.get $0 + local.get $1 + i32.add + local.tee $0 + i32.const 37 + i32.store16 + local.get $0 + local.get $2 + i32.store offset=2 + local.get $1 + i32.const 6 + i32.add + ) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + local.get $2 + local.set $7 + loop $while-continue|0 + local.get $2 + local.get $5 + i32.gt_s + if + local.get $5 + local.set $8 + loop $do-continue|1 + block $do-break|1 + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $4 + i32.const 128 + i32.ge_u + br_if $do-break|1 + local.get $4 + i32.const 1468 + i32.add + i32.load8_u + i32.eqz + br_if $do-break|1 + local.get $2 + local.get $5 + i32.const 1 + i32.add + local.tee $5 + i32.gt_s + br_if $do-continue|1 + end + end + local.get $3 + local.get $7 + i32.const 1 + i32.shl + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/__renew + local.get $7 + i32.const 12 + i32.mul + i32.const 10 + i32.div_s + local.tee $7 + i32.const 1 + i32.shl + local.tee $9 + local.get $0 + i32.const 20 + i32.sub + local.tee $10 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $10 + local.get $9 + i32.store offset=16 + br $__inlined_func$~lib/rt/itcms/__renew + end + local.get $9 + local.get $10 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $6 + local.get $0 + local.get $9 + local.get $10 + i32.load offset=16 + local.tee $0 + local.get $0 + local.get $9 + i32.gt_u + select + call $~lib/memory/memory.copy + local.get $6 + local.set $0 + end + end + local.get $5 + local.get $8 + i32.gt_s + if + local.get $0 + local.get $3 + i32.add + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $5 + local.get $8 + i32.sub + i32.const 1 + i32.shl + local.tee $6 + call $~lib/memory/memory.copy + local.get $3 + local.get $6 + i32.add + local.set $3 + end + local.get $4 + i32.const 57343 + i32.le_u + i32.const 0 + local.get $4 + i32.const 56320 + i32.ge_u + select + if + i32.const 1616 + i32.const 1680 + i32.const 79 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 56319 + i32.le_u + i32.const 0 + local.get $4 + i32.const 55296 + i32.ge_u + select + if + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $6 + local.get $5 + i32.const 1 + i32.add + local.set $5 + i32.const 1 + local.get $6 + i32.const 57343 + i32.gt_u + local.get $6 + i32.const 56320 + i32.lt_u + select + if + i32.const 1744 + i32.const 1680 + i32.const 86 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $6 + i32.const 1023 + i32.and + local.get $4 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + i32.or + i32.const 65536 + i32.add + local.set $4 + end + local.get $4 + i32.const 128 + i32.lt_u + if (result i32) + local.get $0 + local.get $3 + local.get $4 + call $~lib/util/uri/storeHex + local.get $3 + i32.add + else + local.get $4 + i32.const 2048 + i32.le_u + if (result i32) + local.get $0 + local.get $3 + local.get $4 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + call $~lib/util/uri/storeHex + local.get $3 + i32.add + else + local.get $4 + i32.const 65536 + i32.lt_u + if (result i32) + local.get $0 + local.get $3 + local.get $4 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + local.get $3 + i32.add + else + local.get $0 + local.get $3 + local.get $4 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + call $~lib/util/uri/storeHex + local.get $3 + i32.add + local.tee $3 + local.get $0 + local.get $3 + local.get $4 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + end + local.tee $3 + local.get $0 + local.get $3 + local.get $4 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + end + end + local.set $3 + br $while-continue|0 + end + end + ) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $2 + local.get $0 + local.get $1 + call $~lib/util/uri/encode + local.get $2 + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + if + i32.const 0 + return + end + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $2 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + return + end + block $__inlined_func$~lib/util/string/compareImpl (result i32) + local.get $0 + local.tee $3 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $3 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $2 + i32.const 1 + i32.sub + local.set $0 + local.get $2 + if + local.get $3 + i32.load16_u + local.tee $2 + local.get $1 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $2 + local.get $4 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + unreachable + ) + (func $~start + call $start:std/uri + ) + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2092 + i32.lt_s + if + i32.const 18496 + i32.const 18544 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + memory.size + i32.const 16 + i32.shl + i32.const 18476 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1200 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 1232 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 1376 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 2 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1888 + i32.store offset=8 + i32.const 1888 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1888 + i32.store offset=4 + local.get $0 + i32.const 1888 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 3 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1920 + i32.store offset=8 + i32.const 1920 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1920 + i32.store offset=4 + local.get $0 + i32.const 1920 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 4 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=8 + i32.const 1952 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=4 + local.get $0 + i32.const 1952 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1984 + i32.store offset=8 + i32.const 1984 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1984 + i32.store offset=4 + local.get $0 + i32.const 1984 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + ) +) diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts new file mode 100644 index 0000000000..3184b68c42 --- /dev/null +++ b/tests/compiler/std/uri.ts @@ -0,0 +1,15 @@ +// not escaped +assert(encodeURIComponent("") == ""); +assert(encodeURIComponent("a") == "a"); +assert(encodeURIComponent("a1") == "a1"); +assert(encodeURIComponent("ab_") == "ab_"); +assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); + +// // escaped +// assert(encodeURIComponent("+") == "%2B"); +// assert(encodeURIComponent("?+") == "%3F%2B"); +// assert(encodeURIComponent("-?1.-") == "-%3F1.-"); +// assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); + +// assert(encodeURIComponent("\uD800")); // malformed URI sequence +// assert(encodeURIComponent("\uDFFF")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat new file mode 100644 index 0000000000..c6ecd593db --- /dev/null +++ b/tests/compiler/std/uri.untouched.wat @@ -0,0 +1,4382 @@ +(module + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_=>_none (func (param i32))) + (type $none_=>_none (func)) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (memory $0 1) + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 208) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 236) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 444) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\01\01\01\01\00\00\01\01\00\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\01") + (data (i32.const 572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\"\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 636) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 700) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) "0123456789ABCDEF") + (data (i32.const 796) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 844) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") + (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") + (data (i32.const 940) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") + (data (i32.const 1040) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (table $0 1 funcref) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) + (global $~lib/util/uri/HEX_CHARS i32 (i32.const 780)) + (global $~lib/rt/__rtti_base i32 (i32.const 1040)) + (global $~lib/memory/__data_end i32 (i32.const 1068)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17452)) + (global $~lib/memory/__heap_base i32 (i32.const 17452)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/string/String#get:length (param $0 i32) (result i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + ) + (func $~lib/rt/itcms/Object#set:nextWithColor (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#set:prev (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=8 + ) + (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) + local.get $0 + local.get $0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $0 + local.get $0 + call $~lib/rt/itcms/Object#set:prev + local.get $0 + ) + (func $~lib/rt/itcms/Object#get:next (param $0 i32) (result i32) + local.get $0 + i32.load offset=4 + i32.const 3 + i32.const -1 + i32.xor + i32.and + ) + (func $~lib/rt/itcms/Object#get:color (param $0 i32) (result i32) + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + ) + (func $~lib/rt/itcms/visitRoots (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + call $~lib/rt/__visit_globals + global.get $~lib/rt/itcms/pinSpace + local.set $1 + local.get $1 + call $~lib/rt/itcms/Object#get:next + local.set $2 + loop $while-continue|0 + local.get $2 + local.get $1 + i32.ne + local.set $3 + local.get $3 + if + i32.const 1 + drop + local.get $2 + call $~lib/rt/itcms/Object#get:color + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 159 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 20 + i32.add + local.get $0 + call $~lib/rt/__visit_members + local.get $2 + call $~lib/rt/itcms/Object#get:next + local.set $2 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#set:color (param $0 i32) (param $1 i32) + local.get $0 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $1 + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#set:next (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#unlink (param $0 i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/rt/itcms/Object#get:next + local.set $1 + local.get $1 + i32.const 0 + i32.eq + if + i32.const 1 + drop + local.get $0 + i32.load offset=8 + i32.const 0 + i32.eq + if (result i32) + local.get $0 + global.get $~lib/memory/__heap_base + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 127 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + return + end + local.get $0 + i32.load offset=8 + local.set $2 + i32.const 1 + drop + local.get $2 + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 131 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + call $~lib/rt/itcms/Object#set:prev + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:next + ) + (func $~lib/rt/__typeinfo (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/rt/__rtti_base + local.set $1 + local.get $0 + local.get $1 + i32.load + i32.gt_u + if + i32.const 256 + i32.const 320 + i32.const 22 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $0 + i32.const 8 + i32.mul + i32.add + i32.load + ) + (func $~lib/rt/itcms/Object#get:isPointerfree (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.load offset=12 + local.set $1 + local.get $1 + i32.const 1 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + call $~lib/rt/__typeinfo + i32.const 32 + i32.and + i32.const 0 + i32.ne + end + ) + (func $~lib/rt/itcms/Object#linkTo (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + local.get $1 + i32.load offset=8 + local.set $3 + local.get $0 + local.get $1 + local.get $2 + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $0 + local.get $3 + call $~lib/rt/itcms/Object#set:prev + local.get $3 + local.get $0 + call $~lib/rt/itcms/Object#set:next + local.get $1 + local.get $0 + call $~lib/rt/itcms/Object#set:prev + ) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) + (local $1 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load offset=8 + local.tee $1 + i32.eqz + if (result i32) + i32.const 0 + i32.const 128 + i32.const 147 + i32.const 30 + call $~lib/builtins/abort + unreachable + else + local.get $1 + end + global.set $~lib/rt/itcms/iter + end + local.get $0 + call $~lib/rt/itcms/Object#unlink + local.get $0 + global.get $~lib/rt/itcms/toSpace + local.get $0 + call $~lib/rt/itcms/Object#get:isPointerfree + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/rt/itcms/__visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.eqz + if + return + end + local.get $0 + i32.const 20 + i32.sub + local.set $2 + i32.const 0 + drop + local.get $2 + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $2 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/itcms/visitStack (param $0 i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + local.set $1 + loop $while-continue|0 + local.get $1 + global.get $~lib/memory/__heap_base + i32.lt_u + local.set $2 + local.get $2 + if + local.get $1 + i32.load + local.get $0 + call $~lib/rt/itcms/__visit + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#get:size (param $0 i32) (result i32) + i32.const 4 + local.get $0 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + ) + (func $~lib/rt/tlsf/Root#set:flMap (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store + ) + (func $~lib/rt/common/BLOCK#set:mmInfo (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store + ) + (func $~lib/rt/tlsf/Block#set:prev (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=4 + ) + (func $~lib/rt/tlsf/Block#set:next (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=8 + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + local.get $1 + i32.load + local.set $2 + i32.const 1 + drop + local.get $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 273 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $3 + i32.const 1 + drop + local.get $3 + i32.const 12 + i32.ge_u + if (result i32) + local.get $3 + i32.const 1073741820 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 275 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $4 + local.get $3 + i32.const 4 + i32.shr_u + local.set $5 + else + i32.const 31 + local.get $3 + i32.clz + i32.sub + local.set $4 + local.get $3 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $5 + local.get $4 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $4 + end + i32.const 1 + drop + local.get $4 + i32.const 23 + i32.lt_u + if (result i32) + local.get $5 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 288 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=4 + local.set $6 + local.get $1 + i32.load offset=8 + local.set $7 + local.get $6 + if + local.get $6 + local.get $7 + call $~lib/rt/tlsf/Block#set:next + end + local.get $7 + if + local.get $7 + local.get $6 + call $~lib/rt/tlsf/Block#set:prev + end + local.get $1 + local.get $0 + local.set $10 + local.get $4 + local.set $9 + local.get $5 + local.set $8 + local.get $10 + local.get $9 + i32.const 4 + i32.shl + local.get $8 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + i32.eq + if + local.get $0 + local.set $11 + local.get $4 + local.set $10 + local.get $5 + local.set $9 + local.get $7 + local.set $8 + local.get $11 + local.get $10 + i32.const 4 + i32.shl + local.get $9 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $8 + i32.store offset=96 + local.get $7 + i32.eqz + if + local.get $0 + local.set $9 + local.get $4 + local.set $8 + local.get $9 + local.get $8 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.set $9 + local.get $0 + local.set $8 + local.get $4 + local.set $11 + local.get $9 + i32.const 1 + local.get $5 + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $9 + local.set $10 + local.get $8 + local.get $11 + i32.const 2 + i32.shl + i32.add + local.get $10 + i32.store offset=4 + local.get $9 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $4 + i32.shl + i32.const -1 + i32.xor + i32.and + call $~lib/rt/tlsf/Root#set:flMap + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $13 i32) + i32.const 1 + drop + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.set $2 + i32.const 1 + drop + local.get $2 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.set $3 + local.get $3 + i32.const 4 + i32.add + local.get $3 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $4 + local.get $4 + i32.load + local.set $5 + local.get $5 + i32.const 1 + i32.and + if + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.add + local.get $5 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $3 + local.get $3 + i32.const 1073741820 + i32.lt_u + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $2 + i32.const 3 + i32.and + local.get $3 + i32.or + local.tee $2 + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + local.set $6 + local.get $6 + i32.const 4 + i32.add + local.get $6 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $4 + local.get $4 + i32.load + local.set $5 + end + end + local.get $2 + i32.const 2 + i32.and + if + local.get $1 + local.set $6 + local.get $6 + i32.const 4 + i32.sub + i32.load + local.set $6 + local.get $6 + i32.load + local.set $3 + i32.const 1 + drop + local.get $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 224 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.add + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.set $7 + local.get $7 + i32.const 1073741820 + i32.lt_u + if + local.get $0 + local.get $6 + call $~lib/rt/tlsf/removeBlock + local.get $6 + local.get $3 + i32.const 3 + i32.and + local.get $7 + i32.or + local.tee $2 + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $6 + local.set $1 + end + end + local.get $4 + local.get $5 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $2 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $8 + i32.const 1 + drop + local.get $8 + i32.const 12 + i32.ge_u + if (result i32) + local.get $8 + i32.const 1073741820 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 239 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + drop + local.get $1 + i32.const 4 + i32.add + local.get $8 + i32.add + local.get $4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 240 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $8 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $9 + local.get $8 + i32.const 4 + i32.shr_u + local.set $10 + else + i32.const 31 + local.get $8 + i32.clz + i32.sub + local.set $9 + local.get $8 + local.get $9 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $10 + local.get $9 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $9 + end + i32.const 1 + drop + local.get $9 + i32.const 23 + i32.lt_u + if (result i32) + local.get $10 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 256 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $7 + local.get $9 + local.set $3 + local.get $10 + local.set $6 + local.get $7 + local.get $3 + i32.const 4 + i32.shl + local.get $6 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $11 + local.get $1 + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $1 + local.get $11 + call $~lib/rt/tlsf/Block#set:next + local.get $11 + if + local.get $11 + local.get $1 + call $~lib/rt/tlsf/Block#set:prev + end + local.get $0 + local.set $12 + local.get $9 + local.set $7 + local.get $10 + local.set $3 + local.get $1 + local.set $6 + local.get $12 + local.get $7 + i32.const 4 + i32.shl + local.get $3 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $9 + i32.shl + i32.or + call $~lib/rt/tlsf/Root#set:flMap + local.get $0 + local.set $13 + local.get $9 + local.set $12 + local.get $0 + local.set $3 + local.get $9 + local.set $6 + local.get $3 + local.get $6 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 1 + local.get $10 + i32.shl + i32.or + local.set $7 + local.get $13 + local.get $12 + i32.const 2 + i32.shl + i32.add + local.get $7 + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + i32.const 1 + drop + local.get $1 + local.get $2 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 381 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $2 + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $2 + local.get $0 + local.set $3 + local.get $3 + i32.load offset=1568 + local.set $4 + i32.const 0 + local.set $5 + local.get $4 + if + i32.const 1 + drop + local.get $1 + local.get $4 + i32.const 4 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 388 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 16 + i32.sub + local.get $4 + i32.eq + if + local.get $1 + i32.const 16 + i32.sub + local.set $1 + local.get $4 + i32.load + local.set $5 + else + nop + end + else + i32.const 1 + drop + local.get $1 + local.get $0 + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 401 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + local.get $1 + i32.sub + local.set $6 + local.get $6 + i32.const 4 + i32.const 12 + i32.add + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + return + end + local.get $6 + i32.const 2 + i32.const 4 + i32.mul + i32.sub + local.set $7 + local.get $1 + local.set $8 + local.get $8 + local.get $7 + i32.const 1 + i32.or + local.get $5 + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $8 + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $8 + i32.const 0 + call $~lib/rt/tlsf/Block#set:next + local.get $1 + i32.const 4 + i32.add + local.get $7 + i32.add + local.set $4 + local.get $4 + i32.const 0 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $0 + local.set $9 + local.get $4 + local.set $3 + local.get $9 + local.get $3 + i32.store offset=1568 + local.get $0 + local.get $8 + call $~lib/rt/tlsf/insertBlock + i32.const 1 + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + i32.const 0 + drop + global.get $~lib/memory/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $0 + memory.size + local.set $1 + local.get $0 + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $2 + local.get $2 + local.get $1 + i32.gt_s + if (result i32) + local.get $2 + local.get $1 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $0 + local.set $3 + local.get $3 + i32.const 0 + call $~lib/rt/tlsf/Root#set:flMap + local.get $3 + local.set $5 + i32.const 0 + local.set $4 + local.get $5 + local.get $4 + i32.store offset=1568 + i32.const 0 + local.set $5 + loop $for-loop|0 + local.get $5 + i32.const 23 + i32.lt_u + local.set $4 + local.get $4 + if + local.get $3 + local.set $8 + local.get $5 + local.set $7 + i32.const 0 + local.set $6 + local.get $8 + local.get $7 + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=4 + i32.const 0 + local.set $8 + loop $for-loop|1 + local.get $8 + i32.const 16 + i32.lt_u + local.set $7 + local.get $7 + if + local.get $3 + local.set $11 + local.get $5 + local.set $10 + local.get $8 + local.set $9 + i32.const 0 + local.set $6 + local.get $11 + local.get $10 + i32.const 4 + i32.shl + local.get $9 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $6 + i32.store offset=96 + local.get $8 + i32.const 1 + i32.add + local.set $8 + br $for-loop|1 + end + end + local.get $5 + i32.const 1 + i32.add + local.set $5 + br $for-loop|0 + end + end + local.get $0 + i32.const 1572 + i32.add + local.set $12 + i32.const 0 + drop + local.get $3 + local.get $12 + memory.size + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $3 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/checkUsedBlock (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 4 + i32.sub + local.set $1 + local.get $0 + i32.const 0 + i32.ne + if (result i32) + local.get $0 + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $1 + i32.load + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 565 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $1 + ) + (func $~lib/rt/tlsf/freeBlock (param $0 i32) (param $1 i32) + i32.const 0 + drop + local.get $1 + local.get $1 + i32.load + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/__free (param $0 i32) + local.get $0 + global.get $~lib/memory/__heap_base + i32.lt_u + if + return + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + call $~lib/rt/tlsf/checkUsedBlock + call $~lib/rt/tlsf/freeBlock + ) + (func $~lib/rt/itcms/free (param $0 i32) + local.get $0 + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $0 + i32.const 0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $0 + i32.const 0 + call $~lib/rt/itcms/Object#set:prev + else + global.get $~lib/rt/itcms/total + local.get $0 + call $~lib/rt/itcms/Object#get:size + i32.sub + global.set $~lib/rt/itcms/total + i32.const 0 + drop + local.get $0 + i32.const 4 + i32.add + call $~lib/rt/tlsf/__free + end + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + local.set $1 + local.get $1 + i32.const 0 + i32.eq + br_if $case0|0 + local.get $1 + i32.const 1 + i32.eq + br_if $case1|0 + local.get $1 + i32.const 2 + i32.eq + br_if $case2|0 + br $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + local.set $2 + local.get $2 + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $0 + call $~lib/rt/itcms/Object#get:color + local.get $1 + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + local.get $0 + call $~lib/rt/itcms/Object#get:next + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $0 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.eq + if + i32.const 0 + call $~lib/rt/itcms/visitStack + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + local.set $2 + local.get $2 + if + local.get $0 + call $~lib/rt/itcms/Object#get:color + local.get $1 + i32.ne + if + local.get $0 + local.get $1 + call $~lib/rt/itcms/Object#set:color + local.get $0 + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + end + local.get $0 + call $~lib/rt/itcms/Object#get:next + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $2 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $2 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $2 + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/iter + local.set $0 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 1 + drop + local.get $0 + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 228 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + call $~lib/rt/itcms/free + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:nextWithColor + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:prev + i32.const 0 + global.set $~lib/rt/itcms/state + br $break|0 + end + i32.const 0 + ) + (func $~lib/rt/itcms/interrupt + (local $0 i32) + (local $1 i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 1024 + i32.const 200 + i32.mul + i32.const 100 + i32.div_u + local.set $0 + loop $do-continue|0 + local.get $0 + call $~lib/rt/itcms/step + i32.sub + local.set $0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.eq + if + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + return + end + local.get $0 + i32.const 0 + i32.gt_s + local.set $1 + local.get $1 + br_if $do-continue|0 + end + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i32.const 1024 + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.mul + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + ) + (func $~lib/rt/tlsf/computeSize (param $0 i32) (result i32) + local.get $0 + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $0 + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + end + ) + (func $~lib/rt/tlsf/prepareSize (param $0 i32) (result i32) + local.get $0 + i32.const 1073741820 + i32.ge_u + if + i32.const 64 + i32.const 400 + i32.const 462 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $0 + call $~lib/rt/tlsf/computeSize + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $2 + local.get $1 + i32.const 4 + i32.shr_u + local.set $3 + else + local.get $1 + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $1 + end + local.set $4 + i32.const 31 + local.get $4 + i32.clz + i32.sub + local.set $2 + local.get $4 + local.get $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $3 + local.get $2 + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $2 + end + i32.const 1 + drop + local.get $2 + i32.const 23 + i32.lt_u + if (result i32) + local.get $3 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $5 + local.get $2 + local.set $4 + local.get $5 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const 0 + i32.const -1 + i32.xor + local.get $3 + i32.shl + i32.and + local.set $6 + i32.const 0 + local.set $7 + local.get $6 + i32.eqz + if + local.get $0 + i32.load + i32.const 0 + i32.const -1 + i32.xor + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.set $5 + local.get $5 + i32.eqz + if + i32.const 0 + local.set $7 + else + local.get $5 + i32.ctz + local.set $2 + local.get $0 + local.set $8 + local.get $2 + local.set $4 + local.get $8 + local.get $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.set $6 + i32.const 1 + drop + local.get $6 + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + i32.ctz + local.set $4 + local.get $9 + local.get $8 + i32.const 4 + i32.shl + local.get $4 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $7 + end + else + local.get $0 + local.set $9 + local.get $2 + local.set $8 + local.get $6 + i32.ctz + local.set $4 + local.get $9 + local.get $8 + i32.const 4 + i32.shl + local.get $4 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $7 + end + local.get $7 + ) + (func $~lib/rt/tlsf/growMemory (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + i32.const 0 + drop + local.get $1 + i32.const 536870910 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.const 1 + i32.sub + i32.add + local.set $1 + end + memory.size + local.set $2 + local.get $1 + i32.const 4 + local.get $2 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + local.get $0 + local.set $3 + local.get $3 + i32.load offset=1568 + i32.ne + i32.shl + i32.add + local.set $1 + local.get $1 + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $4 + local.get $2 + local.tee $3 + local.get $4 + local.tee $5 + local.get $3 + local.get $5 + i32.gt_s + select + local.set $6 + local.get $6 + memory.grow + i32.const 0 + i32.lt_s + if + local.get $4 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size + local.set $7 + local.get $0 + local.get $2 + i32.const 16 + i32.shl + local.get $7 + i32.const 16 + i32.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.set $3 + i32.const 1 + drop + local.get $2 + i32.const 4 + i32.add + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $2 + i32.sub + local.set $4 + local.get $4 + i32.const 4 + i32.const 12 + i32.add + i32.ge_u + if + local.get $1 + local.get $2 + local.get $3 + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + local.set $5 + local.get $5 + local.get $4 + i32.const 4 + i32.sub + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $0 + local.get $5 + call $~lib/rt/tlsf/insertBlock + else + local.get $1 + local.get $3 + i32.const 1 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + local.set $5 + local.get $5 + i32.const 4 + i32.add + local.get $5 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.get $1 + local.set $5 + local.get $5 + i32.const 4 + i32.add + local.get $5 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + i32.load + i32.const 2 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $1 + call $~lib/rt/tlsf/prepareSize + local.set $2 + local.get $0 + local.get $2 + call $~lib/rt/tlsf/searchBlock + local.set $3 + local.get $3 + i32.eqz + if + local.get $0 + local.get $2 + call $~lib/rt/tlsf/growMemory + local.get $0 + local.get $2 + call $~lib/rt/tlsf/searchBlock + local.set $3 + i32.const 1 + drop + local.get $3 + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 500 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + i32.const 1 + drop + local.get $3 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $2 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 400 + i32.const 502 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $3 + call $~lib/rt/tlsf/removeBlock + local.get $0 + local.get $3 + local.get $2 + call $~lib/rt/tlsf/prepareBlock + i32.const 0 + drop + local.get $3 + ) + (func $~lib/rt/tlsf/__alloc (param $0 i32) (result i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + ) + (func $~lib/rt/itcms/Object#set:rtId (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=12 + ) + (func $~lib/rt/itcms/Object#set:rtSize (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=16 + ) + (func $~lib/memory/memory.fill (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i64) + (local $10 i32) + block $~lib/util/memory/memset|inlined.0 + local.get $0 + local.set $5 + local.get $1 + local.set $4 + local.get $2 + local.set $3 + i32.const 0 + i32.const 1 + i32.gt_s + drop + local.get $3 + i32.eqz + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $3 + i32.add + i32.const 4 + i32.sub + local.set $6 + local.get $5 + local.get $4 + i32.store8 + local.get $6 + local.get $4 + i32.store8 offset=3 + local.get $3 + i32.const 2 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $4 + i32.store8 offset=1 + local.get $5 + local.get $4 + i32.store8 offset=2 + local.get $6 + local.get $4 + i32.store8 offset=2 + local.get $6 + local.get $4 + i32.store8 offset=1 + local.get $3 + i32.const 6 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $4 + i32.store8 offset=3 + local.get $6 + local.get $4 + i32.store8 + local.get $3 + i32.const 8 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + i32.const 0 + local.get $5 + i32.sub + i32.const 3 + i32.and + local.set $7 + local.get $5 + local.get $7 + i32.add + local.set $5 + local.get $3 + local.get $7 + i32.sub + local.set $3 + local.get $3 + i32.const -4 + i32.and + local.set $3 + i32.const -1 + i32.const 255 + i32.div_u + local.get $4 + i32.const 255 + i32.and + i32.mul + local.set $8 + local.get $5 + local.get $3 + i32.add + i32.const 28 + i32.sub + local.set $6 + local.get $5 + local.get $8 + i32.store + local.get $6 + local.get $8 + i32.store offset=24 + local.get $3 + i32.const 8 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $8 + i32.store offset=4 + local.get $5 + local.get $8 + i32.store offset=8 + local.get $6 + local.get $8 + i32.store offset=16 + local.get $6 + local.get $8 + i32.store offset=20 + local.get $3 + i32.const 24 + i32.le_u + if + br $~lib/util/memory/memset|inlined.0 + end + local.get $5 + local.get $8 + i32.store offset=12 + local.get $5 + local.get $8 + i32.store offset=16 + local.get $5 + local.get $8 + i32.store offset=20 + local.get $5 + local.get $8 + i32.store offset=24 + local.get $6 + local.get $8 + i32.store + local.get $6 + local.get $8 + i32.store offset=4 + local.get $6 + local.get $8 + i32.store offset=8 + local.get $6 + local.get $8 + i32.store offset=12 + i32.const 24 + local.get $5 + i32.const 4 + i32.and + i32.add + local.set $7 + local.get $5 + local.get $7 + i32.add + local.set $5 + local.get $3 + local.get $7 + i32.sub + local.set $3 + local.get $8 + i64.extend_i32_u + local.get $8 + i64.extend_i32_u + i64.const 32 + i64.shl + i64.or + local.set $9 + loop $while-continue|0 + local.get $3 + i32.const 32 + i32.ge_u + local.set $10 + local.get $10 + if + local.get $5 + local.get $9 + i64.store + local.get $5 + local.get $9 + i64.store offset=8 + local.get $5 + local.get $9 + i64.store offset=16 + local.get $5 + local.get $9 + i64.store offset=24 + local.get $3 + i32.const 32 + i32.sub + local.set $3 + local.get $5 + i32.const 32 + i32.add + local.set $5 + br $while-continue|0 + end + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 64 + i32.const 128 + i32.const 260 + i32.const 31 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + call $~lib/rt/itcms/interrupt + end + i32.const 16 + local.get $0 + i32.add + call $~lib/rt/tlsf/__alloc + i32.const 4 + i32.sub + local.set $2 + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:rtId + local.get $2 + local.get $0 + call $~lib/rt/itcms/Object#set:rtSize + local.get $2 + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $2 + call $~lib/rt/itcms/Object#get:size + i32.add + global.set $~lib/rt/itcms/total + local.get $2 + i32.const 20 + i32.add + local.set $3 + local.get $3 + i32.const 0 + local.get $0 + call $~lib/memory/memory.fill + local.get $3 + ) + (func $~lib/util/memory/memcpy (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + loop $while-continue|0 + local.get $2 + if (result i32) + local.get $1 + i32.const 3 + i32.and + else + i32.const 0 + end + local.set $5 + local.get $5 + if + local.get $0 + local.tee $6 + i32.const 1 + i32.add + local.set $0 + local.get $6 + local.get $1 + local.tee $6 + i32.const 1 + i32.add + local.set $1 + local.get $6 + i32.load8_u + i32.store8 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + br $while-continue|0 + end + end + local.get $0 + i32.const 3 + i32.and + i32.const 0 + i32.eq + if + loop $while-continue|1 + local.get $2 + i32.const 16 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.get $1 + i32.const 4 + i32.add + i32.load + i32.store + local.get $0 + i32.const 8 + i32.add + local.get $1 + i32.const 8 + i32.add + i32.load + i32.store + local.get $0 + i32.const 12 + i32.add + local.get $1 + i32.const 12 + i32.add + i32.load + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|1 + end + end + local.get $2 + i32.const 8 + i32.and + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.get $1 + i32.const 4 + i32.add + i32.load + i32.store + local.get $0 + i32.const 8 + i32.add + local.set $0 + local.get $1 + i32.const 8 + i32.add + local.set $1 + end + local.get $2 + i32.const 4 + i32.and + if + local.get $0 + local.get $1 + i32.load + i32.store + local.get $0 + i32.const 4 + i32.add + local.set $0 + local.get $1 + i32.const 4 + i32.add + local.set $1 + end + local.get $2 + i32.const 2 + i32.and + if + local.get $0 + local.get $1 + i32.load16_u + i32.store16 + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + end + local.get $2 + i32.const 1 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + return + end + local.get $2 + i32.const 32 + i32.ge_u + if + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 + local.get $0 + i32.const 3 + i32.and + local.set $5 + local.get $5 + i32.const 1 + i32.eq + br_if $case0|2 + local.get $5 + i32.const 2 + i32.eq + br_if $case1|2 + local.get $5 + i32.const 3 + i32.eq + br_if $case2|2 + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 3 + i32.sub + local.set $2 + loop $while-continue|3 + local.get $2 + i32.const 17 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $1 + i32.const 1 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 24 + i32.shr_u + local.get $4 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 5 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 24 + i32.shr_u + local.get $3 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 9 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 24 + i32.shr_u + local.get $4 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 13 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 24 + i32.shr_u + local.get $3 + i32.const 8 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|3 + end + end + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 2 + i32.sub + local.set $2 + loop $while-continue|4 + local.get $2 + i32.const 18 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $1 + i32.const 2 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 16 + i32.shr_u + local.get $4 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 6 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 16 + i32.shr_u + local.get $3 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 10 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 16 + i32.shr_u + local.get $4 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 14 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 16 + i32.shr_u + local.get $3 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|4 + end + end + br $break|2 + end + local.get $1 + i32.load + local.set $3 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $2 + i32.const 1 + i32.sub + local.set $2 + loop $while-continue|5 + local.get $2 + i32.const 19 + i32.ge_u + local.set $5 + local.get $5 + if + local.get $1 + i32.const 3 + i32.add + i32.load + local.set $4 + local.get $0 + local.get $3 + i32.const 8 + i32.shr_u + local.get $4 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 7 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 4 + i32.add + local.get $4 + i32.const 8 + i32.shr_u + local.get $3 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 11 + i32.add + i32.load + local.set $4 + local.get $0 + i32.const 8 + i32.add + local.get $3 + i32.const 8 + i32.shr_u + local.get $4 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 15 + i32.add + i32.load + local.set $3 + local.get $0 + i32.const 12 + i32.add + local.get $4 + i32.const 8 + i32.shr_u + local.get $3 + i32.const 24 + i32.shl + i32.or + i32.store + local.get $1 + i32.const 16 + i32.add + local.set $1 + local.get $0 + i32.const 16 + i32.add + local.set $0 + local.get $2 + i32.const 16 + i32.sub + local.set $2 + br $while-continue|5 + end + end + br $break|2 + end + end + local.get $2 + i32.const 16 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 8 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 4 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 2 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + local.get $2 + i32.const 1 + i32.and + if + local.get $0 + local.tee $5 + i32.const 1 + i32.add + local.set $0 + local.get $5 + local.get $1 + local.tee $5 + i32.const 1 + i32.add + local.set $1 + local.get $5 + i32.load8_u + i32.store8 + end + ) + (func $~lib/memory/memory.copy (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + block $~lib/util/memory/memmove|inlined.0 + local.get $0 + local.set $5 + local.get $1 + local.set $4 + local.get $2 + local.set $3 + local.get $5 + local.get $4 + i32.eq + if + br $~lib/util/memory/memmove|inlined.0 + end + i32.const 0 + i32.const 1 + i32.lt_s + drop + local.get $4 + local.get $5 + i32.sub + local.get $3 + i32.sub + i32.const 0 + local.get $3 + i32.const 1 + i32.shl + i32.sub + i32.le_u + if + local.get $5 + local.get $4 + local.get $3 + call $~lib/util/memory/memcpy + br $~lib/util/memory/memmove|inlined.0 + end + local.get $5 + local.get $4 + i32.lt_u + if + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 7 + i32.and + local.get $5 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|0 + local.get $5 + i32.const 7 + i32.and + local.set $6 + local.get $6 + if + local.get $3 + i32.eqz + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $3 + i32.const 1 + i32.sub + local.set $3 + local.get $5 + local.tee $7 + i32.const 1 + i32.add + local.set $5 + local.get $7 + local.get $4 + local.tee $7 + i32.const 1 + i32.add + local.set $4 + local.get $7 + i32.load8_u + i32.store8 + br $while-continue|0 + end + end + loop $while-continue|1 + local.get $3 + i32.const 8 + i32.ge_u + local.set $6 + local.get $6 + if + local.get $5 + local.get $4 + i64.load + i64.store + local.get $3 + i32.const 8 + i32.sub + local.set $3 + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $4 + i32.const 8 + i32.add + local.set $4 + br $while-continue|1 + end + end + end + loop $while-continue|2 + local.get $3 + local.set $6 + local.get $6 + if + local.get $5 + local.tee $7 + i32.const 1 + i32.add + local.set $5 + local.get $7 + local.get $4 + local.tee $7 + i32.const 1 + i32.add + local.set $4 + local.get $7 + i32.load8_u + i32.store8 + local.get $3 + i32.const 1 + i32.sub + local.set $3 + br $while-continue|2 + end + end + else + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 7 + i32.and + local.get $5 + i32.const 7 + i32.and + i32.eq + if + loop $while-continue|3 + local.get $5 + local.get $3 + i32.add + i32.const 7 + i32.and + local.set $6 + local.get $6 + if + local.get $3 + i32.eqz + if + br $~lib/util/memory/memmove|inlined.0 + end + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $while-continue|3 + end + end + loop $while-continue|4 + local.get $3 + i32.const 8 + i32.ge_u + local.set $6 + local.get $6 + if + local.get $3 + i32.const 8 + i32.sub + local.set $3 + local.get $5 + local.get $3 + i32.add + local.get $4 + local.get $3 + i32.add + i64.load + i64.store + br $while-continue|4 + end + end + end + loop $while-continue|5 + local.get $3 + local.set $6 + local.get $6 + if + local.get $5 + local.get $3 + i32.const 1 + i32.sub + local.tee $3 + i32.add + local.get $4 + local.get $3 + i32.add + i32.load8_u + i32.store8 + br $while-continue|5 + end + end + end + end + ) + (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $0 + i32.const 20 + i32.sub + local.set $2 + local.get $1 + local.get $2 + i32.load + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/Object#set:rtSize + local.get $0 + return + end + local.get $1 + local.get $2 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.set $3 + local.get $3 + local.get $0 + local.get $1 + local.tee $4 + local.get $2 + i32.load offset=16 + local.tee $5 + local.get $4 + local.get $5 + i32.lt_u + select + call $~lib/memory/memory.copy + local.get $3 + ) + (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + global.get $~lib/util/uri/HEX_CHARS + local.get $2 + i32.const 4 + i32.shr_u + i32.const 15 + i32.and + i32.add + i32.load8_u + global.get $~lib/util/uri/HEX_CHARS + local.get $2 + i32.const 0 + i32.shr_u + i32.const 15 + i32.and + i32.add + i32.load8_u + i32.const 16 + i32.shl + i32.or + local.set $3 + local.get $0 + local.get $1 + i32.add + i32.const 37 + i32.store16 + local.get $0 + local.get $1 + i32.add + local.get $3 + i32.store offset=2 + local.get $1 + i32.const 3 + i32.const 1 + i32.shl + i32.add + ) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + i32.const 0 + local.set $4 + i32.const 0 + local.set $6 + local.get $2 + local.set $7 + loop $while-continue|0 + local.get $4 + local.get $2 + i32.lt_s + local.set $8 + local.get $8 + if + local.get $4 + local.set $5 + block $do-break|1 + loop $do-continue|1 + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $9 + local.get $9 + i32.const 128 + i32.lt_u + if + local.get $3 + local.get $9 + i32.add + i32.load8_u + i32.eqz + if + br $do-break|1 + end + else + br $do-break|1 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $4 + local.get $2 + i32.lt_s + local.set $11 + local.get $11 + br_if $do-continue|1 + end + end + local.get $6 + local.get $7 + i32.const 1 + i32.shl + i32.ge_u + if + local.get $7 + i32.const 12 + i32.mul + i32.const 10 + i32.div_s + local.set $7 + local.get $0 + local.get $7 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $4 + local.get $5 + i32.gt_s + if + local.get $4 + local.get $5 + i32.sub + i32.const 1 + i32.shl + local.set $11 + local.get $0 + local.get $6 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + local.get $11 + call $~lib/memory/memory.copy + local.get $6 + local.get $11 + i32.add + local.set $6 + end + local.get $9 + i32.const 56320 + i32.ge_u + if (result i32) + local.get $9 + i32.const 57343 + i32.le_u + else + i32.const 0 + end + if + i32.const 592 + i32.const 656 + i32.const 79 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 55296 + i32.ge_u + if (result i32) + local.get $9 + i32.const 56319 + i32.le_u + else + i32.const 0 + end + if + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $10 + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $10 + i32.const 56320 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $10 + i32.const 57343 + i32.gt_u + end + if + i32.const 720 + i32.const 656 + i32.const 86 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + local.get $10 + i32.const 1023 + i32.and + i32.or + i32.const 65536 + i32.add + local.set $9 + end + local.get $9 + i32.const 128 + i32.lt_u + if + local.get $6 + local.get $0 + local.get $6 + local.get $9 + call $~lib/util/uri/storeHex + i32.add + local.set $6 + else + local.get $9 + i32.const 2048 + i32.le_u + if + local.get $6 + local.get $0 + local.get $6 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $6 + else + local.get $9 + i32.const 65536 + i32.lt_u + if + local.get $6 + local.get $0 + local.get $6 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $6 + else + local.get $6 + local.get $0 + local.get $6 + local.get $9 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $6 + local.get $6 + local.get $0 + local.get $6 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $6 + end + local.get $6 + local.get $0 + local.get $6 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $6 + end + end + br $while-continue|0 + end + end + ) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + global.get $~lib/util/uri/URL_SAFE + call $~lib/util/uri/encode + local.get $2 + ) + (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $5 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $6 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-continue|0 + local.get $5 + i64.load + local.get $6 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 + i32.sub + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + local.set $7 + local.get $7 + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $4 + local.tee $7 + i32.const 1 + i32.sub + local.set $4 + local.get $7 + local.set $7 + local.get $7 + if + local.get $5 + i32.load16_u + local.set $8 + local.get $6 + i32.load16_u + local.set $9 + local.get $8 + local.get $9 + i32.ne + if + local.get $8 + local.get $9 + i32.sub + return + end + local.get $5 + i32.const 2 + i32.add + local.set $5 + local.get $6 + i32.const 2 + i32.add + local.set $6 + br $while-continue|1 + end + end + i32.const 0 + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $0 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + return + end + local.get $0 + call $~lib/string/String#get:length + local.set $2 + local.get $2 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $2 + call $~lib/util/string/compareImpl + i32.eqz + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + i32.const 256 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 64 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + unreachable + ) + (func $~start + call $start:std/uri + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 17472 + i32.const 17520 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 176 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 208 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 352 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 2 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 864 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 864 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 3 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 896 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 896 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 4 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 928 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 928 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 960 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 960 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + ) +) From 1e4eed8158f58a6a0ae56af9ecbc644c39081b60 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 20:56:10 +0200 Subject: [PATCH 22/87] refactor --- std/assembly/util/uri.ts | 12 ++++++------ tests/compiler/std/uri.untouched.wat | 5 ++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index eacacbd677..ab6d35ad50 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -28,13 +28,13 @@ import { CharCode } from "./string"; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 ]); -// @ts-ignore: decorator -@lazy const HEX_CHARS = memory.data([ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 -]); - function storeHex(dst: usize, offset: usize, ch: u32): usize { + // @ts-ignore: decorator + const HEX_CHARS = memory.data([ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 + ]); + let hex = ( (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index c6ecd593db..a860b4b22c 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -45,7 +45,6 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/util/uri/HEX_CHARS i32 (i32.const 780)) (global $~lib/rt/__rtti_base i32 (i32.const 1040)) (global $~lib/memory/__data_end i32 (i32.const 1068)) (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17452)) @@ -3673,7 +3672,7 @@ ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - global.get $~lib/util/uri/HEX_CHARS + i32.const 780 local.get $2 i32.const 4 i32.shr_u @@ -3681,7 +3680,7 @@ i32.and i32.add i32.load8_u - global.get $~lib/util/uri/HEX_CHARS + i32.const 780 local.get $2 i32.const 0 i32.shr_u From 281011910cdbc884372588e5f0114c5fcdb0e17e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Wed, 17 Mar 2021 21:11:32 +0200 Subject: [PATCH 23/87] more --- std/assembly/util/uri.ts | 8 +- tests/compiler/std/uri.optimized.wat | 392 +++++++++++++------------- tests/compiler/std/uri.untouched.wat | 396 ++++++++++++++------------- 3 files changed, 404 insertions(+), 392 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index ab6d35ad50..2394adcb81 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -45,10 +45,9 @@ function storeHex(dst: usize, offset: usize, ch: u32): usize { } export function encode(dst: usize, src: usize, len: isize, table: usize): void { - var i: isize = 0, org: isize, offset: usize = 0; - var outLen = len; + var i: isize = 0, offset: usize = 0, outLen = len; while (i < len) { - org = i; + let org = i; let c: u32, c1: u32; do { c = load(src + (i << 1)); @@ -70,11 +69,10 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): void { src + (org << 1), size ); + if (i >= len) break; offset += size; } - // if (i >= len) break; - if (c >= 0xDC00 && c <= 0xDFFF) { throw new Error("invalid character"); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 7b4ba062cd..85a37760a9 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1961,231 +1961,249 @@ local.get $5 i32.gt_s if - local.get $5 - local.set $8 - loop $do-continue|1 - block $do-break|1 + block $while-break|0 + local.get $5 + local.set $8 + loop $do-continue|1 + block $do-break|1 + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $4 + i32.const 128 + i32.ge_u + br_if $do-break|1 + local.get $4 + i32.const 1468 + i32.add + i32.load8_u + i32.eqz + br_if $do-break|1 + local.get $2 + local.get $5 + i32.const 1 + i32.add + local.tee $5 + i32.gt_s + br_if $do-continue|1 + end + end + local.get $3 + local.get $7 + i32.const 1 + i32.shl + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/__renew + local.get $7 + i32.const 12 + i32.mul + i32.const 10 + i32.div_s + local.tee $7 + i32.const 1 + i32.shl + local.tee $9 + local.get $0 + i32.const 20 + i32.sub + local.tee $10 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $10 + local.get $9 + i32.store offset=16 + br $__inlined_func$~lib/rt/itcms/__renew + end + local.get $9 + local.get $10 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $6 + local.get $0 + local.get $9 + local.get $10 + i32.load offset=16 + local.tee $0 + local.get $0 + local.get $9 + i32.gt_u + select + call $~lib/memory/memory.copy + local.get $6 + local.set $0 + end + end + local.get $5 + local.get $8 + i32.gt_s + if + local.get $0 + local.get $3 + i32.add local.get $1 - local.get $5 + local.get $8 i32.const 1 i32.shl i32.add - i32.load16_u - local.tee $4 - i32.const 128 - i32.ge_u - br_if $do-break|1 - local.get $4 - i32.const 1468 - i32.add - i32.load8_u - i32.eqz - br_if $do-break|1 - local.get $2 local.get $5 - i32.const 1 - i32.add - local.tee $5 - i32.gt_s - br_if $do-continue|1 - end - end - local.get $3 - local.get $7 - i32.const 1 - i32.shl - i32.ge_u - if - block $__inlined_func$~lib/rt/itcms/__renew - local.get $7 - i32.const 12 - i32.mul - i32.const 10 - i32.div_s - local.tee $7 + local.get $8 + i32.sub i32.const 1 i32.shl - local.tee $9 - local.get $0 - i32.const 20 - i32.sub - local.tee $10 - i32.load - i32.const -4 - i32.and - i32.const 16 - i32.sub - i32.le_u - if - local.get $10 - local.get $9 - i32.store offset=16 - br $__inlined_func$~lib/rt/itcms/__renew - end - local.get $9 - local.get $10 - i32.load offset=12 - call $~lib/rt/itcms/__new local.tee $6 - local.get $0 - local.get $9 - local.get $10 - i32.load offset=16 - local.tee $0 - local.get $0 - local.get $9 - i32.gt_u - select call $~lib/memory/memory.copy + local.get $2 + local.get $5 + i32.le_s + br_if $while-break|0 + local.get $3 local.get $6 - local.set $0 + i32.add + local.set $3 end - end - local.get $5 - local.get $8 - i32.gt_s - if - local.get $0 - local.get $3 - i32.add - local.get $1 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $5 - local.get $8 - i32.sub - i32.const 1 - i32.shl - local.tee $6 - call $~lib/memory/memory.copy - local.get $3 - local.get $6 - i32.add - local.set $3 - end - local.get $4 - i32.const 57343 - i32.le_u - i32.const 0 - local.get $4 - i32.const 56320 - i32.ge_u - select - if - i32.const 1616 - i32.const 1680 - i32.const 79 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $4 - i32.const 56319 - i32.le_u - i32.const 0 - local.get $4 - i32.const 55296 - i32.ge_u - select - if - local.get $1 - local.get $5 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $6 - local.get $5 - i32.const 1 - i32.add - local.set $5 - i32.const 1 - local.get $6 + local.get $4 i32.const 57343 - i32.gt_u - local.get $6 + i32.le_u + i32.const 0 + local.get $4 i32.const 56320 - i32.lt_u + i32.ge_u select if - i32.const 1744 + i32.const 1616 i32.const 1680 - i32.const 86 - i32.const 9 + i32.const 77 + i32.const 7 call $~lib/builtins/abort unreachable end - local.get $6 - i32.const 1023 - i32.and local.get $4 - i32.const 1023 - i32.and - i32.const 10 - i32.shl - i32.or - i32.const 65536 - i32.add - local.set $4 - end - local.get $4 - i32.const 128 - i32.lt_u - if (result i32) - local.get $0 - local.get $3 + i32.const 56319 + i32.le_u + i32.const 0 local.get $4 - call $~lib/util/uri/storeHex - local.get $3 - i32.add - else + i32.const 55296 + i32.ge_u + select + if + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $6 + local.get $5 + i32.const 1 + i32.add + local.set $5 + i32.const 1 + local.get $6 + i32.const 57343 + i32.gt_u + local.get $6 + i32.const 56320 + i32.lt_u + select + if + i32.const 1744 + i32.const 1680 + i32.const 84 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $6 + i32.const 1023 + i32.and + local.get $4 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + i32.or + i32.const 65536 + i32.add + local.set $4 + end local.get $4 - i32.const 2048 - i32.le_u + i32.const 128 + i32.lt_u if (result i32) local.get $0 local.get $3 local.get $4 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or call $~lib/util/uri/storeHex local.get $3 i32.add else local.get $4 - i32.const 65536 - i32.lt_u + i32.const 2048 + i32.le_u if (result i32) local.get $0 local.get $3 local.get $4 - i32.const 12 + i32.const 6 i32.shr_u - i32.const 224 + i32.const 192 i32.or call $~lib/util/uri/storeHex local.get $3 i32.add else - local.get $0 - local.get $3 local.get $4 - i32.const 18 - i32.shr_u - i32.const 240 - i32.or - call $~lib/util/uri/storeHex - local.get $3 - i32.add + i32.const 65536 + i32.lt_u + if (result i32) + local.get $0 + local.get $3 + local.get $4 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + local.get $3 + i32.add + else + local.get $0 + local.get $3 + local.get $4 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + call $~lib/util/uri/storeHex + local.get $3 + i32.add + local.tee $3 + local.get $0 + local.get $3 + local.get $4 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + end local.tee $3 local.get $0 local.get $3 local.get $4 - i32.const 12 + i32.const 6 i32.shr_u i32.const 63 i32.and @@ -2194,22 +2212,10 @@ call $~lib/util/uri/storeHex i32.add end - local.tee $3 - local.get $0 - local.get $3 - local.get $4 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - i32.add end + local.set $3 + br $while-continue|0 end - local.set $3 - br $while-continue|0 end end ) diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index a860b4b22c..a2c1a15ab6 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3720,229 +3720,250 @@ i32.const 0 local.set $4 i32.const 0 - local.set $6 + local.set $5 local.get $2 - local.set $7 - loop $while-continue|0 - local.get $4 - local.get $2 - i32.lt_s - local.set $8 - local.get $8 - if + local.set $6 + block $while-break|0 + loop $while-continue|0 local.get $4 - local.set $5 - block $do-break|1 - loop $do-continue|1 - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $9 - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $3 - local.get $9 + local.get $2 + i32.lt_s + local.set $7 + local.get $7 + if + local.get $4 + local.set $8 + block $do-break|1 + loop $do-continue|1 + local.get $1 + local.get $4 + i32.const 1 + i32.shl i32.add - i32.load8_u - i32.eqz + i32.load16_u + local.set $9 + local.get $9 + i32.const 128 + i32.lt_u if + local.get $3 + local.get $9 + i32.add + i32.load8_u + i32.eqz + if + br $do-break|1 + end + else br $do-break|1 end - else - br $do-break|1 + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $4 + local.get $2 + i32.lt_s + local.set $11 + local.get $11 + br_if $do-continue|1 end + end + local.get $5 + local.get $6 + i32.const 1 + i32.shl + i32.ge_u + if + local.get $6 + i32.const 12 + i32.mul + i32.const 10 + i32.div_s + local.set $6 + local.get $0 + local.get $6 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $4 + local.get $8 + i32.gt_s + if local.get $4 + local.get $8 + i32.sub i32.const 1 + i32.shl + local.set $11 + local.get $0 + local.get $5 i32.add - local.set $4 + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $11 + call $~lib/memory/memory.copy local.get $4 local.get $2 - i32.lt_s - local.set $11 + i32.ge_s + if + br $while-break|0 + end + local.get $5 local.get $11 - br_if $do-continue|1 + i32.add + local.set $5 end - end - local.get $6 - local.get $7 - i32.const 1 - i32.shl - i32.ge_u - if - local.get $7 - i32.const 12 - i32.mul - i32.const 10 - i32.div_s - local.set $7 - local.get $0 - local.get $7 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $4 - local.get $5 - i32.gt_s - if - local.get $4 - local.get $5 - i32.sub - i32.const 1 - i32.shl - local.set $11 - local.get $0 - local.get $6 - i32.add - local.get $1 - local.get $5 - i32.const 1 - i32.shl - i32.add - local.get $11 - call $~lib/memory/memory.copy - local.get $6 - local.get $11 - i32.add - local.set $6 - end - local.get $9 - i32.const 56320 - i32.ge_u - if (result i32) - local.get $9 - i32.const 57343 - i32.le_u - else - i32.const 0 - end - if - i32.const 592 - i32.const 656 - i32.const 79 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $9 - i32.const 55296 - i32.ge_u - if (result i32) local.get $9 - i32.const 56319 - i32.le_u - else - i32.const 0 - end - if - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $10 - local.get $4 - i32.const 1 - i32.add - local.set $4 - local.get $10 i32.const 56320 - i32.lt_u + i32.ge_u if (result i32) - i32.const 1 - else - local.get $10 + local.get $9 i32.const 57343 - i32.gt_u + i32.le_u + else + i32.const 0 end if - i32.const 720 + i32.const 592 i32.const 656 - i32.const 86 - i32.const 9 + i32.const 77 + i32.const 7 call $~lib/builtins/abort unreachable end local.get $9 - i32.const 1023 - i32.and - i32.const 10 - i32.shl - local.get $10 - i32.const 1023 - i32.and - i32.or - i32.const 65536 - i32.add - local.set $9 - end - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $6 - local.get $0 - local.get $6 - local.get $9 - call $~lib/util/uri/storeHex - i32.add - local.set $6 - else + i32.const 55296 + i32.ge_u + if (result i32) + local.get $9 + i32.const 56319 + i32.le_u + else + i32.const 0 + end + if + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $10 + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $10 + i32.const 56320 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $10 + i32.const 57343 + i32.gt_u + end + if + i32.const 720 + i32.const 656 + i32.const 84 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + local.get $10 + i32.const 1023 + i32.and + i32.or + i32.const 65536 + i32.add + local.set $9 + end local.get $9 - i32.const 2048 - i32.le_u + i32.const 128 + i32.lt_u if - local.get $6 + local.get $5 local.get $0 - local.get $6 + local.get $5 local.get $9 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or call $~lib/util/uri/storeHex i32.add - local.set $6 + local.set $5 else local.get $9 - i32.const 65536 - i32.lt_u + i32.const 2048 + i32.le_u if - local.get $6 + local.get $5 local.get $0 - local.get $6 + local.get $5 local.get $9 - i32.const 12 + i32.const 6 i32.shr_u - i32.const 224 + i32.const 192 i32.or call $~lib/util/uri/storeHex i32.add - local.set $6 + local.set $5 else - local.get $6 - local.get $0 - local.get $6 local.get $9 - i32.const 18 - i32.shr_u - i32.const 240 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $6 - local.get $6 + i32.const 65536 + i32.lt_u + if + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + else + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + end + local.get $5 local.get $0 - local.get $6 + local.get $5 local.get $9 - i32.const 12 + i32.const 6 i32.shr_u i32.const 63 i32.and @@ -3950,24 +3971,11 @@ i32.or call $~lib/util/uri/storeHex i32.add - local.set $6 + local.set $5 end - local.get $6 - local.get $0 - local.get $6 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $6 end + br $while-continue|0 end - br $while-continue|0 end end ) From 92ba20e34c8fe88e3f3dc28f0102922002c5777e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 19 Mar 2021 04:41:24 +0200 Subject: [PATCH 24/87] fix leaks --- std/assembly/uri.ts | 4 +- tests/compiler/std/uri.optimized.wat | 35 +++++++++++++++++ tests/compiler/std/uri.ts | 3 ++ tests/compiler/std/uri.untouched.wat | 58 ++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index 46bb0a3d94..600037a52a 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -3,7 +3,7 @@ import { encode, URI_SAFE, URL_SAFE } from "./util/uri"; export function encodeURI(str: string): string { var len = str.length; if (!len) return str; - var result = __new(len << 1, idof()); + var result = __new(len << 1, idof()); encode(result, changetype(str), len, URI_SAFE); return changetype(result); } @@ -11,7 +11,7 @@ export function encodeURI(str: string): string { export function encodeURIComponent(str: string): string { var len = str.length; if (!len) return str; - var result = __new(len << 1, idof()); + var result = __new(len << 1, idof()); encode(result, changetype(str), len, URL_SAFE); return changetype(result); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 85a37760a9..f806d67d7b 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2550,6 +2550,41 @@ call $~lib/builtins/abort unreachable end + i32.const 18476 + global.set $~lib/memory/__stack_pointer + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold global.get $~lib/memory/__stack_pointer i32.const 12 i32.add diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 3184b68c42..d78ca560e4 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -13,3 +13,6 @@ assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafg // assert(encodeURIComponent("\uD800")); // malformed URI sequence // assert(encodeURIComponent("\uDFFF")); // malformed URI sequence + +__stack_pointer = __heap_base; +__collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index a2c1a15ab6..f791456238 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4153,6 +4153,61 @@ call $~lib/util/string/compareImpl i32.eqz ) + (func $~lib/rt/itcms/__collect + (local $0 i32) + i32.const 0 + drop + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + local.set $0 + local.get $0 + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + local.set $0 + local.get $0 + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + i32.const 0 + if (result i32) + i32.const 1 + else + i32.const 0 + end + drop + ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) i32.const 256 @@ -4381,6 +4436,9 @@ call $~lib/builtins/abort unreachable end + global.get $~lib/memory/__heap_base + global.set $~lib/memory/__stack_pointer + call $~lib/rt/itcms/__collect global.get $~lib/memory/__stack_pointer i32.const 12 i32.add From 27f881bcd4aa814f207c86ca173d5c9178a02275 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 20 Mar 2021 02:21:15 +0200 Subject: [PATCH 25/87] wip --- std/assembly/util/uri.ts | 13 +- tests/compiler/std/uri.optimized.wat | 194 +++++++++++++++++---------- tests/compiler/std/uri.ts | 2 +- tests/compiler/std/uri.untouched.wat | 107 +++++++++++---- 4 files changed, 209 insertions(+), 107 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 2394adcb81..0b79d07684 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -57,12 +57,11 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): void { ++i; } while (i < len); - if (offset >= (outLen << 1)) { - outLen = outLen * 12 / 10; - dst = __renew(dst, outLen << 1); - } - if (i > org) { + if (offset >= (outLen << 1)) { + outLen = outLen * 12 / 10; + dst = __renew(dst, outLen << 1); + } let size = (i - org) << 1; memory.copy( dst + offset, @@ -87,6 +86,10 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): void { } if (c < 0x80) { + if (offset + 6 >= (outLen << 1)) { + outLen = outLen + 6 - 1; + dst = __renew(dst, outLen << 1); + } offset += storeHex(dst, offset, c); } else { if (c <= 0x800) { diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index f806d67d7b..29ba140040 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,8 +1,8 @@ (module (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_=>_none (func (param i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) @@ -40,7 +40,11 @@ (data (i32.const 1944) "\01\00\00\00\06\00\00\00a\00b\00_") (data (i32.const 1964) "\\") (data (i32.const 1976) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") - (data (i32.const 2064) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2060) "\1c") + (data (i32.const 2072) "\01\00\00\00\02\00\00\00+") + (data (i32.const 2092) "\1c") + (data (i32.const 2104) "\01\00\00\00\06\00\00\00%\002\00B") + (data (i32.const 2128) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -51,7 +55,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18476)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18540)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -180,7 +184,7 @@ if i32.const 0 local.get $0 - i32.const 18476 + i32.const 18540 i32.lt_u local.get $0 i32.load offset=8 @@ -226,7 +230,7 @@ i32.const 1 else local.get $1 - i32.const 2064 + i32.const 2128 i32.load i32.gt_u if @@ -240,7 +244,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2068 + i32.const 2132 i32.add i32.load i32.const 32 @@ -845,10 +849,10 @@ if unreachable end - i32.const 18480 + i32.const 18544 i32.const 0 i32.store - i32.const 20048 + i32.const 20112 i32.const 0 i32.store loop $for-loop|0 @@ -859,7 +863,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18480 + i32.const 18544 i32.add i32.const 0 i32.store offset=4 @@ -877,7 +881,7 @@ i32.add i32.const 2 i32.shl - i32.const 18480 + i32.const 18544 i32.add i32.const 0 i32.store offset=96 @@ -895,13 +899,13 @@ br $for-loop|0 end end - i32.const 18480 - i32.const 20052 + i32.const 18544 + i32.const 20116 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18480 + i32.const 18544 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -980,7 +984,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18476 + i32.const 18540 i32.lt_u if local.get $0 @@ -1070,7 +1074,7 @@ unreachable end local.get $0 - i32.const 18476 + i32.const 18540 i32.lt_u if local.get $0 @@ -1093,7 +1097,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18476 + i32.const 18540 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1913,6 +1917,44 @@ end end ) + (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $1 + local.get $0 + i32.const 20 + i32.sub + local.tee $2 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $2 + local.get $1 + i32.store offset=16 + local.get $0 + return + end + local.get $1 + local.get $2 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $3 + local.get $0 + local.get $1 + local.get $2 + i32.load offset=16 + local.tee $0 + local.get $0 + local.get $1 + i32.gt_u + select + call $~lib/memory/memory.copy + local.get $3 + ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) local.get $2 i32.const 4 @@ -1951,9 +1993,6 @@ (local $5 i32) (local $6 i32) (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) local.get $2 local.set $7 loop $while-continue|0 @@ -1963,7 +2002,7 @@ if block $while-break|0 local.get $5 - local.set $8 + local.set $6 loop $do-continue|1 block $do-break|1 local.get $1 @@ -1991,13 +2030,17 @@ br_if $do-continue|1 end end - local.get $3 - local.get $7 - i32.const 1 - i32.shl - i32.ge_u + local.get $5 + local.get $6 + i32.gt_s if - block $__inlined_func$~lib/rt/itcms/__renew + local.get $3 + local.get $7 + i32.const 1 + i32.shl + i32.ge_u + if + local.get $0 local.get $7 i32.const 12 i32.mul @@ -2006,56 +2049,19 @@ local.tee $7 i32.const 1 i32.shl - local.tee $9 - local.get $0 - i32.const 20 - i32.sub - local.tee $10 - i32.load - i32.const -4 - i32.and - i32.const 16 - i32.sub - i32.le_u - if - local.get $10 - local.get $9 - i32.store offset=16 - br $__inlined_func$~lib/rt/itcms/__renew - end - local.get $9 - local.get $10 - i32.load offset=12 - call $~lib/rt/itcms/__new - local.tee $6 - local.get $0 - local.get $9 - local.get $10 - i32.load offset=16 - local.tee $0 - local.get $0 - local.get $9 - i32.gt_u - select - call $~lib/memory/memory.copy - local.get $6 + call $~lib/rt/itcms/__renew local.set $0 end - end - local.get $5 - local.get $8 - i32.gt_s - if local.get $0 local.get $3 i32.add local.get $1 - local.get $8 + local.get $6 i32.const 1 i32.shl i32.add local.get $5 - local.get $8 + local.get $6 i32.sub i32.const 1 i32.shl @@ -2081,7 +2087,7 @@ if i32.const 1616 i32.const 1680 - i32.const 77 + i32.const 76 i32.const 7 call $~lib/builtins/abort unreachable @@ -2117,7 +2123,7 @@ if i32.const 1744 i32.const 1680 - i32.const 84 + i32.const 83 i32.const 9 call $~lib/builtins/abort unreachable @@ -2139,6 +2145,24 @@ i32.const 128 i32.lt_u if (result i32) + local.get $3 + i32.const 5 + i32.add + local.get $7 + i32.const 1 + i32.shl + i32.ge_u + if + local.get $0 + local.get $7 + i32.const 5 + i32.add + local.tee $7 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__renew + local.set $0 + end local.get $0 local.get $3 local.get $4 @@ -2397,11 +2421,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2092 + i32.const 2156 i32.lt_s if - i32.const 18496 - i32.const 18544 + i32.const 18560 + i32.const 18608 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2416,7 +2440,7 @@ memory.size i32.const 16 i32.shl - i32.const 18476 + i32.const 18540 i32.sub i32.const 1 i32.shr_u @@ -2550,7 +2574,31 @@ call $~lib/builtins/abort unreachable end - i32.const 18476 + global.get $~lib/memory/__stack_pointer + i32.const 2080 + i32.store offset=8 + i32.const 2080 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2112 + i32.store offset=4 + local.get $0 + i32.const 2112 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 9 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 18540 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index d78ca560e4..6cce3e7e55 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -6,7 +6,7 @@ assert(encodeURIComponent("ab_") == "ab_"); assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); // // escaped -// assert(encodeURIComponent("+") == "%2B"); +assert(encodeURIComponent("+") == "%2B"); // assert(encodeURIComponent("?+") == "%3F%2B"); // assert(encodeURIComponent("-?1.-") == "-%3F1.-"); // assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index f791456238..fbc19b0459 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -30,7 +30,9 @@ (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") (data (i32.const 940) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") - (data (i32.const 1040) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 1104) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -45,10 +47,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 1040)) - (global $~lib/memory/__data_end i32 (i32.const 1068)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17452)) - (global $~lib/memory/__heap_base i32 (i32.const 17452)) + (global $~lib/rt/__rtti_base i32 (i32.const 1104)) + (global $~lib/memory/__data_end i32 (i32.const 1132)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17516)) + (global $~lib/memory/__heap_base i32 (i32.const 17516)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3769,29 +3771,29 @@ br_if $do-continue|1 end end - local.get $5 - local.get $6 - i32.const 1 - i32.shl - i32.ge_u - if - local.get $6 - i32.const 12 - i32.mul - i32.const 10 - i32.div_s - local.set $6 - local.get $0 - local.get $6 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__renew - local.set $0 - end local.get $4 local.get $8 i32.gt_s if + local.get $5 + local.get $6 + i32.const 1 + i32.shl + i32.ge_u + if + local.get $6 + i32.const 12 + i32.mul + i32.const 10 + i32.div_s + local.set $6 + local.get $0 + local.get $6 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__renew + local.set $0 + end local.get $4 local.get $8 i32.sub @@ -3832,7 +3834,7 @@ if i32.const 592 i32.const 656 - i32.const 77 + i32.const 76 i32.const 7 call $~lib/builtins/abort unreachable @@ -3872,7 +3874,7 @@ if i32.const 720 i32.const 656 - i32.const 84 + i32.const 83 i32.const 9 call $~lib/builtins/abort unreachable @@ -3894,6 +3896,27 @@ i32.const 128 i32.lt_u if + local.get $5 + i32.const 5 + i32.add + local.get $6 + i32.const 1 + i32.shl + i32.ge_u + if + local.get $6 + i32.const 6 + i32.add + i32.const 1 + i32.sub + local.set $6 + local.get $0 + local.get $6 + i32.const 1 + i32.shl + call $~lib/rt/itcms/__renew + local.set $0 + end local.get $5 local.get $0 local.get $5 @@ -4258,8 +4281,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17472 - i32.const 17520 + i32.const 17536 + i32.const 17584 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4436,6 +4459,34 @@ call $~lib/builtins/abort unreachable end + i32.const 1056 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1088 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 9 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__heap_base global.set $~lib/memory/__stack_pointer call $~lib/rt/itcms/__collect From ece370cb232daaa9e2967c74f6a7ef35bd8b0a16 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 02:26:47 +0200 Subject: [PATCH 26/87] wip --- std/assembly/uri.ts | 4 +- std/assembly/util/uri.ts | 31 +- tests/compiler/std/uri.optimized.wat | 760 +++++++++---------- tests/compiler/std/uri.ts | 14 +- tests/compiler/std/uri.untouched.wat | 1028 ++++++++++++-------------- 5 files changed, 827 insertions(+), 1010 deletions(-) diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index 600037a52a..0340475674 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -4,7 +4,7 @@ export function encodeURI(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - encode(result, changetype(str), len, URI_SAFE); + result = encode(result, changetype(str), len, URI_SAFE); return changetype(result); } @@ -12,6 +12,6 @@ export function encodeURIComponent(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - encode(result, changetype(str), len, URL_SAFE); + result = encode(result, changetype(str), len, URL_SAFE); return changetype(result); } diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 0b79d07684..dfac655fcf 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -44,8 +44,8 @@ function storeHex(dst: usize, offset: usize, ch: u32): usize { return offset + (3 << 1); } -export function encode(dst: usize, src: usize, len: isize, table: usize): void { - var i: isize = 0, offset: usize = 0, outLen = len; +export function encode(dst: usize, src: usize, len: isize, table: usize): usize { + var i: isize = 0, offset: usize = 0, outSize = len << 1; while (i < len) { let org = i; let c: u32, c1: u32; @@ -58,18 +58,18 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): void { } while (i < len); if (i > org) { - if (offset >= (outLen << 1)) { - outLen = outLen * 12 / 10; - dst = __renew(dst, outLen << 1); - } let size = (i - org) << 1; + if (offset + size > outSize) { + outSize = offset + size; + dst = __renew(dst, outSize); + } memory.copy( dst + offset, - src + (org << 1), + src + (org << 1), size ); - if (i >= len) break; offset += size; + if (i >= len) break; } if (c >= 0xDC00 && c <= 0xDFFF) { @@ -85,11 +85,14 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): void { c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } + if (offset >= outSize) { + trace("offset", 1, offset); + trace("outSize", 1, outSize); + outSize = (offset + 6) * 12 / 10; + dst = __renew(dst, outSize); + } + if (c < 0x80) { - if (offset + 6 >= (outLen << 1)) { - outLen = outLen + 6 - 1; - dst = __renew(dst, outLen << 1); - } offset += storeHex(dst, offset, c); } else { if (c <= 0x800) { @@ -105,4 +108,8 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): void { } } } + if (outSize > offset) { + dst = __renew(dst, offset); + } + return dst; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 29ba140040..11ac8f6bab 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,17 +1,19 @@ (module + (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $none_=>_none (func)) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01") + (data (i32.const 1048) "\01\00\00\00\02\00\00\00+") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -29,22 +31,16 @@ (data (i32.const 1672) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") (data (i32.const 1724) "L") (data (i32.const 1736) "\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r") - (data (i32.const 1804) "0123456789ABCDEF") - (data (i32.const 1820) ",") - (data (i32.const 1832) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1868) "\1c") - (data (i32.const 1880) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1804) "\1c") + (data (i32.const 1816) "\01\00\00\00\0c\00\00\00o\00f\00f\00s\00e\00t") + (data (i32.const 1836) ",") + (data (i32.const 1848) "\01\00\00\00\0e\00\00\00o\00u\00t\00S\00i\00z\00e") + (data (i32.const 1884) "0123456789ABCDEF") (data (i32.const 1900) "\1c") - (data (i32.const 1912) "\01\00\00\00\04\00\00\00a\001") - (data (i32.const 1932) "\1c") - (data (i32.const 1944) "\01\00\00\00\06\00\00\00a\00b\00_") - (data (i32.const 1964) "\\") - (data (i32.const 1976) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") - (data (i32.const 2060) "\1c") - (data (i32.const 2072) "\01\00\00\00\02\00\00\00+") - (data (i32.const 2092) "\1c") - (data (i32.const 2104) "\01\00\00\00\06\00\00\00%\002\00B") - (data (i32.const 2128) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1912) "\01\00\00\00\06\00\00\00%\002\00B") + (data (i32.const 1932) ",") + (data (i32.const 1944) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1984) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -55,7 +51,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18540)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18396)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -184,7 +180,7 @@ if i32.const 0 local.get $0 - i32.const 18540 + i32.const 18396 i32.lt_u local.get $0 i32.load offset=8 @@ -230,7 +226,7 @@ i32.const 1 else local.get $1 - i32.const 2128 + i32.const 1984 i32.load i32.gt_u if @@ -244,7 +240,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2132 + i32.const 1988 i32.add i32.load i32.const 32 @@ -849,10 +845,10 @@ if unreachable end - i32.const 18544 + i32.const 18400 i32.const 0 i32.store - i32.const 20112 + i32.const 19968 i32.const 0 i32.store loop $for-loop|0 @@ -863,7 +859,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18544 + i32.const 18400 i32.add i32.const 0 i32.store offset=4 @@ -881,7 +877,7 @@ i32.add i32.const 2 i32.shl - i32.const 18544 + i32.const 18400 i32.add i32.const 0 i32.store offset=96 @@ -899,13 +895,13 @@ br $for-loop|0 end end - i32.const 18544 - i32.const 20116 + i32.const 18400 + i32.const 19972 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18544 + i32.const 18400 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -984,7 +980,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18540 + i32.const 18396 i32.lt_u if local.get $0 @@ -1074,7 +1070,7 @@ unreachable end local.get $0 - i32.const 18540 + i32.const 18396 i32.lt_u if local.get $0 @@ -1097,7 +1093,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18540 + i32.const 18396 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1961,13 +1957,13 @@ i32.shr_u i32.const 15 i32.and - i32.const 1804 + i32.const 1884 i32.add i32.load8_u local.get $2 i32.const 15 i32.and - i32.const 1804 + i32.const 1884 i32.add i32.load8_u i32.const 16 @@ -1987,100 +1983,149 @@ i32.const 6 i32.add ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + unreachable + ) + (func $~start + call $start:std/uri + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 2012 + i32.lt_s + if + i32.const 18416 + i32.const 18464 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) - local.get $2 - local.set $7 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $1 + i32.const 1 + i32.shl + local.set $6 loop $while-continue|0 - local.get $2 - local.get $5 + local.get $1 + local.get $3 i32.gt_s if block $while-break|0 - local.get $5 - local.set $6 + local.get $3 + local.set $4 loop $do-continue|1 block $do-break|1 - local.get $1 - local.get $5 + local.get $3 i32.const 1 i32.shl + i32.const 1056 i32.add i32.load16_u - local.tee $4 + local.tee $2 i32.const 128 i32.ge_u br_if $do-break|1 - local.get $4 + local.get $2 i32.const 1468 i32.add i32.load8_u i32.eqz br_if $do-break|1 - local.get $2 - local.get $5 + local.get $1 + local.get $3 i32.const 1 i32.add - local.tee $5 + local.tee $3 i32.gt_s br_if $do-continue|1 end end - local.get $5 - local.get $6 + local.get $3 + local.get $4 i32.gt_s if + local.get $6 + local.get $5 local.get $3 - local.get $7 + local.get $4 + i32.sub i32.const 1 i32.shl - i32.ge_u + local.tee $7 + i32.add + i32.lt_u if local.get $0 + local.get $5 local.get $7 - i32.const 12 - i32.mul - i32.const 10 - i32.div_s - local.tee $7 - i32.const 1 - i32.shl + i32.add + local.tee $6 call $~lib/rt/itcms/__renew local.set $0 end local.get $0 - local.get $3 + local.get $5 i32.add - local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.shl + i32.const 1056 i32.add - local.get $5 - local.get $6 - i32.sub - i32.const 1 - i32.shl - local.tee $6 + local.get $7 call $~lib/memory/memory.copy - local.get $2 local.get $5 + local.get $7 + i32.add + local.set $5 + local.get $1 + local.get $3 i32.le_s br_if $while-break|0 - local.get $3 - local.get $6 - i32.add - local.set $3 end - local.get $4 + local.get $2 i32.const 57343 i32.le_u i32.const 0 - local.get $4 + local.get $2 i32.const 56320 i32.ge_u select @@ -2092,31 +2137,31 @@ call $~lib/builtins/abort unreachable end - local.get $4 + local.get $2 i32.const 56319 i32.le_u i32.const 0 - local.get $4 + local.get $2 i32.const 55296 i32.ge_u select if - local.get $1 - local.get $5 + local.get $3 i32.const 1 i32.shl + i32.const 1056 i32.add i32.load16_u - local.set $6 - local.get $5 + local.set $4 + local.get $3 i32.const 1 i32.add - local.set $5 + local.set $3 i32.const 1 - local.get $6 + local.get $4 i32.const 57343 i32.gt_u - local.get $6 + local.get $4 i32.const 56320 i32.lt_u select @@ -2128,10 +2173,10 @@ call $~lib/builtins/abort unreachable end - local.get $6 + local.get $4 i32.const 1023 i32.and - local.get $4 + local.get $2 i32.const 1023 i32.and i32.const 10 @@ -2139,81 +2184,103 @@ i32.or i32.const 65536 i32.add - local.set $4 + local.set $2 end - local.get $4 + local.get $5 + local.get $6 + i32.ge_u + if + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store + i32.const 1824 + i32.const 1 + local.get $5 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store + i32.const 1856 + i32.const 1 + local.get $6 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + local.get $0 + local.get $6 + i32.const 6 + i32.add + i32.const 12 + i32.mul + i32.const 10 + i32.div_u + local.tee $6 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $2 i32.const 128 i32.lt_u if (result i32) - local.get $3 - i32.const 5 - i32.add - local.get $7 - i32.const 1 - i32.shl - i32.ge_u - if - local.get $0 - local.get $7 - i32.const 5 - i32.add - local.tee $7 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__renew - local.set $0 - end local.get $0 - local.get $3 - local.get $4 + local.get $5 + local.get $2 call $~lib/util/uri/storeHex - local.get $3 + local.get $5 i32.add else - local.get $4 + local.get $2 i32.const 2048 i32.le_u if (result i32) local.get $0 - local.get $3 - local.get $4 + local.get $5 + local.get $2 i32.const 6 i32.shr_u i32.const 192 i32.or call $~lib/util/uri/storeHex - local.get $3 + local.get $5 i32.add else - local.get $4 + local.get $2 i32.const 65536 i32.lt_u if (result i32) local.get $0 - local.get $3 - local.get $4 + local.get $5 + local.get $2 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $3 + local.get $5 i32.add else local.get $0 - local.get $3 - local.get $4 + local.get $5 + local.get $2 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex - local.get $3 + local.get $5 i32.add - local.tee $3 + local.tee $5 local.get $0 - local.get $3 - local.get $4 + local.get $5 + local.get $2 i32.const 12 i32.shr_u i32.const 63 @@ -2223,10 +2290,10 @@ call $~lib/util/uri/storeHex i32.add end - local.tee $3 + local.tee $5 local.get $0 - local.get $3 - local.get $4 + local.get $5 + local.get $2 i32.const 6 i32.shr_u i32.const 63 @@ -2237,200 +2304,37 @@ i32.add end end - local.set $3 + local.set $5 br $while-continue|0 end end end - ) - (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz + local.get $5 + local.get $6 + i32.lt_u if local.get $0 - return + local.get $5 + call $~lib/rt/itcms/__renew + local.set $0 end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.tee $2 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer local.get $0 - local.get $1 - call $~lib/util/uri/encode - local.get $2 ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (func $start:std/uri + (local $0 i32) + (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) - local.get $0 - local.get $1 - i32.eq - if - i32.const 1 - return - end - local.get $1 - i32.eqz - i32.const 1 - local.get $0 - select - if - i32.const 0 - return - end - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $2 - local.get $1 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - i32.ne - if - i32.const 0 - return - end - block $__inlined_func$~lib/util/string/compareImpl (result i32) - local.get $0 - local.tee $3 - i32.const 7 - i32.and - local.get $1 - i32.const 7 - i32.and - i32.or - i32.eqz - i32.const 0 - local.get $2 - local.tee $0 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $3 - i64.load - local.get $1 - i64.load - i64.eq - if - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $1 - i32.const 8 - i32.add - local.set $1 - local.get $0 - i32.const 4 - i32.sub - local.tee $0 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $0 - local.tee $2 - i32.const 1 - i32.sub - local.set $0 - local.get $2 - if - local.get $3 - i32.load16_u - local.tee $2 - local.get $1 - i32.load16_u - local.tee $4 - i32.ne - if - local.get $2 - local.get $4 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $3 - i32.const 2 - i32.add - local.set $3 - local.get $1 - i32.const 2 - i32.add - local.set $1 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz - ) - (func $~lib/rt/__visit_members (param $0 i32) - block $invalid - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid - end - return - end - return - end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - call $~lib/rt/itcms/__visit - end - return - end - unreachable - ) - (func $~start - call $start:std/uri - ) - (func $start:std/uri - (local $0 i32) - global.get $~lib/memory/__stack_pointer - i32.const 12 + global.get $~lib/memory/__stack_pointer + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 2156 - i32.lt_s - if - i32.const 18560 - i32.const 18608 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end + call $~stack_check global.get $~lib/memory/__stack_pointer i64.const 0 i64.store @@ -2440,7 +2344,7 @@ memory.size i32.const 16 i32.shl - i32.const 18540 + i32.const 18396 i32.sub i32.const 1 i32.shr_u @@ -2457,56 +2361,24 @@ global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 - i32.const 1056 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=4 - local.get $0 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 2 + block $__inlined_func$~lib/uri/encodeURIComponent (result i32) + i32.const 1056 + i32.const 1052 + i32.load i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1888 - i32.store offset=8 - i32.const 1888 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1888 - i32.store offset=4 - local.get $0 - i32.const 1888 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 3 + i32.shr_u + local.tee $1 + i32.eqz + br_if $__inlined_func$~lib/uri/encodeURIComponent + drop + local.get $1 i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $1 + call $~lib/util/uri/encode end - global.get $~lib/memory/__stack_pointer - i32.const 1920 - i32.store offset=8 - i32.const 1920 - call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -2514,91 +2386,119 @@ global.get $~lib/memory/__stack_pointer i32.const 1920 i32.store offset=4 - local.get $0 - i32.const 1920 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 4 + block $__inlined_func$~lib/string/String.__eq (result i32) i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1952 - i32.store offset=8 - i32.const 1952 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1952 - i32.store offset=4 - local.get $0 - i32.const 1952 - call $~lib/string/String.__eq - i32.eqz - if + local.get $0 + i32.const 1920 + i32.eq + br_if $__inlined_func$~lib/string/String.__eq + drop i32.const 0 - i32.const 1840 - i32.const 5 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1984 - i32.store offset=8 - i32.const 1984 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1984 - i32.store offset=4 - local.get $0 - i32.const 1984 - call $~lib/string/String.__eq - i32.eqz - if + local.get $0 + i32.eqz + br_if $__inlined_func$~lib/string/String.__eq + drop i32.const 0 - i32.const 1840 - i32.const 6 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shr_u + local.tee $1 + i32.const 1916 + i32.load + i32.const 1 + i32.shr_u + i32.ne + br_if $__inlined_func$~lib/string/String.__eq + drop + block $__inlined_func$~lib/util/string/compareImpl (result i32) + i32.const 1920 + local.set $3 + local.get $0 + local.tee $2 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $1 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $2 + i64.load + local.get $3 + i64.load + i64.eq + if + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $1 + i32.const 1 + i32.sub + local.set $0 + local.get $1 + if + local.get $2 + i32.load16_u + local.tee $4 + local.get $3 + i32.load16_u + local.tee $1 + i32.ne + if + local.get $4 + local.get $1 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $2 + i32.const 2 + i32.add + local.set $2 + local.get $3 + i32.const 2 + i32.add + local.set $3 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz end - global.get $~lib/memory/__stack_pointer - i32.const 2080 - i32.store offset=8 - i32.const 2080 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2112 - i32.store offset=4 - local.get $0 - i32.const 2112 - call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1840 - i32.const 9 + i32.const 1952 + i32.const 11 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 18540 + i32.const 18396 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -2615,12 +2515,12 @@ end call $~lib/rt/itcms/step drop - loop $while-continue|1 + loop $while-continue|12 global.get $~lib/rt/itcms/state if call $~lib/rt/itcms/step drop - br $while-continue|1 + br $while-continue|12 end end global.get $~lib/rt/itcms/total diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 6cce3e7e55..f544c67001 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -1,11 +1,13 @@ // not escaped -assert(encodeURIComponent("") == ""); -assert(encodeURIComponent("a") == "a"); -assert(encodeURIComponent("a1") == "a1"); -assert(encodeURIComponent("ab_") == "ab_"); -assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); -// // escaped +// assert(encodeURIComponent("") == ""); +// assert(encodeURIComponent("a") == "a"); +// assert(encodeURIComponent("a1") == "a1"); +// assert(encodeURIComponent("ab_") == "ab_"); +// assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); + +// escaped + assert(encodeURIComponent("+") == "%2B"); // assert(encodeURIComponent("?+") == "%3F%2B"); // assert(encodeURIComponent("-?1.-") == "-%3F1.-"); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index fbc19b0459..f6b1d28649 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -5,13 +5,16 @@ (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -24,15 +27,12 @@ (data (i32.const 572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\"\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 636) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 700) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) "0123456789ABCDEF") - (data (i32.const 796) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 844) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") - (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") - (data (i32.const 940) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") - (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") - (data (i32.const 1104) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00o\00f\00f\00s\00e\00t\00") + (data (i32.const 812) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00o\00u\00t\00S\00i\00z\00e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 860) "0123456789ABCDEF") + (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 908) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 960) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -47,10 +47,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 1104)) - (global $~lib/memory/__data_end i32 (i32.const 1132)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17516)) - (global $~lib/memory/__heap_base i32 (i32.const 17516)) + (global $~lib/rt/__rtti_base i32 (i32.const 960)) + (global $~lib/memory/__data_end i32 (i32.const 988)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17372)) + (global $~lib/memory/__heap_base i32 (i32.const 17372)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3674,7 +3674,7 @@ ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - i32.const 780 + i32.const 860 local.get $2 i32.const 4 i32.shr_u @@ -3682,7 +3682,7 @@ i32.and i32.add i32.load8_u - i32.const 780 + i32.const 860 local.get $2 i32.const 0 i32.shr_u @@ -3710,413 +3710,122 @@ i32.shl i32.add ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) - (local $4 i32) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + global.get $~lib/util/uri/URL_SAFE + call $~lib/util/uri/encode + local.set $2 + local.get $2 + ) + (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) (local $9 i32) - (local $10 i32) - (local $11 i32) - i32.const 0 - local.set $4 - i32.const 0 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add local.set $5 local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add local.set $6 - block $while-break|0 - loop $while-continue|0 - local.get $4 - local.get $2 - i32.lt_s - local.set $7 - local.get $7 - if - local.get $4 - local.set $8 - block $do-break|1 - loop $do-continue|1 - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $9 - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $3 - local.get $9 - i32.add - i32.load8_u - i32.eqz - if - br $do-break|1 - end - else - br $do-break|1 - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - local.get $4 - local.get $2 - i32.lt_s - local.set $11 - local.get $11 - br_if $do-continue|1 - end - end - local.get $4 - local.get $8 - i32.gt_s + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-continue|0 + local.get $5 + i64.load + local.get $6 + i64.load + i64.ne if - local.get $5 - local.get $6 - i32.const 1 - i32.shl - i32.ge_u - if - local.get $6 - i32.const 12 - i32.mul - i32.const 10 - i32.div_s - local.set $6 - local.get $0 - local.get $6 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $4 - local.get $8 - i32.sub - i32.const 1 - i32.shl - local.set $11 - local.get $0 - local.get $5 - i32.add - local.get $1 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $11 - call $~lib/memory/memory.copy - local.get $4 - local.get $2 - i32.ge_s - if - br $while-break|0 - end - local.get $5 - local.get $11 - i32.add - local.set $5 + br $do-break|0 end - local.get $9 - i32.const 56320 + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 + i32.sub + local.set $4 + local.get $4 + i32.const 4 i32.ge_u - if (result i32) - local.get $9 - i32.const 57343 - i32.le_u - else - i32.const 0 - end - if - i32.const 592 - i32.const 656 - i32.const 76 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $9 - i32.const 55296 - i32.ge_u - if (result i32) - local.get $9 - i32.const 56319 - i32.le_u - else - i32.const 0 - end - if - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $10 - local.get $4 - i32.const 1 - i32.add - local.set $4 - local.get $10 - i32.const 56320 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $10 - i32.const 57343 - i32.gt_u - end - if - i32.const 720 - i32.const 656 - i32.const 83 - i32.const 9 - call $~lib/builtins/abort - unreachable - end - local.get $9 - i32.const 1023 - i32.and - i32.const 10 - i32.shl - local.get $10 - i32.const 1023 - i32.and - i32.or - i32.const 65536 - i32.add - local.set $9 - end - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $5 - i32.const 5 - i32.add - local.get $6 - i32.const 1 - i32.shl - i32.ge_u - if - local.get $6 - i32.const 6 - i32.add - i32.const 1 - i32.sub - local.set $6 - local.get $0 - local.get $6 - i32.const 1 - i32.shl - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $5 - local.get $0 - local.get $5 - local.get $9 - call $~lib/util/uri/storeHex - i32.add - local.set $5 - else - local.get $9 - i32.const 2048 - i32.le_u - if - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - else - local.get $9 - i32.const 65536 - i32.lt_u - if - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 12 - i32.shr_u - i32.const 224 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - else - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 18 - i32.shr_u - i32.const 240 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 12 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - end - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - end - end - br $while-continue|0 - end - end - end - ) - (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 - local.get $0 - local.get $1 - global.get $~lib/util/uri/URL_SAFE - call $~lib/util/uri/encode - local.get $2 - ) - (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add - local.set $5 - local.get $2 - local.get $3 - i32.const 1 - i32.shl - i32.add - local.set $6 - i32.const 0 - i32.const 2 - i32.lt_s - drop - local.get $4 - i32.const 4 - i32.ge_u - if (result i32) - local.get $5 - i32.const 7 - i32.and - local.get $6 - i32.const 7 - i32.and - i32.or - i32.eqz - else - i32.const 0 - end - if - block $do-break|0 - loop $do-continue|0 - local.get $5 - i64.load - local.get $6 - i64.load - i64.ne - if - br $do-break|0 - end - local.get $5 - i32.const 8 - i32.add - local.set $5 - local.get $6 - i32.const 8 - i32.add - local.set $6 - local.get $4 - i32.const 4 - i32.sub - local.set $4 - local.get $4 - i32.const 4 - i32.ge_u - local.set $7 - local.get $7 - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $4 - local.tee $7 - i32.const 1 - i32.sub - local.set $4 - local.get $7 - local.set $7 - local.get $7 - if - local.get $5 - i32.load16_u - local.set $8 - local.get $6 - i32.load16_u - local.set $9 - local.get $8 - local.get $9 - i32.ne - if - local.get $8 + local.set $7 + local.get $7 + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $4 + local.tee $7 + i32.const 1 + i32.sub + local.set $4 + local.get $7 + local.set $7 + local.get $7 + if + local.get $5 + i32.load16_u + local.set $8 + local.get $6 + i32.load16_u + local.set $9 + local.get $8 + local.get $9 + i32.ne + if + local.get $8 local.get $9 i32.sub return @@ -4281,18 +3990,357 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17536 - i32.const 17584 + i32.const 17392 + i32.const 17440 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end ) - (func $start:std/uri - (local $0 i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) global.get $~lib/memory/__stack_pointer - i32.const 12 + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 0 + local.set $4 + i32.const 0 + local.set $5 + local.get $2 + i32.const 1 + i32.shl + local.set $6 + block $while-break|0 + loop $while-continue|0 + local.get $4 + local.get $2 + i32.lt_s + local.set $7 + local.get $7 + if + local.get $4 + local.set $8 + block $do-break|1 + loop $do-continue|1 + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $9 + local.get $9 + i32.const 128 + i32.lt_u + if + local.get $3 + local.get $9 + i32.add + i32.load8_u + i32.eqz + if + br $do-break|1 + end + else + br $do-break|1 + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $4 + local.get $2 + i32.lt_s + local.set $11 + local.get $11 + br_if $do-continue|1 + end + end + local.get $4 + local.get $8 + i32.gt_s + if + local.get $4 + local.get $8 + i32.sub + i32.const 1 + i32.shl + local.set $11 + local.get $5 + local.get $11 + i32.add + local.get $6 + i32.gt_u + if + local.get $5 + local.get $11 + i32.add + local.set $6 + local.get $0 + local.get $6 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $11 + call $~lib/memory/memory.copy + local.get $5 + local.get $11 + i32.add + local.set $5 + local.get $4 + local.get $2 + i32.ge_s + if + br $while-break|0 + end + end + local.get $9 + i32.const 56320 + i32.ge_u + if (result i32) + local.get $9 + i32.const 57343 + i32.le_u + else + i32.const 0 + end + if + i32.const 592 + i32.const 656 + i32.const 76 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 55296 + i32.ge_u + if (result i32) + local.get $9 + i32.const 56319 + i32.le_u + else + i32.const 0 + end + if + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $10 + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $10 + i32.const 56320 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $10 + i32.const 57343 + i32.gt_u + end + if + i32.const 720 + i32.const 656 + i32.const 83 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + local.get $10 + i32.const 1023 + i32.and + i32.or + i32.const 65536 + i32.add + local.set $9 + end + local.get $5 + local.get $6 + i32.ge_u + if + i32.const 800 + local.set $12 + global.get $~lib/memory/__stack_pointer + local.get $12 + i32.store + local.get $12 + i32.const 1 + local.get $5 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + i32.const 832 + local.set $12 + global.get $~lib/memory/__stack_pointer + local.get $12 + i32.store + local.get $12 + i32.const 1 + local.get $6 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + local.get $6 + i32.const 6 + i32.add + i32.const 12 + i32.mul + i32.const 10 + i32.div_u + local.set $6 + local.get $0 + local.get $6 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $9 + i32.const 128 + i32.lt_u + if + local.get $5 + local.get $0 + local.get $5 + local.get $9 + call $~lib/util/uri/storeHex + i32.add + local.set $5 + else + local.get $9 + i32.const 2048 + i32.le_u + if + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + else + local.get $9 + i32.const 65536 + i32.lt_u + if + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + else + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + end + local.get $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + i32.add + local.set $5 + end + end + br $while-continue|0 + end + end + end + local.get $6 + local.get $5 + i32.gt_u + if + local.get $0 + local.get $5 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $0 + local.set $12 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $12 + ) + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -4331,62 +4379,6 @@ local.get $0 i32.store local.get $0 - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 2 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 864 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 864 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 3 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 896 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 i32.const 896 local.set $0 global.get $~lib/memory/__stack_pointer @@ -4397,92 +4389,8 @@ i32.eqz if i32.const 0 - i32.const 816 - i32.const 4 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 928 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 928 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 5 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 960 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 960 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 6 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1056 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1088 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 9 + i32.const 928 + i32.const 11 i32.const 1 call $~lib/builtins/abort unreachable From e603cd68c06ab8392d628cb45f80eae3abc9ec47 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 02:45:57 +0200 Subject: [PATCH 27/87] wip --- std/assembly/util/uri.ts | 5 +- tests/compiler/std/uri.optimized.wat | 75 ++++++++++++++++------------ tests/compiler/std/uri.ts | 4 +- tests/compiler/std/uri.untouched.wat | 60 +++++++++++++--------- 4 files changed, 86 insertions(+), 58 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index dfac655fcf..3a713e788a 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -85,10 +85,10 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } - if (offset >= outSize) { + if (offset + 6 > outSize) { trace("offset", 1, offset); trace("outSize", 1, outSize); - outSize = (offset + 6) * 12 / 10; + outSize = max(outSize * 12 / 10, offset + 6); dst = __renew(dst, outSize); } @@ -107,6 +107,7 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize offset += storeHex(dst, offset, ((c >> 6) & 0x3F) | 0x80); } } + ++i; } if (outSize > offset) { dst = __renew(dst, offset); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 11ac8f6bab..0bcf4a7a0c 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -13,7 +13,7 @@ (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01\00\00\00\02\00\00\00+") + (data (i32.const 1048) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -36,11 +36,11 @@ (data (i32.const 1836) ",") (data (i32.const 1848) "\01\00\00\00\0e\00\00\00o\00u\00t\00S\00i\00z\00e") (data (i32.const 1884) "0123456789ABCDEF") - (data (i32.const 1900) "\1c") - (data (i32.const 1912) "\01\00\00\00\06\00\00\00%\002\00B") - (data (i32.const 1932) ",") - (data (i32.const 1944) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1984) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1900) ",") + (data (i32.const 1912) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") + (data (i32.const 1948) ",") + (data (i32.const 1960) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 2000) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -51,7 +51,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18396)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18412)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -180,7 +180,7 @@ if i32.const 0 local.get $0 - i32.const 18396 + i32.const 18412 i32.lt_u local.get $0 i32.load offset=8 @@ -226,7 +226,7 @@ i32.const 1 else local.get $1 - i32.const 1984 + i32.const 2000 i32.load i32.gt_u if @@ -240,7 +240,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 1988 + i32.const 2004 i32.add i32.load i32.const 32 @@ -845,10 +845,10 @@ if unreachable end - i32.const 18400 + i32.const 18416 i32.const 0 i32.store - i32.const 19968 + i32.const 19984 i32.const 0 i32.store loop $for-loop|0 @@ -859,7 +859,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18400 + i32.const 18416 i32.add i32.const 0 i32.store offset=4 @@ -877,7 +877,7 @@ i32.add i32.const 2 i32.shl - i32.const 18400 + i32.const 18416 i32.add i32.const 0 i32.store offset=96 @@ -895,13 +895,13 @@ br $for-loop|0 end end - i32.const 18400 - i32.const 19972 + i32.const 18416 + i32.const 19988 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18400 + i32.const 18416 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -980,7 +980,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18396 + i32.const 18412 i32.lt_u if local.get $0 @@ -1070,7 +1070,7 @@ unreachable end local.get $0 - i32.const 18396 + i32.const 18412 i32.lt_u if local.get $0 @@ -1093,7 +1093,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18396 + i32.const 18412 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2014,11 +2014,11 @@ ) (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 2012 + i32.const 2028 i32.lt_s if - i32.const 18416 - i32.const 18464 + i32.const 18432 + i32.const 18480 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2186,9 +2186,11 @@ i32.add local.set $2 end - local.get $5 local.get $6 - i32.ge_u + local.get $5 + i32.const 6 + i32.add + i32.lt_u if global.get $~lib/memory/__stack_pointer i32.const 1824 @@ -2216,12 +2218,19 @@ call $~lib/builtins/trace local.get $0 local.get $6 - i32.const 6 - i32.add i32.const 12 i32.mul i32.const 10 i32.div_u + local.tee $0 + local.get $5 + i32.const 6 + i32.add + local.tee $4 + local.get $0 + local.get $4 + i32.gt_u + select local.tee $6 call $~lib/rt/itcms/__renew local.set $0 @@ -2305,6 +2314,10 @@ end end local.set $5 + local.get $3 + i32.const 1 + i32.add + local.set $3 br $while-continue|0 end end @@ -2344,7 +2357,7 @@ memory.size i32.const 16 i32.shl - i32.const 18396 + i32.const 18412 i32.sub i32.const 1 i32.shr_u @@ -2492,13 +2505,13 @@ i32.eqz if i32.const 0 - i32.const 1952 - i32.const 11 + i32.const 1968 + i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 18396 + i32.const 18412 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index f544c67001..c64e5b8ffd 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -8,9 +8,9 @@ // escaped -assert(encodeURIComponent("+") == "%2B"); +// assert(encodeURIComponent("+") == "%2B"); // assert(encodeURIComponent("?+") == "%3F%2B"); -// assert(encodeURIComponent("-?1.-") == "-%3F1.-"); +assert(encodeURIComponent("-?1.-") == "-%3F1.-"); // assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); // assert(encodeURIComponent("\uD800")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index f6b1d28649..fec5e1ee20 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -14,7 +14,7 @@ (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -30,9 +30,9 @@ (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00o\00f\00f\00s\00e\00t\00") (data (i32.const 812) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00o\00u\00t\00S\00i\00z\00e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 860) "0123456789ABCDEF") - (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") - (data (i32.const 908) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 960) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 876) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 924) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 976) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -47,10 +47,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 960)) - (global $~lib/memory/__data_end i32 (i32.const 988)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17372)) - (global $~lib/memory/__heap_base i32 (i32.const 17372)) + (global $~lib/rt/__rtti_base i32 (i32.const 976)) + (global $~lib/memory/__data_end i32 (i32.const 1004)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17388)) + (global $~lib/memory/__heap_base i32 (i32.const 17388)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3990,8 +3990,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17392 - i32.const 17440 + i32.const 17408 + i32.const 17456 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4008,6 +4008,7 @@ (local $10 i32) (local $11 i32) (local $12 i32) + (local $13 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -4188,15 +4189,17 @@ local.set $9 end local.get $5 + i32.const 6 + i32.add local.get $6 - i32.ge_u + i32.gt_u if i32.const 800 - local.set $12 + local.set $13 global.get $~lib/memory/__stack_pointer - local.get $12 + local.get $13 i32.store - local.get $12 + local.get $13 i32.const 1 local.get $5 f64.convert_i32_u @@ -4206,11 +4209,11 @@ f64.const 0 call $~lib/builtins/trace i32.const 832 - local.set $12 + local.set $13 global.get $~lib/memory/__stack_pointer - local.get $12 + local.get $13 i32.store - local.get $12 + local.get $13 i32.const 1 local.get $6 f64.convert_i32_u @@ -4220,12 +4223,19 @@ f64.const 0 call $~lib/builtins/trace local.get $6 - i32.const 6 - i32.add i32.const 12 i32.mul i32.const 10 i32.div_u + local.tee $11 + local.get $5 + i32.const 6 + i32.add + local.tee $12 + local.get $11 + local.get $12 + i32.gt_u + select local.set $6 local.get $0 local.get $6 @@ -4316,6 +4326,10 @@ local.set $5 end end + local.get $4 + i32.const 1 + i32.add + local.set $4 br $while-continue|0 end end @@ -4330,12 +4344,12 @@ local.set $0 end local.get $0 - local.set $12 + local.set $13 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer - local.get $12 + local.get $13 ) (func $start:std/uri (local $0 i32) @@ -4389,8 +4403,8 @@ i32.eqz if i32.const 0 - i32.const 928 - i32.const 11 + i32.const 944 + i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable From c551f94ada2d45f68eeced415c01ee17efd90d34 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 03:53:19 +0200 Subject: [PATCH 28/87] fixes (wip) --- std/assembly/util/uri.ts | 48 +- tests/compiler/std/uri.optimized.wat | 900 ++++++++++++--------- tests/compiler/std/uri.ts | 15 +- tests/compiler/std/uri.untouched.wat | 1116 +++++++++++++++----------- 4 files changed, 1198 insertions(+), 881 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 3a713e788a..7799931488 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -28,7 +28,7 @@ import { CharCode } from "./string"; 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 ]); -function storeHex(dst: usize, offset: usize, ch: u32): usize { +function storeHex(dst: usize, offset: usize, ch: u32): void { // @ts-ignore: decorator const HEX_CHARS = memory.data([ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, @@ -41,7 +41,6 @@ function storeHex(dst: usize, offset: usize, ch: u32): usize { ); store(dst + offset, CharCode.PERCENT, 0); // % store(dst + offset, hex, 2); // XX - return offset + (3 << 1); } export function encode(dst: usize, src: usize, len: isize, table: usize): usize { @@ -54,8 +53,7 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize if (c < 0x80) { if (!load(table + c)) break; } else break; - ++i; - } while (i < len); + } while (++i < len); if (i > org) { let size = (i - org) << 1; @@ -63,6 +61,7 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize outSize = offset + size; dst = __renew(dst, outSize); } + memory.copy( dst + offset, src + (org << 1), @@ -72,39 +71,44 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize if (i >= len) break; } - if (c >= 0xDC00 && c <= 0xDFFF) { - throw new Error("invalid character"); - } - - if (c >= 0xD800 && c <= 0xDBFF) { - c1 = load(src + (i << 1)); - ++i; - if (c1 < 0xDC00 || c1 > 0xDFFF) { - throw new Error("expecting surrogate pair"); + if (c >= 0xD800) { + if (c >= 0xDC00 && c <= 0xDFFF) { + throw new Error("invalid character"); + } + if (c <= 0xDBFF) { + c1 = load(src + (i << 1)); + ++i; + if (c1 < 0xDC00 || c1 > 0xDFFF) { + throw new Error("expecting surrogate pair"); + } + c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } - c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } if (offset + 6 > outSize) { - trace("offset", 1, offset); - trace("outSize", 1, outSize); outSize = max(outSize * 12 / 10, offset + 6); dst = __renew(dst, outSize); } if (c < 0x80) { - offset += storeHex(dst, offset, c); + storeHex(dst, offset, c); + offset += 6; } else { if (c <= 0x800) { - offset += storeHex(dst, offset, (c >> 6) | 0xC0); + storeHex(dst, offset, (c >> 6) | 0xC0); + offset += 6; } else { if (c < 0x10000) { - offset += storeHex(dst, offset, (c >> 12) | 0xE0); + storeHex(dst, offset, (c >> 12) | 0xE0); + offset += 6; } else { - offset += storeHex(dst, offset, (c >> 18) | 0xF0); - offset += storeHex(dst, offset, ((c >> 12) & 0x3F) | 0x80); + storeHex(dst, offset, (c >> 18) | 0xF0); + offset += 6; + storeHex(dst, offset, ((c >> 12) & 0x3F) | 0x80); + offset += 6; } - offset += storeHex(dst, offset, ((c >> 6) & 0x3F) | 0x80); + storeHex(dst, offset, ((c >> 6) & 0x3F) | 0x80); + offset += 6; } } ++i; diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 0bcf4a7a0c..0e02344e36 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,19 +1,17 @@ (module - (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_=>_none (func (param i32))) + (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_=>_none (func (param i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") + (data (i32.const 1048) "\01") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -31,16 +29,30 @@ (data (i32.const 1672) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") (data (i32.const 1724) "L") (data (i32.const 1736) "\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r") - (data (i32.const 1804) "\1c") - (data (i32.const 1816) "\01\00\00\00\0c\00\00\00o\00f\00f\00s\00e\00t") - (data (i32.const 1836) ",") - (data (i32.const 1848) "\01\00\00\00\0e\00\00\00o\00u\00t\00S\00i\00z\00e") - (data (i32.const 1884) "0123456789ABCDEF") - (data (i32.const 1900) ",") - (data (i32.const 1912) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") - (data (i32.const 1948) ",") - (data (i32.const 1960) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 2000) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1804) "0123456789ABCDEF") + (data (i32.const 1820) ",") + (data (i32.const 1832) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1868) "\1c") + (data (i32.const 1880) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1900) "\1c") + (data (i32.const 1912) "\01\00\00\00\04\00\00\00a\001") + (data (i32.const 1932) "\1c") + (data (i32.const 1944) "\01\00\00\00\06\00\00\00a\00b\00_") + (data (i32.const 1964) "\\") + (data (i32.const 1976) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 2060) "\1c") + (data (i32.const 2072) "\01\00\00\00\02\00\00\00+") + (data (i32.const 2092) "\1c") + (data (i32.const 2104) "\01\00\00\00\06\00\00\00%\002\00B") + (data (i32.const 2124) "\1c") + (data (i32.const 2136) "\01\00\00\00\04\00\00\00?\00+") + (data (i32.const 2156) "\1c") + (data (i32.const 2168) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") + (data (i32.const 2188) "\1c") + (data (i32.const 2200) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") + (data (i32.const 2220) ",") + (data (i32.const 2232) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") + (data (i32.const 2272) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -51,7 +63,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18412)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18684)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -180,7 +192,7 @@ if i32.const 0 local.get $0 - i32.const 18412 + i32.const 18684 i32.lt_u local.get $0 i32.load offset=8 @@ -226,7 +238,7 @@ i32.const 1 else local.get $1 - i32.const 2000 + i32.const 2272 i32.load i32.gt_u if @@ -240,7 +252,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2004 + i32.const 2276 i32.add i32.load i32.const 32 @@ -845,10 +857,10 @@ if unreachable end - i32.const 18416 + i32.const 18688 i32.const 0 i32.store - i32.const 19984 + i32.const 20256 i32.const 0 i32.store loop $for-loop|0 @@ -859,7 +871,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18416 + i32.const 18688 i32.add i32.const 0 i32.store offset=4 @@ -877,7 +889,7 @@ i32.add i32.const 2 i32.shl - i32.const 18416 + i32.const 18688 i32.add i32.const 0 i32.store offset=96 @@ -895,13 +907,13 @@ br $for-loop|0 end end - i32.const 18416 - i32.const 19988 + i32.const 18688 + i32.const 20260 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18416 + i32.const 18688 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -980,7 +992,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18412 + i32.const 18684 i32.lt_u if local.get $0 @@ -1070,7 +1082,7 @@ unreachable end local.get $0 - i32.const 18412 + i32.const 18684 i32.lt_u if local.get $0 @@ -1093,7 +1105,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18412 + i32.const 18684 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1951,19 +1963,19 @@ call $~lib/memory/memory.copy local.get $3 ) - (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) local.get $2 i32.const 4 i32.shr_u i32.const 15 i32.and - i32.const 1884 + i32.const 1804 i32.add i32.load8_u local.get $2 i32.const 15 i32.and - i32.const 1884 + i32.const 1804 i32.add i32.load8_u i32.const 16 @@ -1979,317 +1991,237 @@ local.get $0 local.get $2 i32.store offset=2 - local.get $1 - i32.const 6 - i32.add - ) - (func $~lib/rt/__visit_members (param $0 i32) - block $invalid - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid - end - return - end - return - end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - call $~lib/rt/itcms/__visit - end - return - end - unreachable - ) - (func $~start - call $start:std/uri - ) - (func $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 2028 - i32.lt_s - if - i32.const 18432 - i32.const 18480 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/util/uri/encode (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) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $1 + (local $8 i32) + local.get $2 i32.const 1 i32.shl - local.set $6 + local.set $7 loop $while-continue|0 - local.get $1 - local.get $3 + local.get $2 + local.get $4 i32.gt_s if block $while-break|0 - local.get $3 - local.set $4 + local.get $4 + local.set $5 loop $do-continue|1 block $do-break|1 - local.get $3 + local.get $1 + local.get $4 i32.const 1 i32.shl - i32.const 1056 i32.add i32.load16_u - local.tee $2 + local.tee $3 i32.const 128 i32.ge_u br_if $do-break|1 - local.get $2 + local.get $3 i32.const 1468 i32.add i32.load8_u i32.eqz br_if $do-break|1 - local.get $1 - local.get $3 + local.get $2 + local.get $4 i32.const 1 i32.add - local.tee $3 + local.tee $4 i32.gt_s br_if $do-continue|1 end end - local.get $3 local.get $4 + local.get $5 i32.gt_s if + local.get $7 local.get $6 - local.get $5 - local.get $3 local.get $4 + local.get $5 i32.sub i32.const 1 i32.shl - local.tee $7 + local.tee $8 i32.add i32.lt_u if local.get $0 - local.get $5 - local.get $7 + local.get $6 + local.get $8 i32.add - local.tee $6 + local.tee $7 call $~lib/rt/itcms/__renew local.set $0 end local.get $0 - local.get $5 + local.get $6 i32.add - local.get $4 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 1056 i32.add - local.get $7 + local.get $8 call $~lib/memory/memory.copy - local.get $5 - local.get $7 + local.get $6 + local.get $8 i32.add - local.set $5 - local.get $1 - local.get $3 + local.set $6 + local.get $2 + local.get $4 i32.le_s br_if $while-break|0 end - local.get $2 - i32.const 57343 - i32.le_u - i32.const 0 - local.get $2 - i32.const 56320 - i32.ge_u - select - if - i32.const 1616 - i32.const 1680 - i32.const 76 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $2 - i32.const 56319 - i32.le_u - i32.const 0 - local.get $2 + local.get $3 i32.const 55296 i32.ge_u - select if local.get $3 - i32.const 1 - i32.shl - i32.const 1056 - i32.add - i32.load16_u - local.set $4 - local.get $3 - i32.const 1 - i32.add - local.set $3 - i32.const 1 - local.get $4 i32.const 57343 - i32.gt_u - local.get $4 + i32.le_u + i32.const 0 + local.get $3 i32.const 56320 - i32.lt_u + i32.ge_u select if - i32.const 1744 + i32.const 1616 i32.const 1680 - i32.const 83 + i32.const 76 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $4 - i32.const 1023 - i32.and - local.get $2 - i32.const 1023 - i32.and - i32.const 10 - i32.shl - i32.or - i32.const 65536 - i32.add - local.set $2 + local.get $3 + i32.const 56319 + i32.le_u + if (result i32) + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $5 + local.get $4 + i32.const 1 + i32.add + local.set $4 + i32.const 1 + local.get $5 + i32.const 57343 + i32.gt_u + local.get $5 + i32.const 56320 + i32.lt_u + select + if + i32.const 1744 + i32.const 1680 + i32.const 82 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $5 + i32.const 1023 + i32.and + local.get $3 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + i32.or + i32.const 65536 + i32.add + else + local.get $3 + end + local.set $3 end + local.get $7 local.get $6 - local.get $5 i32.const 6 i32.add i32.lt_u if - global.get $~lib/memory/__stack_pointer - i32.const 1824 - i32.store - i32.const 1824 - i32.const 1 - local.get $5 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - global.get $~lib/memory/__stack_pointer - i32.const 1856 - i32.store - i32.const 1856 - i32.const 1 - local.get $6 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace local.get $0 - local.get $6 + local.get $7 i32.const 12 i32.mul i32.const 10 i32.div_u - local.tee $0 - local.get $5 + local.tee $5 + local.get $6 i32.const 6 i32.add - local.tee $4 + local.tee $0 local.get $0 - local.get $4 - i32.gt_u + local.get $5 + i32.lt_u select - local.tee $6 + local.tee $7 call $~lib/rt/itcms/__renew local.set $0 end - local.get $2 + local.get $3 i32.const 128 i32.lt_u - if (result i32) + if local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 call $~lib/util/uri/storeHex - local.get $5 - i32.add else - local.get $2 + local.get $3 i32.const 2048 i32.le_u - if (result i32) + if local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 i32.const 6 i32.shr_u i32.const 192 i32.or call $~lib/util/uri/storeHex - local.get $5 - i32.add else - local.get $2 + local.get $0 + local.get $3 i32.const 65536 i32.lt_u - if (result i32) + if local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $5 - i32.add else local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex - local.get $5 - i32.add - local.tee $5 local.get $0 - local.get $5 - local.get $2 + local.get $6 + i32.const 6 + i32.add + local.tee $6 + local.get $3 i32.const 12 i32.shr_u i32.const 63 @@ -2297,12 +2229,12 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - i32.add end - local.tee $5 - local.get $0 - local.get $5 - local.get $2 + local.get $6 + i32.const 6 + i32.add + local.tee $6 + local.get $3 i32.const 6 i32.shr_u i32.const 63 @@ -2310,54 +2242,226 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - i32.add end end - local.set $5 - local.get $3 + local.get $6 + i32.const 6 + i32.add + local.set $6 + local.get $4 i32.const 1 i32.add - local.set $3 + local.set $4 br $while-continue|0 end end end - local.get $5 local.get $6 + local.get $7 i32.lt_u - if + if (result i32) local.get $0 - local.get $5 + local.get $6 call $~lib/rt/itcms/__renew - local.set $0 + else + local.get $0 end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 ) - (func $start:std/uri - (local $0 i32) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - global.get $~lib/memory/__stack_pointer - i32.const 12 + local.get $0 + i32.const 20 i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + call $~lib/util/uri/encode + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + if + i32.const 0 + return + end + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $2 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + return + end + block $__inlined_func$~lib/util/string/compareImpl (result i32) + local.get $0 + local.tee $3 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $3 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $2 + i32.const 1 + i32.sub + local.set $0 + local.get $2 + if + local.get $3 + i32.load16_u + local.tee $2 + local.get $1 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $2 + local.get $4 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + unreachable + ) + (func $~start + call $start:std/uri + ) + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2300 + i32.lt_s + if + i32.const 18704 + i32.const 18752 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=8 memory.size i32.const 16 i32.shl - i32.const 18412 + i32.const 18684 i32.sub i32.const 1 i32.shr_u @@ -2374,24 +2478,56 @@ global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 - block $__inlined_func$~lib/uri/encodeURIComponent (result i32) - i32.const 1056 - i32.const 1052 - i32.load - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - br_if $__inlined_func$~lib/uri/encodeURIComponent - drop - local.get $1 + i32.const 1056 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 3 i32.const 1 - i32.shl + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1888 + i32.store offset=8 + i32.const 1888 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1888 + i32.store offset=4 + local.get $0 + i32.const 1888 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 4 i32.const 1 - call $~lib/rt/itcms/__new - local.get $1 - call $~lib/util/uri/encode + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 1920 + i32.store offset=8 + i32.const 1920 + call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -2399,119 +2535,139 @@ global.get $~lib/memory/__stack_pointer i32.const 1920 i32.store offset=4 - block $__inlined_func$~lib/string/String.__eq (result i32) + local.get $0 + i32.const 1920 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 5 i32.const 1 - local.get $0 - i32.const 1920 - i32.eq - br_if $__inlined_func$~lib/string/String.__eq - drop + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=8 + i32.const 1952 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=4 + local.get $0 + i32.const 1952 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $0 - i32.eqz - br_if $__inlined_func$~lib/string/String.__eq - drop + i32.const 1840 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1984 + i32.store offset=8 + i32.const 1984 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1984 + i32.store offset=4 + local.get $0 + i32.const 1984 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 + i32.const 1840 + i32.const 7 i32.const 1 - i32.shr_u - local.tee $1 - i32.const 1916 - i32.load + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2080 + i32.store offset=8 + i32.const 2080 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2112 + i32.store offset=4 + local.get $0 + i32.const 2112 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 11 i32.const 1 - i32.shr_u - i32.ne - br_if $__inlined_func$~lib/string/String.__eq - drop - block $__inlined_func$~lib/util/string/compareImpl (result i32) - i32.const 1920 - local.set $3 - local.get $0 - local.tee $2 - i32.const 7 - i32.and - i32.eqz - i32.const 0 - local.get $1 - local.tee $0 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $2 - i64.load - local.get $3 - i64.load - i64.eq - if - local.get $2 - i32.const 8 - i32.add - local.set $2 - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $0 - i32.const 4 - i32.sub - local.tee $0 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $0 - local.tee $1 - i32.const 1 - i32.sub - local.set $0 - local.get $1 - if - local.get $2 - i32.load16_u - local.tee $4 - local.get $3 - i32.load16_u - local.tee $1 - i32.ne - if - local.get $4 - local.get $1 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $2 - i32.const 2 - i32.add - local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2144 + i32.store offset=8 + i32.const 2144 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2176 + i32.store offset=4 + local.get $0 + i32.const 2176 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 12 + i32.const 1 + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 2208 + i32.store offset=8 + i32.const 2208 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2240 + i32.store offset=4 + local.get $0 + i32.const 2240 + call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1968 + i32.const 1840 i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 18412 + i32.const 18684 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -2528,12 +2684,12 @@ end call $~lib/rt/itcms/step drop - loop $while-continue|12 + loop $while-continue|1 global.get $~lib/rt/itcms/state if call $~lib/rt/itcms/step drop - br $while-continue|12 + br $while-continue|1 end end global.get $~lib/rt/itcms/total diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index c64e5b8ffd..5015f667fa 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -1,16 +1,17 @@ // not escaped -// assert(encodeURIComponent("") == ""); -// assert(encodeURIComponent("a") == "a"); -// assert(encodeURIComponent("a1") == "a1"); -// assert(encodeURIComponent("ab_") == "ab_"); -// assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); +assert(encodeURIComponent("") == ""); +assert(encodeURIComponent("a") == "a"); +assert(encodeURIComponent("a1") == "a1"); +assert(encodeURIComponent("ab_") == "ab_"); +assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); // escaped -// assert(encodeURIComponent("+") == "%2B"); -// assert(encodeURIComponent("?+") == "%3F%2B"); +assert(encodeURIComponent("+") == "%2B"); +assert(encodeURIComponent("?+") == "%3F%2B"); assert(encodeURIComponent("-?1.-") == "-%3F1.-"); +// assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); // assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); // assert(encodeURIComponent("\uD800")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index fec5e1ee20..8f91e2e5c9 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -5,16 +5,14 @@ (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -27,12 +25,19 @@ (data (i32.const 572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\"\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 636) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 700) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00o\00f\00f\00s\00e\00t\00") - (data (i32.const 812) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00o\00u\00t\00S\00i\00z\00e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 860) "0123456789ABCDEF") - (data (i32.const 876) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 924) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 976) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) "0123456789ABCDEF") + (data (i32.const 796) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 844) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") + (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") + (data (i32.const 940) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") + (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 1100) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") + (data (i32.const 1132) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") + (data (i32.const 1164) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") + (data (i32.const 1196) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1248) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -47,10 +52,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 976)) - (global $~lib/memory/__data_end i32 (i32.const 1004)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17388)) - (global $~lib/memory/__heap_base i32 (i32.const 17388)) + (global $~lib/rt/__rtti_base i32 (i32.const 1248)) + (global $~lib/memory/__data_end i32 (i32.const 1276)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17660)) + (global $~lib/memory/__heap_base i32 (i32.const 17660)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3672,9 +3677,9 @@ call $~lib/memory/memory.copy local.get $3 ) - (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - i32.const 860 + i32.const 780 local.get $2 i32.const 4 i32.shr_u @@ -3682,7 +3687,7 @@ i32.and i32.add i32.load8_u - i32.const 860 + i32.const 780 local.get $2 i32.const 0 i32.shr_u @@ -3704,127 +3709,435 @@ i32.add local.get $3 i32.store offset=2 - local.get $1 - i32.const 3 - i32.const 1 - i32.shl - i32.add - ) - (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 - local.get $0 - local.get $1 - global.get $~lib/util/uri/URL_SAFE - call $~lib/util/uri/encode - local.set $2 - local.get $2 ) - (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) (local $9 i32) - local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add + (local $10 i32) + (local $11 i32) + (local $12 i32) + i32.const 0 + local.set $4 + i32.const 0 local.set $5 local.get $2 - local.get $3 i32.const 1 i32.shl - i32.add local.set $6 - i32.const 0 - i32.const 2 - i32.lt_s - drop - local.get $4 - i32.const 4 - i32.ge_u - if (result i32) - local.get $5 - i32.const 7 - i32.and - local.get $6 - i32.const 7 - i32.and - i32.or - i32.eqz - else - i32.const 0 - end - if - block $do-break|0 - loop $do-continue|0 - local.get $5 - i64.load - local.get $6 - i64.load - i64.ne + block $while-break|0 + loop $while-continue|0 + local.get $4 + local.get $2 + i32.lt_s + local.set $7 + local.get $7 + if + local.get $4 + local.set $8 + block $do-break|1 + loop $do-continue|1 + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $9 + local.get $9 + i32.const 128 + i32.lt_u + if + local.get $3 + local.get $9 + i32.add + i32.load8_u + i32.eqz + if + br $do-break|1 + end + else + br $do-break|1 + end + local.get $4 + i32.const 1 + i32.add + local.tee $4 + local.get $2 + i32.lt_s + local.set $11 + local.get $11 + br_if $do-continue|1 + end + end + local.get $4 + local.get $8 + i32.gt_s if - br $do-break|0 + local.get $4 + local.get $8 + i32.sub + i32.const 1 + i32.shl + local.set $11 + local.get $5 + local.get $11 + i32.add + local.get $6 + i32.gt_u + if + local.get $5 + local.get $11 + i32.add + local.set $6 + local.get $0 + local.get $6 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $11 + call $~lib/memory/memory.copy + local.get $5 + local.get $11 + i32.add + local.set $5 + local.get $4 + local.get $2 + i32.ge_s + if + br $while-break|0 + end + end + local.get $9 + i32.const 55296 + i32.ge_u + if + local.get $9 + i32.const 56320 + i32.ge_u + if (result i32) + local.get $9 + i32.const 57343 + i32.le_u + else + i32.const 0 + end + if + i32.const 592 + i32.const 656 + i32.const 76 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 56319 + i32.le_u + if + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $10 + local.get $4 + i32.const 1 + i32.add + local.set $4 + local.get $10 + i32.const 56320 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $10 + i32.const 57343 + i32.gt_u + end + if + i32.const 720 + i32.const 656 + i32.const 82 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + local.get $10 + i32.const 1023 + i32.and + i32.or + i32.const 65536 + i32.add + local.set $9 + end end local.get $5 - i32.const 8 + i32.const 6 i32.add - local.set $5 local.get $6 - i32.const 8 - i32.add - local.set $6 - local.get $4 - i32.const 4 - i32.sub - local.set $4 - local.get $4 - i32.const 4 - i32.ge_u - local.set $7 - local.get $7 - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $4 - local.tee $7 - i32.const 1 - i32.sub - local.set $4 - local.get $7 - local.set $7 - local.get $7 - if - local.get $5 - i32.load16_u - local.set $8 - local.get $6 - i32.load16_u - local.set $9 - local.get $8 - local.get $9 - i32.ne - if + i32.gt_u + if + local.get $6 + i32.const 12 + i32.mul + i32.const 10 + i32.div_u + local.tee $11 + local.get $5 + i32.const 6 + i32.add + local.tee $12 + local.get $11 + local.get $12 + i32.gt_u + select + local.set $6 + local.get $0 + local.get $6 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $9 + i32.const 128 + i32.lt_u + if + local.get $0 + local.get $5 + local.get $9 + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + else + local.get $9 + i32.const 2048 + i32.le_u + if + local.get $0 + local.get $5 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + else + local.get $9 + i32.const 65536 + i32.lt_u + if + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + else + local.get $0 + local.get $5 + local.get $9 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + end + local.get $0 + local.get $5 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + end + end + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $while-continue|0 + end + end + end + local.get $6 + local.get $5 + i32.gt_u + if + local.get $0 + local.get $5 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $0 + ) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + global.get $~lib/util/uri/URL_SAFE + call $~lib/util/uri/encode + local.set $2 + local.get $2 + ) + (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $5 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $6 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-continue|0 + local.get $5 + i64.load + local.get $6 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 + i32.sub + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + local.set $7 + local.get $7 + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $4 + local.tee $7 + i32.const 1 + i32.sub + local.set $4 + local.get $7 + local.set $7 + local.get $7 + if + local.get $5 + i32.load16_u + local.set $8 + local.get $6 + i32.load16_u + local.set $9 + local.get $8 + local.get $9 + i32.ne + if local.get $8 local.get $9 i32.sub @@ -3990,369 +4303,16 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17408 - i32.const 17456 + i32.const 17680 + i32.const 17728 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - i32.const 0 - local.set $4 - i32.const 0 - local.set $5 - local.get $2 - i32.const 1 - i32.shl - local.set $6 - block $while-break|0 - loop $while-continue|0 - local.get $4 - local.get $2 - i32.lt_s - local.set $7 - local.get $7 - if - local.get $4 - local.set $8 - block $do-break|1 - loop $do-continue|1 - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $9 - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $3 - local.get $9 - i32.add - i32.load8_u - i32.eqz - if - br $do-break|1 - end - else - br $do-break|1 - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - local.get $4 - local.get $2 - i32.lt_s - local.set $11 - local.get $11 - br_if $do-continue|1 - end - end - local.get $4 - local.get $8 - i32.gt_s - if - local.get $4 - local.get $8 - i32.sub - i32.const 1 - i32.shl - local.set $11 - local.get $5 - local.get $11 - i32.add - local.get $6 - i32.gt_u - if - local.get $5 - local.get $11 - i32.add - local.set $6 - local.get $0 - local.get $6 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $0 - local.get $5 - i32.add - local.get $1 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $11 - call $~lib/memory/memory.copy - local.get $5 - local.get $11 - i32.add - local.set $5 - local.get $4 - local.get $2 - i32.ge_s - if - br $while-break|0 - end - end - local.get $9 - i32.const 56320 - i32.ge_u - if (result i32) - local.get $9 - i32.const 57343 - i32.le_u - else - i32.const 0 - end - if - i32.const 592 - i32.const 656 - i32.const 76 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $9 - i32.const 55296 - i32.ge_u - if (result i32) - local.get $9 - i32.const 56319 - i32.le_u - else - i32.const 0 - end - if - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $10 - local.get $4 - i32.const 1 - i32.add - local.set $4 - local.get $10 - i32.const 56320 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $10 - i32.const 57343 - i32.gt_u - end - if - i32.const 720 - i32.const 656 - i32.const 83 - i32.const 9 - call $~lib/builtins/abort - unreachable - end - local.get $9 - i32.const 1023 - i32.and - i32.const 10 - i32.shl - local.get $10 - i32.const 1023 - i32.and - i32.or - i32.const 65536 - i32.add - local.set $9 - end - local.get $5 - i32.const 6 - i32.add - local.get $6 - i32.gt_u - if - i32.const 800 - local.set $13 - global.get $~lib/memory/__stack_pointer - local.get $13 - i32.store - local.get $13 - i32.const 1 - local.get $5 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - i32.const 832 - local.set $13 - global.get $~lib/memory/__stack_pointer - local.get $13 - i32.store - local.get $13 - i32.const 1 - local.get $6 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - local.get $6 - i32.const 12 - i32.mul - i32.const 10 - i32.div_u - local.tee $11 - local.get $5 - i32.const 6 - i32.add - local.tee $12 - local.get $11 - local.get $12 - i32.gt_u - select - local.set $6 - local.get $0 - local.get $6 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $5 - local.get $0 - local.get $5 - local.get $9 - call $~lib/util/uri/storeHex - i32.add - local.set $5 - else - local.get $9 - i32.const 2048 - i32.le_u - if - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - else - local.get $9 - i32.const 65536 - i32.lt_u - if - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 12 - i32.shr_u - i32.const 224 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - else - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 18 - i32.shr_u - i32.const 240 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 12 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - end - local.get $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - i32.add - local.set $5 - end - end - local.get $4 - i32.const 1 - i32.add - local.set $4 - br $while-continue|0 - end - end - end - local.get $6 - local.get $5 - i32.gt_u - if - local.get $0 - local.get $5 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $0 - local.set $13 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $13 - ) - (func $start:std/uri - (local $0 i32) + (func $start:std/uri + (local $0 i32) global.get $~lib/memory/__stack_pointer i32.const 12 i32.sub @@ -4393,6 +4353,62 @@ local.get $0 i32.store local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 3 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 864 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 864 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 4 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 896 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 i32.const 896 local.set $0 global.get $~lib/memory/__stack_pointer @@ -4403,7 +4419,147 @@ i32.eqz if i32.const 0 - i32.const 944 + i32.const 816 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 928 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 928 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 960 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 960 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 7 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1056 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1088 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 11 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1120 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1152 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 12 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1184 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1216 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 i32.const 13 i32.const 1 call $~lib/builtins/abort From 4c0555f78ef6b9bf24565b0faa6e65d5f35798db Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 04:05:03 +0200 Subject: [PATCH 29/87] more (wip) --- std/assembly/util/uri.ts | 7 ++- tests/compiler/std/uri.optimized.wat | 91 ++++++++++++++++++++-------- tests/compiler/std/uri.ts | 2 +- tests/compiler/std/uri.untouched.wat | 62 ++++++++++++++++--- 4 files changed, 125 insertions(+), 37 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 7799931488..b2dce6a345 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -85,8 +85,8 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize } } - if (offset + 6 > outSize) { - outSize = max(outSize * 12 / 10, offset + 6); + if (offset + 6 * 4 > outSize) { + outSize = max(outSize * 20 / 10, offset + 6 * 4); dst = __renew(dst, outSize); } @@ -110,11 +110,14 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize storeHex(dst, offset, ((c >> 6) & 0x3F) | 0x80); offset += 6; } + storeHex(dst, offset, (c & 0x3F) | 0x80); + offset += 6; } ++i; } if (outSize > offset) { dst = __renew(dst, offset); } + // trace(changetype(dst)); return dst; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 0e02344e36..79d45e58f9 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -52,7 +52,11 @@ (data (i32.const 2200) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") (data (i32.const 2220) ",") (data (i32.const 2232) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") - (data (i32.const 2272) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2268) "\1c") + (data (i32.const 2280) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") + (data (i32.const 2300) "l") + (data (i32.const 2312) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") + (data (i32.const 2416) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -63,7 +67,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18684)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18828)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -192,7 +196,7 @@ if i32.const 0 local.get $0 - i32.const 18684 + i32.const 18828 i32.lt_u local.get $0 i32.load offset=8 @@ -238,7 +242,7 @@ i32.const 1 else local.get $1 - i32.const 2272 + i32.const 2416 i32.load i32.gt_u if @@ -252,7 +256,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2276 + i32.const 2420 i32.add i32.load i32.const 32 @@ -857,10 +861,10 @@ if unreachable end - i32.const 18688 + i32.const 18832 i32.const 0 i32.store - i32.const 20256 + i32.const 20400 i32.const 0 i32.store loop $for-loop|0 @@ -871,7 +875,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18688 + i32.const 18832 i32.add i32.const 0 i32.store offset=4 @@ -889,7 +893,7 @@ i32.add i32.const 2 i32.shl - i32.const 18688 + i32.const 18832 i32.add i32.const 0 i32.store offset=96 @@ -907,13 +911,13 @@ br $for-loop|0 end end - i32.const 18688 - i32.const 20260 + i32.const 18832 + i32.const 20404 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18688 + i32.const 18832 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -992,7 +996,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18684 + i32.const 18828 i32.lt_u if local.get $0 @@ -1082,7 +1086,7 @@ unreachable end local.get $0 - i32.const 18684 + i32.const 18828 i32.lt_u if local.get $0 @@ -1105,7 +1109,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18684 + i32.const 18828 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2149,24 +2153,24 @@ end local.get $7 local.get $6 - i32.const 6 + i32.const 24 i32.add i32.lt_u if local.get $0 local.get $7 - i32.const 12 + i32.const 20 i32.mul i32.const 10 i32.div_u - local.tee $5 + local.tee $0 local.get $6 - i32.const 6 + i32.const 24 i32.add - local.tee $0 + local.tee $5 local.get $0 local.get $5 - i32.lt_u + i32.gt_u select local.tee $7 call $~lib/rt/itcms/__renew @@ -2243,6 +2247,17 @@ i32.or call $~lib/util/uri/storeHex end + local.get $0 + local.get $6 + i32.const 6 + i32.add + local.tee $6 + local.get $3 + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex end local.get $6 i32.const 6 @@ -2442,11 +2457,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2300 + i32.const 2444 i32.lt_s if - i32.const 18704 - i32.const 18752 + i32.const 18848 + i32.const 18896 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2461,7 +2476,7 @@ memory.size i32.const 16 i32.shl - i32.const 18684 + i32.const 18828 i32.sub i32.const 1 i32.shr_u @@ -2667,7 +2682,31 @@ call $~lib/builtins/abort unreachable end - i32.const 18684 + global.get $~lib/memory/__stack_pointer + i32.const 2288 + i32.store offset=8 + i32.const 2288 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2320 + i32.store offset=4 + local.get $0 + i32.const 2320 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1840 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 18828 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 5015f667fa..2af302ecd6 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -11,7 +11,7 @@ assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafg assert(encodeURIComponent("+") == "%2B"); assert(encodeURIComponent("?+") == "%3F%2B"); assert(encodeURIComponent("-?1.-") == "-%3F1.-"); -// assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); +assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); // assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); // assert(encodeURIComponent("\uD800")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 8f91e2e5c9..eb724c10ef 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -37,7 +37,9 @@ (data (i32.const 1132) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") (data (i32.const 1164) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") (data (i32.const 1196) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1248) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1244) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") + (data (i32.const 1276) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") + (data (i32.const 1392) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -52,10 +54,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 1248)) - (global $~lib/memory/__data_end i32 (i32.const 1276)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17660)) - (global $~lib/memory/__heap_base i32 (i32.const 17660)) + (global $~lib/rt/__rtti_base i32 (i32.const 1392)) + (global $~lib/memory/__data_end i32 (i32.const 1420)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17804)) + (global $~lib/memory/__heap_base i32 (i32.const 17804)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3890,18 +3892,22 @@ end local.get $5 i32.const 6 + i32.const 4 + i32.mul i32.add local.get $6 i32.gt_u if local.get $6 - i32.const 12 + i32.const 20 i32.mul i32.const 10 i32.div_u local.tee $11 local.get $5 i32.const 6 + i32.const 4 + i32.mul i32.add local.tee $12 local.get $11 @@ -4003,6 +4009,18 @@ i32.add local.set $5 end + local.get $0 + local.get $5 + local.get $9 + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 end local.get $4 i32.const 1 @@ -4303,8 +4321,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17680 - i32.const 17728 + i32.const 17824 + i32.const 17872 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4565,6 +4583,34 @@ call $~lib/builtins/abort unreachable end + i32.const 1264 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1296 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 816 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__heap_base global.set $~lib/memory/__stack_pointer call $~lib/rt/itcms/__collect From a0c49f25f49c76be9264ea64ab95e84d64e23720 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 04:18:44 +0200 Subject: [PATCH 30/87] more (wip) --- std/assembly/util/uri.ts | 5 ++++- tests/compiler/std/uri.optimized.wat | 15 +++++++++++++-- tests/compiler/std/uri.untouched.wat | 15 +++++++++++++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index b2dce6a345..1f431f3672 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -76,6 +76,9 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize throw new Error("invalid character"); } if (c <= 0xDBFF) { + if (i >= len) { + throw new Error("expecting surrogate pair"); + } c1 = load(src + (i << 1)); ++i; if (c1 < 0xDC00 || c1 > 0xDFFF) { @@ -94,7 +97,7 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize storeHex(dst, offset, c); offset += 6; } else { - if (c <= 0x800) { + if (c < 0x800) { storeHex(dst, offset, (c >> 6) | 0xC0); offset += 6; } else { diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 79d45e58f9..dee53b692c 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2108,6 +2108,17 @@ i32.const 56319 i32.le_u if (result i32) + local.get $2 + local.get $4 + i32.le_s + if + i32.const 1744 + i32.const 1680 + i32.const 80 + i32.const 11 + call $~lib/builtins/abort + unreachable + end local.get $1 local.get $4 i32.const 1 @@ -2130,7 +2141,7 @@ if i32.const 1744 i32.const 1680 - i32.const 82 + i32.const 85 i32.const 11 call $~lib/builtins/abort unreachable @@ -2187,7 +2198,7 @@ else local.get $3 i32.const 2048 - i32.le_u + i32.lt_u if local.get $0 local.get $6 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index eb724c10ef..6e344d4ff3 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3847,6 +3847,17 @@ i32.const 56319 i32.le_u if + local.get $4 + local.get $2 + i32.ge_s + if + i32.const 720 + i32.const 656 + i32.const 80 + i32.const 11 + call $~lib/builtins/abort + unreachable + end local.get $1 local.get $4 i32.const 1 @@ -3871,7 +3882,7 @@ if i32.const 720 i32.const 656 - i32.const 82 + i32.const 85 i32.const 11 call $~lib/builtins/abort unreachable @@ -3935,7 +3946,7 @@ else local.get $9 i32.const 2048 - i32.le_u + i32.lt_u if local.get $0 local.get $5 From 6c13459eccf132a989e0a6aa0d2261b2d7a22bbd Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 04:38:07 +0200 Subject: [PATCH 31/87] better size estimation --- std/assembly/util/uri.ts | 5 ++-- tests/compiler/std/uri.optimized.wat | 38 ++++++++++++++-------------- tests/compiler/std/uri.untouched.wat | 33 ++++++++++++------------ 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 1f431f3672..1ec0d9d10a 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -88,8 +88,9 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize } } - if (offset + 6 * 4 > outSize) { - outSize = max(outSize * 20 / 10, offset + 6 * 4); + let estSize = offset + (c < 0x80 ? 1 * 6 : 4 * 6); + if (estSize > outSize) { + outSize = estSize * 15 / 10; dst = __renew(dst, outSize); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index dee53b692c..4e8a12fe9c 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2084,6 +2084,10 @@ i32.le_s br_if $while-break|0 end + local.get $7 + local.get $6 + i32.const 6 + i32.const 24 local.get $3 i32.const 55296 i32.ge_u @@ -2162,27 +2166,20 @@ end local.set $3 end - local.get $7 - local.get $6 - i32.const 24 + local.get $3 + i32.const 128 + i32.lt_u + select i32.add + local.tee $5 i32.lt_u if local.get $0 - local.get $7 - i32.const 20 + local.get $5 + i32.const 15 i32.mul i32.const 10 i32.div_u - local.tee $0 - local.get $6 - i32.const 24 - i32.add - local.tee $5 - local.get $0 - local.get $5 - i32.gt_u - select local.tee $7 call $~lib/rt/itcms/__renew local.set $0 @@ -2213,7 +2210,7 @@ local.get $3 i32.const 65536 i32.lt_u - if + if (result i32) local.get $0 local.get $6 local.get $3 @@ -2222,6 +2219,9 @@ i32.const 224 i32.or call $~lib/util/uri/storeHex + local.get $6 + i32.const 6 + i32.add else local.get $0 local.get $6 @@ -2235,7 +2235,7 @@ local.get $6 i32.const 6 i32.add - local.tee $6 + local.tee $5 local.get $3 i32.const 12 i32.shr_u @@ -2244,10 +2244,10 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add end - local.get $6 - i32.const 6 - i32.add local.tee $6 local.get $3 i32.const 6 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 6e344d4ff3..8d4a66466f 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3721,7 +3721,6 @@ (local $9 i32) (local $10 i32) (local $11 i32) - (local $12 i32) i32.const 0 local.set $4 i32.const 0 @@ -3902,29 +3901,29 @@ end end local.get $5 - i32.const 6 - i32.const 4 - i32.mul + local.get $9 + i32.const 128 + i32.lt_u + if (result i32) + i32.const 1 + i32.const 6 + i32.mul + else + i32.const 4 + i32.const 6 + i32.mul + end i32.add + local.set $11 + local.get $11 local.get $6 i32.gt_u if - local.get $6 - i32.const 20 + local.get $11 + i32.const 15 i32.mul i32.const 10 i32.div_u - local.tee $11 - local.get $5 - i32.const 6 - i32.const 4 - i32.mul - i32.add - local.tee $12 - local.get $11 - local.get $12 - i32.gt_u - select local.set $6 local.get $0 local.get $6 From d011a38a99d70fc2ea47b647c2dd8c7e057860e5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 10:58:29 +0200 Subject: [PATCH 32/87] add URIError --- std/assembly/error.ts | 7 + std/assembly/index.d.ts | 3 + std/assembly/util/error.ts | 4 + std/assembly/util/uri.ts | 7 +- tests/compiler/std/uri.optimized.wat | 720 +++++++++------------------ tests/compiler/std/uri.ts | 22 +- tests/compiler/std/uri.untouched.wat | 291 ++--------- 7 files changed, 301 insertions(+), 753 deletions(-) diff --git a/std/assembly/error.ts b/std/assembly/error.ts index 9c694f57a1..8446721a6b 100644 --- a/std/assembly/error.ts +++ b/std/assembly/error.ts @@ -35,3 +35,10 @@ export class SyntaxError extends Error { this.name = "SyntaxError"; } } + +export class URIError extends Error { + constructor(message: string = "") { + super(message); + this.name = "URIError"; + } +} diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 41e58e2c20..331864493e 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1745,6 +1745,9 @@ declare class TypeError extends Error { } /** Class for indicating an error when trying to interpret syntactically invalid code. */ declare class SyntaxError extends Error { } +/** Class for indicating an error when a global URI handling function was used in a wrong way. */ +declare class URIError extends Error { } + interface Boolean { toString(radix?: number): string; } diff --git a/std/assembly/util/error.ts b/std/assembly/util/error.ts index 2384a60e8c..df0d28b362 100644 --- a/std/assembly/util/error.ts +++ b/std/assembly/util/error.ts @@ -40,3 +40,7 @@ export const E_ALREADY_PINNED: string = "Object already pinned"; // @ts-ignore: decorator @lazy @inline export const E_NOT_PINNED: string = "Object is not pinned"; + +// @ts-ignore: decorator +@lazy @inline +export const E_URI_MALFORMED: string = "URI malformed"; diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 1ec0d9d10a..20042a99dd 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -2,6 +2,7 @@ // https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_e.c // https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c +import { E_URI_MALFORMED } from "./error"; import { CharCode } from "./string"; // @ts-ignore: decorator @@ -73,16 +74,16 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize if (c >= 0xD800) { if (c >= 0xDC00 && c <= 0xDFFF) { - throw new Error("invalid character"); + throw new URIError(E_URI_MALFORMED); } if (c <= 0xDBFF) { if (i >= len) { - throw new Error("expecting surrogate pair"); + throw new URIError(E_URI_MALFORMED); } c1 = load(src + (i << 1)); ++i; if (c1 < 0xDC00 || c1 > 0xDFFF) { - throw new Error("expecting surrogate pair"); + throw new URIError(E_URI_MALFORMED); } c = (((c & 0x3FF) << 10) | (c1 & 0x3FF)) + 0x10000; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 4e8a12fe9c..91fbcda9b6 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -4,14 +4,13 @@ (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01") + (data (i32.const 1048) "\01\00\00\00\04\00\00\00\00\d8\ff\df") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -23,40 +22,16 @@ (data (i32.const 1404) "<") (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") (data (i32.const 1501) "\01\00\00\00\00\00\01\01\01\01\00\00\01\01\00\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\01") - (data (i32.const 1596) "<") - (data (i32.const 1608) "\01\00\00\00\"\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r") - (data (i32.const 1660) "<") - (data (i32.const 1672) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1724) "L") - (data (i32.const 1736) "\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r") - (data (i32.const 1804) "0123456789ABCDEF") - (data (i32.const 1820) ",") - (data (i32.const 1832) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1868) "\1c") - (data (i32.const 1880) "\01\00\00\00\02\00\00\00a") - (data (i32.const 1900) "\1c") - (data (i32.const 1912) "\01\00\00\00\04\00\00\00a\001") - (data (i32.const 1932) "\1c") - (data (i32.const 1944) "\01\00\00\00\06\00\00\00a\00b\00_") - (data (i32.const 1964) "\\") - (data (i32.const 1976) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") - (data (i32.const 2060) "\1c") - (data (i32.const 2072) "\01\00\00\00\02\00\00\00+") - (data (i32.const 2092) "\1c") - (data (i32.const 2104) "\01\00\00\00\06\00\00\00%\002\00B") - (data (i32.const 2124) "\1c") - (data (i32.const 2136) "\01\00\00\00\04\00\00\00?\00+") - (data (i32.const 2156) "\1c") - (data (i32.const 2168) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") - (data (i32.const 2188) "\1c") - (data (i32.const 2200) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") - (data (i32.const 2220) ",") - (data (i32.const 2232) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") - (data (i32.const 2268) "\1c") - (data (i32.const 2280) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") - (data (i32.const 2300) "l") - (data (i32.const 2312) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") - (data (i32.const 2416) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1596) ",") + (data (i32.const 1608) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") + (data (i32.const 1644) "<") + (data (i32.const 1656) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1708) "0123456789ABCDEF") + (data (i32.const 1724) ",") + (data (i32.const 1736) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") + (data (i32.const 1772) ",") + (data (i32.const 1784) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1824) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -67,7 +42,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18828)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18236)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -86,6 +61,8 @@ call $~lib/rt/itcms/__visit i32.const 1088 call $~lib/rt/itcms/__visit + i32.const 1616 + call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 i32.load offset=4 @@ -196,7 +173,7 @@ if i32.const 0 local.get $0 - i32.const 18828 + i32.const 18236 i32.lt_u local.get $0 i32.load offset=8 @@ -242,7 +219,7 @@ i32.const 1 else local.get $1 - i32.const 2416 + i32.const 1824 i32.load i32.gt_u if @@ -256,7 +233,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2420 + i32.const 1828 i32.add i32.load i32.const 32 @@ -861,10 +838,10 @@ if unreachable end - i32.const 18832 + i32.const 18240 i32.const 0 i32.store - i32.const 20400 + i32.const 19808 i32.const 0 i32.store loop $for-loop|0 @@ -875,7 +852,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18832 + i32.const 18240 i32.add i32.const 0 i32.store offset=4 @@ -893,7 +870,7 @@ i32.add i32.const 2 i32.shl - i32.const 18832 + i32.const 18240 i32.add i32.const 0 i32.store offset=96 @@ -911,13 +888,13 @@ br $for-loop|0 end end - i32.const 18832 - i32.const 20404 + i32.const 18240 + i32.const 19812 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18832 + i32.const 18240 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -996,7 +973,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18828 + i32.const 18236 i32.lt_u if local.get $0 @@ -1086,7 +1063,7 @@ unreachable end local.get $0 - i32.const 18828 + i32.const 18236 i32.lt_u if local.get $0 @@ -1109,7 +1086,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18828 + i32.const 18236 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1973,13 +1950,13 @@ i32.shr_u i32.const 15 i32.and - i32.const 1804 + i32.const 1708 i32.add i32.load8_u local.get $2 i32.const 15 i32.and - i32.const 1804 + i32.const 1708 i32.add i32.load8_u i32.const 16 @@ -1996,164 +1973,164 @@ local.get $2 i32.store offset=2 ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) - (local $8 i32) - local.get $2 + local.get $1 i32.const 1 i32.shl - local.set $7 + local.set $6 loop $while-continue|0 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.gt_s if block $while-break|0 - local.get $4 - local.set $5 + local.get $3 + local.set $4 loop $do-continue|1 block $do-break|1 - local.get $1 - local.get $4 + local.get $3 i32.const 1 i32.shl + i32.const 1056 i32.add i32.load16_u - local.tee $3 + local.tee $2 i32.const 128 i32.ge_u br_if $do-break|1 - local.get $3 + local.get $2 i32.const 1468 i32.add i32.load8_u i32.eqz br_if $do-break|1 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.const 1 i32.add - local.tee $4 + local.tee $3 i32.gt_s br_if $do-continue|1 end end + local.get $3 local.get $4 - local.get $5 i32.gt_s if - local.get $7 local.get $6 - local.get $4 local.get $5 + local.get $3 + local.get $4 i32.sub i32.const 1 i32.shl - local.tee $8 + local.tee $7 i32.add i32.lt_u if local.get $0 - local.get $6 - local.get $8 + local.get $5 + local.get $7 i32.add - local.tee $7 + local.tee $6 call $~lib/rt/itcms/__renew local.set $0 end local.get $0 - local.get $6 - i32.add - local.get $1 local.get $5 + i32.add + local.get $4 i32.const 1 i32.shl + i32.const 1056 i32.add - local.get $8 + local.get $7 call $~lib/memory/memory.copy - local.get $6 - local.get $8 + local.get $5 + local.get $7 i32.add - local.set $6 - local.get $2 - local.get $4 + local.set $5 + local.get $1 + local.get $3 i32.le_s br_if $while-break|0 end - local.get $7 local.get $6 + local.get $5 i32.const 6 i32.const 24 - local.get $3 + local.get $2 i32.const 55296 i32.ge_u if - local.get $3 + local.get $2 i32.const 57343 i32.le_u i32.const 0 - local.get $3 + local.get $2 i32.const 56320 i32.ge_u select if i32.const 1616 - i32.const 1680 - i32.const 76 + i32.const 1664 + i32.const 77 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $3 + local.get $2 i32.const 56319 i32.le_u if (result i32) - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.le_s if - i32.const 1744 - i32.const 1680 - i32.const 80 + i32.const 1616 + i32.const 1664 + i32.const 81 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $1 - local.get $4 + local.get $3 i32.const 1 i32.shl + i32.const 1056 i32.add i32.load16_u - local.set $5 - local.get $4 + local.set $4 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 i32.const 1 - local.get $5 + local.get $4 i32.const 57343 i32.gt_u - local.get $5 + local.get $4 i32.const 56320 i32.lt_u select if - i32.const 1744 - i32.const 1680 - i32.const 85 + i32.const 1616 + i32.const 1664 + i32.const 86 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $5 + local.get $4 i32.const 1023 i32.and - local.get $3 + local.get $2 i32.const 1023 i32.and i32.const 10 @@ -2162,44 +2139,44 @@ i32.const 65536 i32.add else - local.get $3 + local.get $2 end - local.set $3 + local.set $2 end - local.get $3 + local.get $2 i32.const 128 i32.lt_u select i32.add - local.tee $5 + local.tee $4 i32.lt_u if local.get $0 - local.get $5 + local.get $4 i32.const 15 i32.mul i32.const 10 i32.div_u - local.tee $7 + local.tee $6 call $~lib/rt/itcms/__renew local.set $0 end - local.get $3 + local.get $2 i32.const 128 i32.lt_u if local.get $0 - local.get $6 - local.get $3 + local.get $5 + local.get $2 call $~lib/util/uri/storeHex else - local.get $3 + local.get $2 i32.const 2048 i32.lt_u if local.get $0 - local.get $6 - local.get $3 + local.get $5 + local.get $2 i32.const 6 i32.shr_u i32.const 192 @@ -2207,36 +2184,36 @@ call $~lib/util/uri/storeHex else local.get $0 - local.get $3 + local.get $2 i32.const 65536 i32.lt_u if (result i32) local.get $0 - local.get $6 - local.get $3 + local.get $5 + local.get $2 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $6 + local.get $5 i32.const 6 i32.add else local.get $0 - local.get $6 - local.get $3 + local.get $5 + local.get $2 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex local.get $0 - local.get $6 + local.get $5 i32.const 6 i32.add - local.tee $5 - local.get $3 + local.tee $4 + local.get $2 i32.const 12 i32.shr_u i32.const 63 @@ -2244,12 +2221,12 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add end - local.tee $6 - local.get $3 + local.tee $5 + local.get $2 i32.const 6 i32.shr_u i32.const 63 @@ -2259,179 +2236,40 @@ call $~lib/util/uri/storeHex end local.get $0 - local.get $6 + local.get $5 i32.const 6 i32.add - local.tee $6 - local.get $3 + local.tee $5 + local.get $2 i32.const 63 i32.and i32.const 128 i32.or call $~lib/util/uri/storeHex end - local.get $6 + local.get $5 i32.const 6 i32.add - local.set $6 - local.get $4 + local.set $5 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 br $while-continue|0 end end end + local.get $5 local.get $6 - local.get $7 i32.lt_u if (result i32) local.get $0 - local.get $6 + local.get $5 call $~lib/rt/itcms/__renew else local.get $0 end ) - (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 - call $~lib/util/uri/encode - ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - local.get $0 - local.get $1 - i32.eq - if - i32.const 1 - return - end - local.get $1 - i32.eqz - i32.const 1 - local.get $0 - select - if - i32.const 0 - return - end - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $2 - local.get $1 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - i32.ne - if - i32.const 0 - return - end - block $__inlined_func$~lib/util/string/compareImpl (result i32) - local.get $0 - local.tee $3 - i32.const 7 - i32.and - local.get $1 - i32.const 7 - i32.and - i32.or - i32.eqz - i32.const 0 - local.get $2 - local.tee $0 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $3 - i64.load - local.get $1 - i64.load - i64.eq - if - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $1 - i32.const 8 - i32.add - local.set $1 - local.get $0 - i32.const 4 - i32.sub - local.tee $0 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $0 - local.tee $2 - i32.const 1 - i32.sub - local.set $0 - local.get $2 - if - local.get $3 - i32.load16_u - local.tee $2 - local.get $1 - i32.load16_u - local.tee $4 - i32.ne - if - local.get $2 - local.get $4 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $3 - i32.const 2 - i32.add - local.set $3 - local.get $1 - i32.const 2 - i32.add - local.set $1 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz - ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid block $~lib/arraybuffer/ArrayBufferView @@ -2463,16 +2301,20 @@ ) (func $start:std/uri (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) global.get $~lib/memory/__stack_pointer i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2444 + i32.const 1852 i32.lt_s if - i32.const 18848 - i32.const 18896 + i32.const 18256 + i32.const 18304 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2487,7 +2329,7 @@ memory.size i32.const 16 i32.shl - i32.const 18828 + i32.const 18236 i32.sub i32.const 1 i32.shr_u @@ -2504,220 +2346,144 @@ global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 - i32.const 1056 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=4 - local.get $0 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 3 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1888 - i32.store offset=8 - i32.const 1888 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1888 - i32.store offset=4 - local.get $0 - i32.const 1888 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 4 + block $__inlined_func$~lib/uri/encodeURIComponent (result i32) + i32.const 1056 + i32.const 1052 + i32.load i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1920 - i32.store offset=8 - i32.const 1920 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1920 - i32.store offset=4 - local.get $0 - i32.const 1920 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 5 + i32.shr_u + local.tee $1 + i32.eqz + br_if $__inlined_func$~lib/uri/encodeURIComponent + drop + local.get $1 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1952 - i32.store offset=8 - i32.const 1952 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1952 - i32.store offset=4 - local.get $0 - i32.const 1952 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 6 + i32.shl i32.const 1 - call $~lib/builtins/abort - unreachable + call $~lib/rt/itcms/__new + local.get $1 + call $~lib/util/uri/encode end - global.get $~lib/memory/__stack_pointer - i32.const 1984 - i32.store offset=8 - i32.const 1984 - call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1984 + i32.const 1744 i32.store offset=4 - local.get $0 - i32.const 1984 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 7 + block $__inlined_func$~lib/string/String.__eq (result i32) i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2080 - i32.store offset=8 - i32.const 2080 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2112 - i32.store offset=4 - local.get $0 - i32.const 2112 - call $~lib/string/String.__eq - i32.eqz - if + local.get $0 + i32.const 1744 + i32.eq + br_if $__inlined_func$~lib/string/String.__eq + drop i32.const 0 - i32.const 1840 - i32.const 11 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2144 - i32.store offset=8 - i32.const 2144 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2176 - i32.store offset=4 - local.get $0 - i32.const 2176 - call $~lib/string/String.__eq - i32.eqz - if + local.get $0 + i32.eqz + br_if $__inlined_func$~lib/string/String.__eq + drop i32.const 0 - i32.const 1840 - i32.const 12 + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2208 - i32.store offset=8 - i32.const 2208 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2240 - i32.store offset=4 - local.get $0 - i32.const 2240 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1840 - i32.const 13 + i32.shr_u + local.tee $1 + i32.const 1740 + i32.load i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shr_u + i32.ne + br_if $__inlined_func$~lib/string/String.__eq + drop + block $__inlined_func$~lib/util/string/compareImpl (result i32) + i32.const 1744 + local.set $3 + local.get $0 + local.tee $2 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $1 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $2 + i64.load + local.get $3 + i64.load + i64.eq + if + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $1 + i32.const 1 + i32.sub + local.set $0 + local.get $1 + if + local.get $2 + i32.load16_u + local.tee $4 + local.get $3 + i32.load16_u + local.tee $1 + i32.ne + if + local.get $4 + local.get $1 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $2 + i32.const 2 + i32.add + local.set $2 + local.get $3 + i32.const 2 + i32.add + local.set $3 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz end - global.get $~lib/memory/__stack_pointer - i32.const 2288 - i32.store offset=8 - i32.const 2288 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2320 - i32.store offset=4 - local.get $0 - i32.const 2320 - call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1840 - i32.const 14 + i32.const 1792 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 18828 + i32.const 18236 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -2734,12 +2500,12 @@ end call $~lib/rt/itcms/step drop - loop $while-continue|1 + loop $while-continue|12 global.get $~lib/rt/itcms/state if call $~lib/rt/itcms/step drop - br $while-continue|1 + br $while-continue|12 end end global.get $~lib/rt/itcms/total diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 2af302ecd6..9cebe2dacb 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -1,18 +1,18 @@ // not escaped -assert(encodeURIComponent("") == ""); -assert(encodeURIComponent("a") == "a"); -assert(encodeURIComponent("a1") == "a1"); -assert(encodeURIComponent("ab_") == "ab_"); -assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); +// assert(encodeURIComponent("") == ""); +// assert(encodeURIComponent("a") == "a"); +// assert(encodeURIComponent("a1") == "a1"); +// assert(encodeURIComponent("ab_") == "ab_"); +// assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); -// escaped +// // escaped -assert(encodeURIComponent("+") == "%2B"); -assert(encodeURIComponent("?+") == "%3F%2B"); -assert(encodeURIComponent("-?1.-") == "-%3F1.-"); -assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); -// assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); +// assert(encodeURIComponent("+") == "%2B"); +// assert(encodeURIComponent("?+") == "%3F%2B"); +// assert(encodeURIComponent("-?1.-") == "-%3F1.-"); +// assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); +assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); // assert(encodeURIComponent("\uD800")); // malformed URI sequence // assert(encodeURIComponent("\uDFFF")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 8d4a66466f..7636021bbb 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -12,7 +12,7 @@ (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -22,24 +22,12 @@ (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 444) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\01\01\01\01\00\00\01\01\00\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\01") - (data (i32.const 572) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\"\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 636) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 700) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\000\00\00\00e\00x\00p\00e\00c\00t\00i\00n\00g\00 \00s\00u\00r\00r\00o\00g\00a\00t\00e\00 \00p\00a\00i\00r\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) "0123456789ABCDEF") - (data (i32.const 796) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 844) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") - (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") - (data (i32.const 940) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") - (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") - (data (i32.const 1100) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") - (data (i32.const 1132) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") - (data (i32.const 1164) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") - (data (i32.const 1196) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1244) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") - (data (i32.const 1276) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") - (data (i32.const 1392) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 572) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") + (data (i32.const 620) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 684) "0123456789ABCDEF") + (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") + (data (i32.const 748) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 800) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -54,10 +42,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 1392)) - (global $~lib/memory/__data_end i32 (i32.const 1420)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17804)) - (global $~lib/memory/__heap_base i32 (i32.const 17804)) + (global $~lib/rt/__rtti_base i32 (i32.const 800)) + (global $~lib/memory/__data_end i32 (i32.const 828)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17212)) + (global $~lib/memory/__heap_base i32 (i32.const 17212)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3681,7 +3669,7 @@ ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - i32.const 780 + i32.const 684 local.get $2 i32.const 4 i32.shr_u @@ -3689,7 +3677,7 @@ i32.and i32.add i32.load8_u - i32.const 780 + i32.const 684 local.get $2 i32.const 0 i32.shr_u @@ -3836,8 +3824,8 @@ end if i32.const 592 - i32.const 656 - i32.const 76 + i32.const 640 + i32.const 77 i32.const 9 call $~lib/builtins/abort unreachable @@ -3850,9 +3838,9 @@ local.get $2 i32.ge_s if - i32.const 720 - i32.const 656 - i32.const 80 + i32.const 592 + i32.const 640 + i32.const 81 i32.const 11 call $~lib/builtins/abort unreachable @@ -3879,9 +3867,9 @@ i32.gt_u end if - i32.const 720 - i32.const 656 - i32.const 85 + i32.const 592 + i32.const 640 + i32.const 86 i32.const 11 call $~lib/builtins/abort unreachable @@ -4289,6 +4277,9 @@ i32.const 64 local.get $0 call $~lib/rt/itcms/__visit + i32.const 592 + local.get $0 + call $~lib/rt/itcms/__visit ) (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) (local $2 i32) @@ -4331,8 +4322,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17824 - i32.const 17872 + i32.const 17232 + i32.const 17280 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4381,147 +4372,7 @@ local.get $0 i32.store local.get $0 - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 3 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 864 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 864 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 4 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 896 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 896 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 5 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 928 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 928 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 6 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 960 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 960 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 7 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1056 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1088 + i32.const 720 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4531,92 +4382,8 @@ i32.eqz if i32.const 0 - i32.const 816 - i32.const 11 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1120 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1152 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 12 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1184 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1216 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 13 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1264 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1296 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 816 - i32.const 14 + i32.const 768 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable From 163ff90370efd0da19f93e01bc418013de60ffdb Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 11:04:51 +0200 Subject: [PATCH 33/87] wip --- std/assembly/util/uri.ts | 3 +- tests/compiler/std/uri.optimized.wat | 714 ++++++++++++++++++--------- tests/compiler/std/uri.ts | 20 +- tests/compiler/std/uri.untouched.wat | 298 ++++++++++- 4 files changed, 779 insertions(+), 256 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 20042a99dd..e77ae9a51a 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -80,8 +80,7 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize if (i >= len) { throw new URIError(E_URI_MALFORMED); } - c1 = load(src + (i << 1)); - ++i; + c1 = load(src + (++i << 1)); if (c1 < 0xDC00 || c1 > 0xDFFF) { throw new URIError(E_URI_MALFORMED); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 91fbcda9b6..79798fa5bf 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -4,13 +4,14 @@ (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01\00\00\00\04\00\00\00\00\d8\ff\df") + (data (i32.const 1048) "\01") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -28,10 +29,36 @@ (data (i32.const 1656) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") (data (i32.const 1708) "0123456789ABCDEF") (data (i32.const 1724) ",") - (data (i32.const 1736) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") - (data (i32.const 1772) ",") - (data (i32.const 1784) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1824) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1736) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1772) "\1c") + (data (i32.const 1784) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1804) "\1c") + (data (i32.const 1816) "\01\00\00\00\04\00\00\00a\001") + (data (i32.const 1836) "\1c") + (data (i32.const 1848) "\01\00\00\00\06\00\00\00a\00b\00_") + (data (i32.const 1868) "\\") + (data (i32.const 1880) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 1964) "\1c") + (data (i32.const 1976) "\01\00\00\00\02\00\00\00+") + (data (i32.const 1996) "\1c") + (data (i32.const 2008) "\01\00\00\00\06\00\00\00%\002\00B") + (data (i32.const 2028) "\1c") + (data (i32.const 2040) "\01\00\00\00\04\00\00\00?\00+") + (data (i32.const 2060) "\1c") + (data (i32.const 2072) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") + (data (i32.const 2092) "\1c") + (data (i32.const 2104) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") + (data (i32.const 2124) ",") + (data (i32.const 2136) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") + (data (i32.const 2172) "\1c") + (data (i32.const 2184) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") + (data (i32.const 2204) "l") + (data (i32.const 2216) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") + (data (i32.const 2316) "\1c") + (data (i32.const 2328) "\01\00\00\00\04\00\00\00\00\d8\ff\df") + (data (i32.const 2348) ",") + (data (i32.const 2360) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") + (data (i32.const 2400) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -42,7 +69,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18236)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18812)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -173,7 +200,7 @@ if i32.const 0 local.get $0 - i32.const 18236 + i32.const 18812 i32.lt_u local.get $0 i32.load offset=8 @@ -219,7 +246,7 @@ i32.const 1 else local.get $1 - i32.const 1824 + i32.const 2400 i32.load i32.gt_u if @@ -233,7 +260,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 1828 + i32.const 2404 i32.add i32.load i32.const 32 @@ -838,10 +865,10 @@ if unreachable end - i32.const 18240 + i32.const 18816 i32.const 0 i32.store - i32.const 19808 + i32.const 20384 i32.const 0 i32.store loop $for-loop|0 @@ -852,7 +879,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18240 + i32.const 18816 i32.add i32.const 0 i32.store offset=4 @@ -870,7 +897,7 @@ i32.add i32.const 2 i32.shl - i32.const 18240 + i32.const 18816 i32.add i32.const 0 i32.store offset=96 @@ -888,13 +915,13 @@ br $for-loop|0 end end - i32.const 18240 - i32.const 19812 + i32.const 18816 + i32.const 20388 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18240 + i32.const 18816 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -973,7 +1000,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18236 + i32.const 18812 i32.lt_u if local.get $0 @@ -1063,7 +1090,7 @@ unreachable end local.get $0 - i32.const 18236 + i32.const 18812 i32.lt_u if local.get $0 @@ -1086,7 +1113,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18236 + i32.const 18812 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1973,107 +2000,107 @@ local.get $2 i32.store offset=2 ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/util/uri/encode (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.get $1 + (local $8 i32) + local.get $2 i32.const 1 i32.shl - local.set $6 + local.set $7 loop $while-continue|0 - local.get $1 - local.get $3 + local.get $2 + local.get $4 i32.gt_s if block $while-break|0 - local.get $3 - local.set $4 + local.get $4 + local.set $5 loop $do-continue|1 block $do-break|1 - local.get $3 + local.get $1 + local.get $4 i32.const 1 i32.shl - i32.const 1056 i32.add i32.load16_u - local.tee $2 + local.tee $3 i32.const 128 i32.ge_u br_if $do-break|1 - local.get $2 + local.get $3 i32.const 1468 i32.add i32.load8_u i32.eqz br_if $do-break|1 - local.get $1 - local.get $3 + local.get $2 + local.get $4 i32.const 1 i32.add - local.tee $3 + local.tee $4 i32.gt_s br_if $do-continue|1 end end - local.get $3 local.get $4 + local.get $5 i32.gt_s if + local.get $7 local.get $6 - local.get $5 - local.get $3 local.get $4 + local.get $5 i32.sub i32.const 1 i32.shl - local.tee $7 + local.tee $8 i32.add i32.lt_u if local.get $0 - local.get $5 - local.get $7 + local.get $6 + local.get $8 i32.add - local.tee $6 + local.tee $7 call $~lib/rt/itcms/__renew local.set $0 end local.get $0 - local.get $5 + local.get $6 i32.add - local.get $4 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 1056 i32.add - local.get $7 + local.get $8 call $~lib/memory/memory.copy - local.get $5 - local.get $7 + local.get $6 + local.get $8 i32.add - local.set $5 - local.get $1 - local.get $3 + local.set $6 + local.get $2 + local.get $4 i32.le_s br_if $while-break|0 end + local.get $7 local.get $6 - local.get $5 i32.const 6 i32.const 24 - local.get $2 + local.get $3 i32.const 55296 i32.ge_u if - local.get $2 + local.get $3 i32.const 57343 i32.le_u i32.const 0 - local.get $2 + local.get $3 i32.const 56320 i32.ge_u select @@ -2085,12 +2112,12 @@ call $~lib/builtins/abort unreachable end - local.get $2 + local.get $3 i32.const 56319 i32.le_u if (result i32) - local.get $1 - local.get $3 + local.get $2 + local.get $4 i32.le_s if i32.const 1616 @@ -2100,37 +2127,35 @@ call $~lib/builtins/abort unreachable end - local.get $3 i32.const 1 - i32.shl - i32.const 1056 - i32.add - i32.load16_u - local.set $4 - local.get $3 + local.get $1 + local.get $4 i32.const 1 i32.add - local.set $3 + local.tee $4 i32.const 1 - local.get $4 + i32.shl + i32.add + i32.load16_u + local.tee $5 i32.const 57343 i32.gt_u - local.get $4 + local.get $5 i32.const 56320 i32.lt_u select if i32.const 1616 i32.const 1664 - i32.const 86 + i32.const 85 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $5 i32.const 1023 i32.and - local.get $2 + local.get $3 i32.const 1023 i32.and i32.const 10 @@ -2139,44 +2164,44 @@ i32.const 65536 i32.add else - local.get $2 + local.get $3 end - local.set $2 + local.set $3 end - local.get $2 + local.get $3 i32.const 128 i32.lt_u select i32.add - local.tee $4 + local.tee $5 i32.lt_u if local.get $0 - local.get $4 + local.get $5 i32.const 15 i32.mul i32.const 10 i32.div_u - local.tee $6 + local.tee $7 call $~lib/rt/itcms/__renew local.set $0 end - local.get $2 + local.get $3 i32.const 128 i32.lt_u if local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 call $~lib/util/uri/storeHex else - local.get $2 + local.get $3 i32.const 2048 i32.lt_u if local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 i32.const 6 i32.shr_u i32.const 192 @@ -2184,36 +2209,36 @@ call $~lib/util/uri/storeHex else local.get $0 - local.get $2 + local.get $3 i32.const 65536 i32.lt_u if (result i32) local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $6 i32.const 6 i32.add else local.get $0 - local.get $5 - local.get $2 + local.get $6 + local.get $3 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex local.get $0 - local.get $5 + local.get $6 i32.const 6 i32.add - local.tee $4 - local.get $2 + local.tee $5 + local.get $3 i32.const 12 i32.shr_u i32.const 63 @@ -2221,12 +2246,12 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $4 + local.get $5 i32.const 6 i32.add end - local.tee $5 - local.get $2 + local.tee $6 + local.get $3 i32.const 6 i32.shr_u i32.const 63 @@ -2236,40 +2261,179 @@ call $~lib/util/uri/storeHex end local.get $0 - local.get $5 + local.get $6 i32.const 6 i32.add - local.tee $5 - local.get $2 + local.tee $6 + local.get $3 i32.const 63 i32.and i32.const 128 i32.or call $~lib/util/uri/storeHex end - local.get $5 + local.get $6 i32.const 6 i32.add - local.set $5 - local.get $3 + local.set $6 + local.get $4 i32.const 1 i32.add - local.set $3 + local.set $4 br $while-continue|0 end end end - local.get $5 local.get $6 + local.get $7 i32.lt_u if (result i32) local.get $0 - local.get $5 + local.get $6 call $~lib/rt/itcms/__renew else local.get $0 end ) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + call $~lib/util/uri/encode + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + if + i32.const 0 + return + end + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $2 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + return + end + block $__inlined_func$~lib/util/string/compareImpl (result i32) + local.get $0 + local.tee $3 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $3 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $2 + i32.const 1 + i32.sub + local.set $0 + local.get $2 + if + local.get $3 + i32.load16_u + local.tee $2 + local.get $1 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $2 + local.get $4 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz + ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid block $~lib/arraybuffer/ArrayBufferView @@ -2301,20 +2465,16 @@ ) (func $start:std/uri (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) global.get $~lib/memory/__stack_pointer i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1852 + i32.const 2428 i32.lt_s if - i32.const 18256 - i32.const 18304 + i32.const 18832 + i32.const 18880 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2329,7 +2489,7 @@ memory.size i32.const 16 i32.shl - i32.const 18236 + i32.const 18812 i32.sub i32.const 1 i32.shr_u @@ -2346,144 +2506,244 @@ global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 - block $__inlined_func$~lib/uri/encodeURIComponent (result i32) - i32.const 1056 - i32.const 1052 - i32.load + i32.const 1056 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 3 i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - br_if $__inlined_func$~lib/uri/encodeURIComponent - drop - local.get $1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1792 + i32.store offset=8 + i32.const 1792 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1792 + i32.store offset=4 + local.get $0 + i32.const 1792 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 4 i32.const 1 - i32.shl + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store offset=8 + i32.const 1824 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store offset=4 + local.get $0 + i32.const 1824 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 5 i32.const 1 - call $~lib/rt/itcms/__new - local.get $1 - call $~lib/util/uri/encode + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=8 + i32.const 1856 + call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1744 + i32.const 1856 i32.store offset=4 - block $__inlined_func$~lib/string/String.__eq (result i32) + local.get $0 + i32.const 1856 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 6 i32.const 1 - local.get $0 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1888 + i32.store offset=8 + i32.const 1888 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1888 + i32.store offset=4 + local.get $0 + i32.const 1888 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 i32.const 1744 - i32.eq - br_if $__inlined_func$~lib/string/String.__eq - drop + i32.const 7 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1984 + i32.store offset=8 + i32.const 1984 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2016 + i32.store offset=4 + local.get $0 + i32.const 2016 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $0 - i32.eqz - br_if $__inlined_func$~lib/string/String.__eq - drop + i32.const 1744 + i32.const 11 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2048 + i32.store offset=8 + i32.const 2048 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2080 + i32.store offset=4 + local.get $0 + i32.const 2080 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 + i32.const 1744 + i32.const 12 i32.const 1 - i32.shr_u - local.tee $1 - i32.const 1740 - i32.load + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2112 + i32.store offset=8 + i32.const 2112 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2144 + i32.store offset=4 + local.get $0 + i32.const 2144 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 13 i32.const 1 - i32.shr_u - i32.ne - br_if $__inlined_func$~lib/string/String.__eq - drop - block $__inlined_func$~lib/util/string/compareImpl (result i32) - i32.const 1744 - local.set $3 - local.get $0 - local.tee $2 - i32.const 7 - i32.and - i32.eqz - i32.const 0 - local.get $1 - local.tee $0 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $2 - i64.load - local.get $3 - i64.load - i64.eq - if - local.get $2 - i32.const 8 - i32.add - local.set $2 - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $0 - i32.const 4 - i32.sub - local.tee $0 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $0 - local.tee $1 - i32.const 1 - i32.sub - local.set $0 - local.get $1 - if - local.get $2 - i32.load16_u - local.tee $4 - local.get $3 - i32.load16_u - local.tee $1 - i32.ne - if - local.get $4 - local.get $1 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $2 - i32.const 2 - i32.add - local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2192 + i32.store offset=8 + i32.const 2192 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2224 + i32.store offset=4 + local.get $0 + i32.const 2224 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 2336 + i32.store offset=8 + i32.const 2336 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2368 + i32.store offset=4 + local.get $0 + i32.const 2368 + call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1792 + i32.const 1744 i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 18236 + i32.const 18812 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -2500,12 +2760,12 @@ end call $~lib/rt/itcms/step drop - loop $while-continue|12 + loop $while-continue|1 global.get $~lib/rt/itcms/state if call $~lib/rt/itcms/step drop - br $while-continue|12 + br $while-continue|1 end end global.get $~lib/rt/itcms/total diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 9cebe2dacb..fcef3f0ee7 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -1,17 +1,17 @@ // not escaped -// assert(encodeURIComponent("") == ""); -// assert(encodeURIComponent("a") == "a"); -// assert(encodeURIComponent("a1") == "a1"); -// assert(encodeURIComponent("ab_") == "ab_"); -// assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); +assert(encodeURIComponent("") == ""); +assert(encodeURIComponent("a") == "a"); +assert(encodeURIComponent("a1") == "a1"); +assert(encodeURIComponent("ab_") == "ab_"); +assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); -// // escaped +// escaped -// assert(encodeURIComponent("+") == "%2B"); -// assert(encodeURIComponent("?+") == "%3F%2B"); -// assert(encodeURIComponent("-?1.-") == "-%3F1.-"); -// assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); +assert(encodeURIComponent("+") == "%2B"); +assert(encodeURIComponent("?+") == "%3F%2B"); +assert(encodeURIComponent("-?1.-") == "-%3F1.-"); +assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); // assert(encodeURIComponent("\uD800")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 7636021bbb..8ca4e61780 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -12,7 +12,7 @@ (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -25,9 +25,22 @@ (data (i32.const 572) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") (data (i32.const 620) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 684) "0123456789ABCDEF") - (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") - (data (i32.const 748) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 800) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") + (data (i32.const 812) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") + (data (i32.const 844) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") + (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") + (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") + (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") + (data (i32.const 1100) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1148) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") + (data (i32.const 1180) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") + (data (i32.const 1292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") + (data (i32.const 1324) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") + (data (i32.const 1376) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -42,10 +55,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 800)) - (global $~lib/memory/__data_end i32 (i32.const 828)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17212)) - (global $~lib/memory/__heap_base i32 (i32.const 17212)) + (global $~lib/rt/__rtti_base i32 (i32.const 1376)) + (global $~lib/memory/__data_end i32 (i32.const 1404)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17788)) + (global $~lib/memory/__heap_base i32 (i32.const 17788)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3848,14 +3861,13 @@ local.get $1 local.get $4 i32.const 1 + i32.add + local.tee $4 + i32.const 1 i32.shl i32.add i32.load16_u local.set $10 - local.get $4 - i32.const 1 - i32.add - local.set $4 local.get $10 i32.const 56320 i32.lt_u @@ -3869,7 +3881,7 @@ if i32.const 592 i32.const 640 - i32.const 86 + i32.const 85 i32.const 11 call $~lib/builtins/abort unreachable @@ -4322,8 +4334,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17232 - i32.const 17280 + i32.const 17808 + i32.const 17856 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4372,7 +4384,259 @@ local.get $0 i32.store local.get $0 - i32.const 720 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 3 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 768 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 768 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 4 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 800 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 800 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 864 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 864 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 7 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 960 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 992 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 11 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1024 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1056 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 12 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1088 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1120 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 13 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1168 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1200 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1312 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1344 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4382,7 +4646,7 @@ i32.eqz if i32.const 0 - i32.const 768 + i32.const 720 i32.const 15 i32.const 1 call $~lib/builtins/abort From 44b7705afa89009b3acaaada300054b4eb183a13 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 11:19:12 +0200 Subject: [PATCH 34/87] minor opt --- std/assembly/util/uri.ts | 17 ++++--- tests/compiler/std/uri.optimized.wat | 69 ++++++++++++++++++++-------- tests/compiler/std/uri.untouched.wat | 56 +++++++++++++++++----- 3 files changed, 104 insertions(+), 38 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index e77ae9a51a..69b5a21f09 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -62,12 +62,17 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize outSize = offset + size; dst = __renew(dst, outSize); } - - memory.copy( - dst + offset, - src + (org << 1), - size - ); + if (size == 2) { + store(dst + offset, load(src + (org << 1))); + } else if (size == 4) { + store(dst + offset, load(src + (org << 1))); + } else { + memory.copy( + dst + offset, + src + (org << 1), + size + ); + } offset += size; if (i >= len) break; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 79798fa5bf..0dadcb751a 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2069,16 +2069,48 @@ call $~lib/rt/itcms/__renew local.set $0 end - local.get $0 - local.get $6 - i32.add - local.get $1 - local.get $5 - i32.const 1 - i32.shl - i32.add local.get $8 - call $~lib/memory/memory.copy + i32.const 2 + i32.eq + if + local.get $0 + local.get $6 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + else + local.get $8 + i32.const 4 + i32.eq + if + local.get $0 + local.get $6 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load + i32.store + else + local.get $0 + local.get $6 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + local.get $8 + call $~lib/memory/memory.copy + end + end local.get $6 local.get $8 i32.add @@ -2107,7 +2139,7 @@ if i32.const 1616 i32.const 1664 - i32.const 77 + i32.const 82 i32.const 9 call $~lib/builtins/abort unreachable @@ -2122,7 +2154,7 @@ if i32.const 1616 i32.const 1664 - i32.const 81 + i32.const 86 i32.const 11 call $~lib/builtins/abort unreachable @@ -2147,7 +2179,7 @@ if i32.const 1616 i32.const 1664 - i32.const 85 + i32.const 90 i32.const 11 call $~lib/builtins/abort unreachable @@ -2212,7 +2244,7 @@ local.get $3 i32.const 65536 i32.lt_u - if (result i32) + if local.get $0 local.get $6 local.get $3 @@ -2221,9 +2253,6 @@ i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $6 - i32.const 6 - i32.add else local.get $0 local.get $6 @@ -2237,7 +2266,7 @@ local.get $6 i32.const 6 i32.add - local.tee $5 + local.tee $6 local.get $3 i32.const 12 i32.shr_u @@ -2246,10 +2275,10 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $5 - i32.const 6 - i32.add end + local.get $6 + i32.const 6 + i32.add local.tee $6 local.get $3 i32.const 6 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 8ca4e61780..b61fa3a59d 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3800,16 +3800,48 @@ call $~lib/rt/itcms/__renew local.set $0 end - local.get $0 - local.get $5 - i32.add - local.get $1 - local.get $8 - i32.const 1 - i32.shl - i32.add local.get $11 - call $~lib/memory/memory.copy + i32.const 2 + i32.eq + if + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + else + local.get $11 + i32.const 4 + i32.eq + if + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + i32.load + i32.store + else + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $8 + i32.const 1 + i32.shl + i32.add + local.get $11 + call $~lib/memory/memory.copy + end + end local.get $5 local.get $11 i32.add @@ -3838,7 +3870,7 @@ if i32.const 592 i32.const 640 - i32.const 77 + i32.const 82 i32.const 9 call $~lib/builtins/abort unreachable @@ -3853,7 +3885,7 @@ if i32.const 592 i32.const 640 - i32.const 81 + i32.const 86 i32.const 11 call $~lib/builtins/abort unreachable @@ -3881,7 +3913,7 @@ if i32.const 592 i32.const 640 - i32.const 85 + i32.const 90 i32.const 11 call $~lib/builtins/abort unreachable From 632db8aa0c74a438b4d63c86218dc0bd6c507af1 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 11:28:05 +0200 Subject: [PATCH 35/87] refactor --- std/assembly/util/uri.ts | 12 ++++++------ tests/compiler/std/uri.optimized.wat | 10 +++++----- tests/compiler/std/uri.untouched.wat | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 69b5a21f09..ccb3590d55 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -44,8 +44,8 @@ function storeHex(dst: usize, offset: usize, ch: u32): void { store(dst + offset, hex, 2); // XX } -export function encode(dst: usize, src: usize, len: isize, table: usize): usize { - var i: isize = 0, offset: usize = 0, outSize = len << 1; +export function encode(dst: usize, src: usize, len: usize, table: usize): usize { + var i: usize = 0, offset: usize = 0, outSize = len << 1; while (i < len) { let org = i; let c: u32, c1: u32; @@ -57,19 +57,19 @@ export function encode(dst: usize, src: usize, len: isize, table: usize): usize } while (++i < len); if (i > org) { - let size = (i - org) << 1; + let size = (i - org) << 1; if (offset + size > outSize) { outSize = offset + size; dst = __renew(dst, outSize); } if (size == 2) { - store(dst + offset, load(src + (org << 1))); + store(dst + offset, load(src + (org << 1))); } else if (size == 4) { - store(dst + offset, load(src + (org << 1))); + store(dst + offset, load(src + (org << 1))); } else { memory.copy( dst + offset, - src + (org << 1), + src + (org << 1), size ); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 0dadcb751a..2d6ca05b3d 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2014,7 +2014,7 @@ loop $while-continue|0 local.get $2 local.get $4 - i32.gt_s + i32.gt_u if block $while-break|0 local.get $4 @@ -2042,13 +2042,13 @@ i32.const 1 i32.add local.tee $4 - i32.gt_s + i32.gt_u br_if $do-continue|1 end end local.get $4 local.get $5 - i32.gt_s + i32.gt_u if local.get $7 local.get $6 @@ -2117,7 +2117,7 @@ local.set $6 local.get $2 local.get $4 - i32.le_s + i32.le_u br_if $while-break|0 end local.get $7 @@ -2150,7 +2150,7 @@ if (result i32) local.get $2 local.get $4 - i32.le_s + i32.le_u if i32.const 1616 i32.const 1664 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index b61fa3a59d..26f88b5296 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3734,7 +3734,7 @@ loop $while-continue|0 local.get $4 local.get $2 - i32.lt_s + i32.lt_u local.set $7 local.get $7 if @@ -3769,7 +3769,7 @@ i32.add local.tee $4 local.get $2 - i32.lt_s + i32.lt_u local.set $11 local.get $11 br_if $do-continue|1 @@ -3777,7 +3777,7 @@ end local.get $4 local.get $8 - i32.gt_s + i32.gt_u if local.get $4 local.get $8 @@ -3848,7 +3848,7 @@ local.set $5 local.get $4 local.get $2 - i32.ge_s + i32.ge_u if br $while-break|0 end @@ -3881,7 +3881,7 @@ if local.get $4 local.get $2 - i32.ge_s + i32.ge_u if i32.const 592 i32.const 640 From aa26e2a91316e25f86715c1f16348d2c301d7346 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 11:33:34 +0200 Subject: [PATCH 36/87] minor opt --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 5 +++++ tests/compiler/std/uri.untouched.wat | 17 ++++++++++++----- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index ccb3590d55..8937262975 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -95,7 +95,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize let estSize = offset + (c < 0x80 ? 1 * 6 : 4 * 6); if (estSize > outSize) { - outSize = estSize * 15 / 10; + outSize = len > 1 ? estSize * 15 / 10 : estSize; dst = __renew(dst, outSize); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 2d6ca05b3d..75f1dc08ad 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2214,6 +2214,11 @@ i32.mul i32.const 10 i32.div_u + local.get $5 + local.get $2 + i32.const 1 + i32.gt_u + select local.tee $7 call $~lib/rt/itcms/__renew local.set $0 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 26f88b5296..d39544b3fa 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3951,11 +3951,18 @@ local.get $6 i32.gt_u if - local.get $11 - i32.const 15 - i32.mul - i32.const 10 - i32.div_u + local.get $2 + i32.const 1 + i32.gt_u + if (result i32) + local.get $11 + i32.const 15 + i32.mul + i32.const 10 + i32.div_u + else + local.get $11 + end local.set $6 local.get $0 local.get $6 From 4c812f3ae138cd41d66ca761165871ffa5b16757 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 11:47:48 +0200 Subject: [PATCH 37/87] refactoring --- std/assembly/util/uri.ts | 14 +++++++------- tests/compiler/std/uri.untouched.wat | 2 -- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 8937262975..e20ae131c3 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -36,10 +36,10 @@ function storeHex(dst: usize, offset: usize, ch: u32): void { 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]); - let hex = ( - (load(HEX_CHARS + ((ch >>> 4) & 0x0F))) | - (load(HEX_CHARS + ((ch >>> 0) & 0x0F)) << 16) - ); + let hex = + load(HEX_CHARS + (ch >> 4 & 0x0F)) | + load(HEX_CHARS + (ch & 0x0F)) << 16; + store(dst + offset, CharCode.PERCENT, 0); // % store(dst + offset, hex, 2); // XX } @@ -57,7 +57,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize } while (++i < len); if (i > org) { - let size = (i - org) << 1; + let size = i - org << 1; if (offset + size > outSize) { outSize = offset + size; dst = __renew(dst, outSize); @@ -113,10 +113,10 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize } else { storeHex(dst, offset, (c >> 18) | 0xF0); offset += 6; - storeHex(dst, offset, ((c >> 12) & 0x3F) | 0x80); + storeHex(dst, offset, (c >> 12 & 0x3F) | 0x80); offset += 6; } - storeHex(dst, offset, ((c >> 6) & 0x3F) | 0x80); + storeHex(dst, offset, (c >> 6 & 0x3F) | 0x80); offset += 6; } storeHex(dst, offset, (c & 0x3F) | 0x80); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index d39544b3fa..ee36c0871e 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3692,8 +3692,6 @@ i32.load8_u i32.const 684 local.get $2 - i32.const 0 - i32.shr_u i32.const 15 i32.and i32.add From 20e20655c05ed09c0b3a00bada5e2079563a55a9 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 11:58:10 +0200 Subject: [PATCH 38/87] better --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 6 ++---- tests/compiler/std/uri.untouched.wat | 6 ++---- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index e20ae131c3..69b646b52c 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -95,7 +95,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize let estSize = offset + (c < 0x80 ? 1 * 6 : 4 * 6); if (estSize > outSize) { - outSize = len > 1 ? estSize * 15 / 10 : estSize; + outSize = len > 1 ? estSize << 1 : estSize; dst = __renew(dst, outSize); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 75f1dc08ad..254cc0b107 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2210,10 +2210,8 @@ if local.get $0 local.get $5 - i32.const 15 - i32.mul - i32.const 10 - i32.div_u + i32.const 1 + i32.shl local.get $5 local.get $2 i32.const 1 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index ee36c0871e..216ee98eb7 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3954,10 +3954,8 @@ i32.gt_u if (result i32) local.get $11 - i32.const 15 - i32.mul - i32.const 10 - i32.div_u + i32.const 1 + i32.shl else local.get $11 end From b1fe14274823de6ed02d568747212e68da7d5162 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 12:39:40 +0200 Subject: [PATCH 39/87] more tests --- tests/compiler/std/uri.optimized.wat | 152 +++++++++++++++++++++++---- tests/compiler/std/uri.ts | 10 ++ tests/compiler/std/uri.untouched.wat | 134 +++++++++++++++++++++-- 3 files changed, 269 insertions(+), 27 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 254cc0b107..b0c67a8483 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -58,7 +58,23 @@ (data (i32.const 2328) "\01\00\00\00\04\00\00\00\00\d8\ff\df") (data (i32.const 2348) ",") (data (i32.const 2360) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") - (data (i32.const 2400) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2396) "\1c") + (data (i32.const 2408) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") + (data (i32.const 2428) "L") + (data (i32.const 2440) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") + (data (i32.const 2508) "\1c") + (data (i32.const 2520) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") + (data (i32.const 2540) "<") + (data (i32.const 2552) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") + (data (i32.const 2604) ",") + (data (i32.const 2616) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") + (data (i32.const 2652) "L") + (data (i32.const 2664) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") + (data (i32.const 2732) "l") + (data (i32.const 2744) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 2844) "\8c") + (data (i32.const 2856) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 2992) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -69,7 +85,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18812)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19404)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -200,7 +216,7 @@ if i32.const 0 local.get $0 - i32.const 18812 + i32.const 19404 i32.lt_u local.get $0 i32.load offset=8 @@ -246,7 +262,7 @@ i32.const 1 else local.get $1 - i32.const 2400 + i32.const 2992 i32.load i32.gt_u if @@ -260,7 +276,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2404 + i32.const 2996 i32.add i32.load i32.const 32 @@ -865,10 +881,10 @@ if unreachable end - i32.const 18816 + i32.const 19408 i32.const 0 i32.store - i32.const 20384 + i32.const 20976 i32.const 0 i32.store loop $for-loop|0 @@ -879,7 +895,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18816 + i32.const 19408 i32.add i32.const 0 i32.store offset=4 @@ -897,7 +913,7 @@ i32.add i32.const 2 i32.shl - i32.const 18816 + i32.const 19408 i32.add i32.const 0 i32.store offset=96 @@ -915,13 +931,13 @@ br $for-loop|0 end end - i32.const 18816 - i32.const 20388 + i32.const 19408 + i32.const 20980 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18816 + i32.const 19408 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1000,7 +1016,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18812 + i32.const 19404 i32.lt_u if local.get $0 @@ -1090,7 +1106,7 @@ unreachable end local.get $0 - i32.const 18812 + i32.const 19404 i32.lt_u if local.get $0 @@ -1113,7 +1129,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18812 + i32.const 19404 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2502,11 +2518,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2428 + i32.const 3020 i32.lt_s if - i32.const 18832 - i32.const 18880 + i32.const 19424 + i32.const 19472 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2521,7 +2537,7 @@ memory.size i32.const 16 i32.shl - i32.const 18812 + i32.const 19404 i32.sub i32.const 1 i32.shr_u @@ -2775,7 +2791,103 @@ call $~lib/builtins/abort unreachable end - i32.const 18812 + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=8 + i32.const 2416 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2448 + i32.store offset=4 + local.get $0 + i32.const 2448 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 16 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2528 + i32.store offset=8 + i32.const 2528 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2560 + i32.store offset=4 + local.get $0 + i32.const 2560 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 18 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2624 + i32.store offset=8 + i32.const 2624 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2672 + i32.store offset=4 + local.get $0 + i32.const 2672 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 20 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2752 + i32.store offset=8 + i32.const 2752 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2864 + i32.store offset=4 + local.get $0 + i32.const 2864 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 19404 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index fcef3f0ee7..69b923719e 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -13,6 +13,16 @@ assert(encodeURIComponent("?+") == "%3F%2B"); assert(encodeURIComponent("-?1.-") == "-%3F1.-"); assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); +assert(encodeURIComponent('\uDA7B\uDC01-\uDA50\uDC02') == "%F2%AE%B0%81-%F2%A4%80%82"); +// line terminators +assert(encodeURIComponent("\n\t\v\f\r") == "%0A%09%0B%0C%0D"); +// From test262/test/built-ins/encodeURIComponent/S15.1.3.4_A4_T1.js +assert(encodeURIComponent(";/?:@&=+$,") == "%3B%2F%3F%3A%40%26%3D%2B%24%2C"); +// From test262/test/built-ins/encodeURIComponent/S15.1.3.4_A4_T4.js +assert( + encodeURIComponent("http://en.wikipedia.org/wiki/UTF-8#Description") == + "http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FUTF-8%23Description" +); // assert(encodeURIComponent("\uD800")); // malformed URI sequence // assert(encodeURIComponent("\uDFFF")); // malformed URI sequence diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 216ee98eb7..43c1757580 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -40,7 +40,15 @@ (data (i32.const 1180) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") (data (i32.const 1292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") (data (i32.const 1324) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") - (data (i32.const 1376) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1372) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") + (data (i32.const 1404) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1484) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") + (data (i32.const 1516) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1580) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") + (data (i32.const 1628) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") + (data (i32.const 1708) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") + (data (i32.const 1820) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") + (data (i32.const 1968) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -55,10 +63,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 1376)) - (global $~lib/memory/__data_end i32 (i32.const 1404)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17788)) - (global $~lib/memory/__heap_base i32 (i32.const 17788)) + (global $~lib/rt/__rtti_base i32 (i32.const 1968)) + (global $~lib/memory/__data_end i32 (i32.const 1996)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18380)) + (global $~lib/memory/__heap_base i32 (i32.const 18380)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -4369,8 +4377,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 17808 - i32.const 17856 + i32.const 18400 + i32.const 18448 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4687,6 +4695,118 @@ call $~lib/builtins/abort unreachable end + i32.const 1392 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1424 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 16 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1504 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1536 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 18 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1600 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1648 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 20 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1728 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1840 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__heap_base global.set $~lib/memory/__stack_pointer call $~lib/rt/itcms/__collect From 67c1b91e75e601e01f2f56832878b5910a4db218 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 13:33:07 +0200 Subject: [PATCH 40/87] fix --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 2 +- tests/compiler/std/uri.untouched.wat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 69b646b52c..3c11b1aca2 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -51,7 +51,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize let c: u32, c1: u32; do { c = load(src + (i << 1)); - if (c < 0x80) { + if (c < 0x7F) { if (!load(table + c)) break; } else break; } while (++i < len); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index b0c67a8483..818c05d9ac 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2044,7 +2044,7 @@ i32.add i32.load16_u local.tee $3 - i32.const 128 + i32.const 127 i32.ge_u br_if $do-break|1 local.get $3 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 43c1757580..c42d6c1366 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3756,7 +3756,7 @@ i32.load16_u local.set $9 local.get $9 - i32.const 128 + i32.const 127 i32.lt_u if local.get $3 From 1ed516d0041df601e0b4a0f644be9a26d53245ea Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 13:48:48 +0200 Subject: [PATCH 41/87] more tests --- tests/compiler/std/uri.optimized.wat | 274 +++++++++++++++++++-------- tests/compiler/std/uri.ts | 5 + tests/compiler/std/uri.untouched.wat | 218 ++++++++++++++++----- 3 files changed, 377 insertions(+), 120 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 818c05d9ac..4b078d62c5 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -39,42 +39,62 @@ (data (i32.const 1868) "\\") (data (i32.const 1880) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") (data (i32.const 1964) "\1c") - (data (i32.const 1976) "\01\00\00\00\02\00\00\00+") + (data (i32.const 1976) "\01\00\00\00\02") (data (i32.const 1996) "\1c") - (data (i32.const 2008) "\01\00\00\00\06\00\00\00%\002\00B") + (data (i32.const 2008) "\01\00\00\00\06\00\00\00%\000\000") (data (i32.const 2028) "\1c") - (data (i32.const 2040) "\01\00\00\00\04\00\00\00?\00+") + (data (i32.const 2040) "\01\00\00\00\02\00\00\00+") (data (i32.const 2060) "\1c") - (data (i32.const 2072) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") + (data (i32.const 2072) "\01\00\00\00\06\00\00\00%\002\00B") (data (i32.const 2092) "\1c") - (data (i32.const 2104) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") + (data (i32.const 2104) "\01\00\00\00\06\00\00\00#\000\00=") (data (i32.const 2124) ",") - (data (i32.const 2136) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") + (data (i32.const 2136) "\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D") (data (i32.const 2172) "\1c") - (data (i32.const 2184) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") - (data (i32.const 2204) "l") - (data (i32.const 2216) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") + (data (i32.const 2184) "\01\00\00\00\n\00\00\00 \001\002\003\00 ") + (data (i32.const 2204) ",") + (data (i32.const 2216) "\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000") + (data (i32.const 2252) "\1c") + (data (i32.const 2264) "\01\00\00\00\04\00\00\00?\00+") + (data (i32.const 2284) "\1c") + (data (i32.const 2296) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") (data (i32.const 2316) "\1c") - (data (i32.const 2328) "\01\00\00\00\04\00\00\00\00\d8\ff\df") + (data (i32.const 2328) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") (data (i32.const 2348) ",") - (data (i32.const 2360) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") + (data (i32.const 2360) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") (data (i32.const 2396) "\1c") - (data (i32.const 2408) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") - (data (i32.const 2428) "L") - (data (i32.const 2440) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") - (data (i32.const 2508) "\1c") - (data (i32.const 2520) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") - (data (i32.const 2540) "<") - (data (i32.const 2552) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") - (data (i32.const 2604) ",") - (data (i32.const 2616) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") - (data (i32.const 2652) "L") - (data (i32.const 2664) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") - (data (i32.const 2732) "l") - (data (i32.const 2744) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 2844) "\8c") - (data (i32.const 2856) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 2992) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2408) "\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") + (data (i32.const 2428) "\\") + (data (i32.const 2440) "\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E") + (data (i32.const 2524) "\1c") + (data (i32.const 2536) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") + (data (i32.const 2556) "l") + (data (i32.const 2568) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") + (data (i32.const 2668) "\1c") + (data (i32.const 2680) "\01\00\00\00\06\00\00\00~\00\7f\00\80") + (data (i32.const 2700) ",") + (data (i32.const 2712) "\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000") + (data (i32.const 2748) "\1c") + (data (i32.const 2760) "\01\00\00\00\04\00\00\00\00\d8\ff\df") + (data (i32.const 2780) ",") + (data (i32.const 2792) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") + (data (i32.const 2828) "\1c") + (data (i32.const 2840) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") + (data (i32.const 2860) "L") + (data (i32.const 2872) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") + (data (i32.const 2940) "\1c") + (data (i32.const 2952) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") + (data (i32.const 2972) "<") + (data (i32.const 2984) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") + (data (i32.const 3036) ",") + (data (i32.const 3048) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") + (data (i32.const 3084) "L") + (data (i32.const 3096) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") + (data (i32.const 3164) "l") + (data (i32.const 3176) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 3276) "\8c") + (data (i32.const 3288) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 3424) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -85,7 +105,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19404)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19836)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -216,7 +236,7 @@ if i32.const 0 local.get $0 - i32.const 19404 + i32.const 19836 i32.lt_u local.get $0 i32.load offset=8 @@ -262,7 +282,7 @@ i32.const 1 else local.get $1 - i32.const 2992 + i32.const 3424 i32.load i32.gt_u if @@ -276,7 +296,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 2996 + i32.const 3428 i32.add i32.load i32.const 32 @@ -881,10 +901,10 @@ if unreachable end - i32.const 19408 + i32.const 19840 i32.const 0 i32.store - i32.const 20976 + i32.const 21408 i32.const 0 i32.store loop $for-loop|0 @@ -895,7 +915,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 19408 + i32.const 19840 i32.add i32.const 0 i32.store offset=4 @@ -913,7 +933,7 @@ i32.add i32.const 2 i32.shl - i32.const 19408 + i32.const 19840 i32.add i32.const 0 i32.store offset=96 @@ -931,13 +951,13 @@ br $for-loop|0 end end - i32.const 19408 - i32.const 20980 + i32.const 19840 + i32.const 21412 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 19408 + i32.const 19840 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1016,7 +1036,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 19404 + i32.const 19836 i32.lt_u if local.get $0 @@ -1106,7 +1126,7 @@ unreachable end local.get $0 - i32.const 19404 + i32.const 19836 i32.lt_u if local.get $0 @@ -1129,7 +1149,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 19404 + i32.const 19836 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2518,11 +2538,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3020 + i32.const 3452 i32.lt_s if - i32.const 19424 - i32.const 19472 + i32.const 19856 + i32.const 19904 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2537,7 +2557,7 @@ memory.size i32.const 16 i32.shl - i32.const 19404 + i32.const 19836 i32.sub i32.const 1 i32.shr_u @@ -2721,20 +2741,11 @@ end global.get $~lib/memory/__stack_pointer i32.const 2112 - i32.store offset=8 + i32.store i32.const 2112 call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer i32.const 2144 - i32.store offset=4 - local.get $0 - i32.const 2144 - call $~lib/string/String.__eq - i32.eqz + i32.eq if i32.const 0 i32.const 1744 @@ -2745,24 +2756,39 @@ end global.get $~lib/memory/__stack_pointer i32.const 2192 - i32.store offset=8 + i32.store i32.const 2192 call $~lib/uri/encodeURIComponent + i32.const 2224 + i32.eq + if + i32.const 0 + i32.const 1744 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2272 + i32.store offset=8 + i32.const 2272 + call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2224 + i32.const 2304 i32.store offset=4 local.get $0 - i32.const 2224 + i32.const 2304 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1744 - i32.const 14 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable @@ -2786,7 +2812,7 @@ if i32.const 0 i32.const 1744 - i32.const 15 + i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable @@ -2810,25 +2836,25 @@ if i32.const 0 i32.const 1744 - i32.const 16 + i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2528 + i32.const 2544 i32.store offset=8 - i32.const 2528 + i32.const 2544 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2560 + i32.const 2576 i32.store offset=4 local.get $0 - i32.const 2560 + i32.const 2576 call $~lib/string/String.__eq i32.eqz if @@ -2840,19 +2866,43 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2624 + i32.const 2688 + i32.store offset=8 + i32.const 2688 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2720 + i32.store offset=4 + local.get $0 + i32.const 2720 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 19 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2768 i32.store offset=8 - i32.const 2624 + i32.const 2768 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2672 + i32.const 2800 i32.store offset=4 local.get $0 - i32.const 2672 + i32.const 2800 call $~lib/string/String.__eq i32.eqz if @@ -2864,30 +2914,102 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2752 + i32.const 2848 i32.store offset=8 - i32.const 2752 + i32.const 2848 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2864 + i32.const 2880 i32.store offset=4 local.get $0 - i32.const 2864 + i32.const 2880 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1744 - i32.const 22 + i32.const 21 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2960 + i32.store offset=8 + i32.const 2960 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2992 + i32.store offset=4 + local.get $0 + i32.const 2992 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 23 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3056 + i32.store offset=8 + i32.const 3056 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3104 + i32.store offset=4 + local.get $0 + i32.const 3104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3184 + i32.store offset=8 + i32.const 3184 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3296 + i32.store offset=4 + local.get $0 + i32.const 3296 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1744 + i32.const 27 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 19404 + i32.const 19836 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 69b923719e..f8518e8fca 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -8,10 +8,15 @@ assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafg // escaped +assert(encodeURIComponent("\0") == "%00"); assert(encodeURIComponent("+") == "%2B"); +assert(encodeURIComponent("#0=") !== "%230%3D"); +assert(encodeURIComponent(" 123 ") !== "%20123%20"); assert(encodeURIComponent("?+") == "%3F%2B"); assert(encodeURIComponent("-?1.-") == "-%3F1.-"); +assert(encodeURIComponent("🇭🇺🍎") == "%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E"); assert(encodeURIComponent("안녕하세요") == "%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94"); +assert(encodeURIComponent("\x7E\x7F\x80") == "~%7F%C2%80"); assert(encodeURIComponent("\uD800\uDFFF") == "%F0%90%8F%BF"); assert(encodeURIComponent('\uDA7B\uDC01-\uDA50\uDC02') == "%F2%AE%B0%81-%F2%A4%80%82"); // line terminators diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index c42d6c1366..481fefb2b5 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -30,25 +30,35 @@ (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") (data (i32.const 812) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") (data (i32.const 844) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") - (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") - (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") - (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") - (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") - (data (i32.const 1100) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1148) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") - (data (i32.const 1180) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") - (data (i32.const 1292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") - (data (i32.const 1324) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") - (data (i32.const 1372) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") - (data (i32.const 1404) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1484) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") - (data (i32.const 1516) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1580) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") - (data (i32.const 1628) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") - (data (i32.const 1708) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") - (data (i32.const 1820) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") - (data (i32.const 1968) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\000\000\00\00\00\00\00\00\00") + (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00#\000\00=\00\00\00\00\00\00\00") + (data (i32.const 1100) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1148) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00 \001\002\003\00 \00\00\00") + (data (i32.const 1180) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") + (data (i32.const 1260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") + (data (i32.const 1292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") + (data (i32.const 1324) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1372) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") + (data (i32.const 1404) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E\00\00\00\00\00") + (data (i32.const 1500) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") + (data (i32.const 1532) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") + (data (i32.const 1644) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00~\00\7f\00\80\00\00\00\00\00\00\00") + (data (i32.const 1676) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000\00\00\00\00\00\00\00\00\00") + (data (i32.const 1724) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") + (data (i32.const 1756) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") + (data (i32.const 1804) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") + (data (i32.const 1836) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1916) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") + (data (i32.const 1948) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2012) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") + (data (i32.const 2060) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") + (data (i32.const 2140) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") + (data (i32.const 2252) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") + (data (i32.const 2400) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -63,10 +73,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 1968)) - (global $~lib/memory/__data_end i32 (i32.const 1996)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18380)) - (global $~lib/memory/__heap_base i32 (i32.const 18380)) + (global $~lib/rt/__rtti_base i32 (i32.const 2400)) + (global $~lib/memory/__data_end i32 (i32.const 2428)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18812)) + (global $~lib/memory/__heap_base i32 (i32.const 18812)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -4377,8 +4387,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 18400 - i32.const 18448 + i32.const 18832 + i32.const 18880 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4615,6 +4625,42 @@ local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 + i32.store + local.get $0 + call $~lib/uri/encodeURIComponent + i32.const 1120 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 13 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1168 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $~lib/uri/encodeURIComponent + i32.const 1200 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1248 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 i32.store offset=8 local.get $0 call $~lib/uri/encodeURIComponent @@ -4623,7 +4669,7 @@ local.get $0 i32.store local.get $0 - i32.const 1120 + i32.const 1280 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4634,12 +4680,12 @@ if i32.const 0 i32.const 720 - i32.const 13 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1168 + i32.const 1312 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4651,7 +4697,7 @@ local.get $0 i32.store local.get $0 - i32.const 1200 + i32.const 1344 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4662,12 +4708,12 @@ if i32.const 0 i32.const 720 - i32.const 14 + i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1312 + i32.const 1392 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4679,7 +4725,7 @@ local.get $0 i32.store local.get $0 - i32.const 1344 + i32.const 1424 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4690,12 +4736,12 @@ if i32.const 0 i32.const 720 - i32.const 15 + i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1392 + i32.const 1520 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4707,7 +4753,7 @@ local.get $0 i32.store local.get $0 - i32.const 1424 + i32.const 1552 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4718,12 +4764,12 @@ if i32.const 0 i32.const 720 - i32.const 16 + i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1504 + i32.const 1664 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4735,7 +4781,7 @@ local.get $0 i32.store local.get $0 - i32.const 1536 + i32.const 1696 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4746,12 +4792,12 @@ if i32.const 0 i32.const 720 - i32.const 18 + i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1600 + i32.const 1744 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4763,7 +4809,7 @@ local.get $0 i32.store local.get $0 - i32.const 1648 + i32.const 1776 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4779,7 +4825,7 @@ call $~lib/builtins/abort unreachable end - i32.const 1728 + i32.const 1824 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4791,7 +4837,7 @@ local.get $0 i32.store local.get $0 - i32.const 1840 + i32.const 1856 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4802,7 +4848,91 @@ if i32.const 0 i32.const 720 - i32.const 22 + i32.const 21 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1936 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1968 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 23 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2032 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2080 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2160 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2272 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 720 + i32.const 27 i32.const 1 call $~lib/builtins/abort unreachable From cbd5ea4f45832a19c0407873d97e399801ce0e72 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 16:17:12 +0200 Subject: [PATCH 42/87] invert tables for better memory packing --- std/assembly/uri.ts | 6 ++--- std/assembly/util/uri.ts | 37 ++++++++++++++-------------- tests/compiler/std/uri.optimized.wat | 6 +++-- tests/compiler/std/uri.untouched.wat | 7 +++--- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index 0340475674..5b72154dab 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -1,10 +1,10 @@ -import { encode, URI_SAFE, URL_SAFE } from "./util/uri"; +import { encode, URI_UNSAFE, URL_UNSAFE } from "./util/uri"; export function encodeURI(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = encode(result, changetype(str), len, URI_SAFE); + result = encode(result, changetype(str), len, URI_UNSAFE); return changetype(result); } @@ -12,6 +12,6 @@ export function encodeURIComponent(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = encode(result, changetype(str), len, URL_SAFE); + result = encode(result, changetype(str), len, URL_UNSAFE); return changetype(result); } diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 3c11b1aca2..c008bf3149 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -6,27 +6,27 @@ import { E_URI_MALFORMED } from "./error"; import { CharCode } from "./string"; // @ts-ignore: decorator -@lazy export const URI_SAFE = memory.data([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, +@lazy export const URI_UNSAFE = memory.data([ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 ]); // @ts-ignore: decorator -@lazy export const URL_SAFE = memory.data([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1 +@lazy export const URL_UNSAFE = memory.data([ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 ]); function storeHex(dst: usize, offset: usize, ch: u32): void { @@ -52,7 +52,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize do { c = load(src + (i << 1)); if (c < 0x7F) { - if (!load(table + c)) break; + if (load(table + c)) break; } else break; } while (++i < len); @@ -127,6 +127,5 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize if (outSize > offset) { dst = __renew(dst, offset); } - // trace(changetype(dst)); return dst; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 4b078d62c5..ba3f1a77e6 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -22,7 +22,10 @@ (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data (i32.const 1404) "<") (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1501) "\01\00\00\00\00\00\01\01\01\01\00\00\01\01\00\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\01") + (data (i32.const 1468) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 1526) "\01\01\01\01\01\01\01") + (data (i32.const 1559) "\01\01\01\01\00\01") + (data (i32.const 1591) "\01\01\01") (data (i32.const 1596) ",") (data (i32.const 1608) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") (data (i32.const 1644) "<") @@ -2071,7 +2074,6 @@ i32.const 1468 i32.add i32.load8_u - i32.eqz br_if $do-break|1 local.get $2 local.get $4 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 481fefb2b5..0ead5a7d59 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -21,7 +21,7 @@ (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 444) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\01\01\01\01\00\00\01\01\00\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\01") + (data (i32.const 444) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") (data (i32.const 572) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") (data (i32.const 620) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 684) "0123456789ABCDEF") @@ -72,7 +72,7 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/uri/URL_SAFE i32 (i32.const 444)) + (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) (global $~lib/rt/__rtti_base i32 (i32.const 2400)) (global $~lib/memory/__data_end i32 (i32.const 2428)) (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18812)) @@ -3773,7 +3773,6 @@ local.get $9 i32.add i32.load8_u - i32.eqz if br $do-break|1 end @@ -4125,7 +4124,7 @@ local.get $2 local.get $0 local.get $1 - global.get $~lib/util/uri/URL_SAFE + global.get $~lib/util/uri/URL_UNSAFE call $~lib/util/uri/encode local.set $2 local.get $2 From 953c43b0dd7e7a7e771b4b71d47b7c98f9f26cf3 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 16:34:16 +0200 Subject: [PATCH 43/87] even more smaller --- std/assembly/util/uri.ts | 20 +- tests/compiler/std/uri.optimized.wat | 376 ++++++++++++++------------- tests/compiler/std/uri.untouched.wat | 222 ++++++++-------- 3 files changed, 313 insertions(+), 305 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index c008bf3149..5a863fd786 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -7,26 +7,26 @@ import { CharCode } from "./string"; // @ts-ignore: decorator @lazy export const URI_UNSAFE = memory.data([ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* skip 32 + 1 head slots + */ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, /* + skip 128 + 1 tail slots */ ]); // @ts-ignore: decorator @lazy export const URL_UNSAFE = memory.data([ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, +/* skip 32 + 1 head slots + */ 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, /* + skip 128 + 1 tail slots */ ]); function storeHex(dst: usize, offset: usize, ch: u32): void { @@ -51,8 +51,8 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize let c: u32, c1: u32; do { c = load(src + (i << 1)); - if (c < 0x7F) { - if (load(table + c)) break; + if ((c - 33) < 0x7F - 33) { + if (load(table + (c - 33))) break; } else break; } while (++i < len); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index ba3f1a77e6..63d41e598c 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -22,82 +22,82 @@ (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data (i32.const 1404) "<") (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1468) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01") - (data (i32.const 1526) "\01\01\01\01\01\01\01") - (data (i32.const 1559) "\01\01\01\01\00\01") - (data (i32.const 1591) "\01\01\01") - (data (i32.const 1596) ",") - (data (i32.const 1608) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") - (data (i32.const 1644) "<") - (data (i32.const 1656) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1708) "0123456789ABCDEF") - (data (i32.const 1724) ",") - (data (i32.const 1736) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1469) "\01\01\01\01\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 1493) "\01\01\01\01\01\01\01") + (data (i32.const 1526) "\01\01\01\01\00\01") + (data (i32.const 1558) "\01\01\01") + (data (i32.const 1564) ",") + (data (i32.const 1576) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") + (data (i32.const 1612) "<") + (data (i32.const 1624) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1676) "0123456789ABCDEF") + (data (i32.const 1692) ",") + (data (i32.const 1704) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1740) "\1c") + (data (i32.const 1752) "\01\00\00\00\02\00\00\00a") (data (i32.const 1772) "\1c") - (data (i32.const 1784) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1784) "\01\00\00\00\04\00\00\00a\001") (data (i32.const 1804) "\1c") - (data (i32.const 1816) "\01\00\00\00\04\00\00\00a\001") - (data (i32.const 1836) "\1c") - (data (i32.const 1848) "\01\00\00\00\06\00\00\00a\00b\00_") - (data (i32.const 1868) "\\") - (data (i32.const 1880) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 1816) "\01\00\00\00\06\00\00\00a\00b\00_") + (data (i32.const 1836) "\\") + (data (i32.const 1848) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 1932) "\1c") + (data (i32.const 1944) "\01\00\00\00\02") (data (i32.const 1964) "\1c") - (data (i32.const 1976) "\01\00\00\00\02") + (data (i32.const 1976) "\01\00\00\00\06\00\00\00%\000\000") (data (i32.const 1996) "\1c") - (data (i32.const 2008) "\01\00\00\00\06\00\00\00%\000\000") + (data (i32.const 2008) "\01\00\00\00\02\00\00\00+") (data (i32.const 2028) "\1c") - (data (i32.const 2040) "\01\00\00\00\02\00\00\00+") + (data (i32.const 2040) "\01\00\00\00\06\00\00\00%\002\00B") (data (i32.const 2060) "\1c") - (data (i32.const 2072) "\01\00\00\00\06\00\00\00%\002\00B") - (data (i32.const 2092) "\1c") - (data (i32.const 2104) "\01\00\00\00\06\00\00\00#\000\00=") - (data (i32.const 2124) ",") - (data (i32.const 2136) "\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D") - (data (i32.const 2172) "\1c") - (data (i32.const 2184) "\01\00\00\00\n\00\00\00 \001\002\003\00 ") - (data (i32.const 2204) ",") - (data (i32.const 2216) "\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000") + (data (i32.const 2072) "\01\00\00\00\06\00\00\00#\000\00=") + (data (i32.const 2092) ",") + (data (i32.const 2104) "\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D") + (data (i32.const 2140) "\1c") + (data (i32.const 2152) "\01\00\00\00\n\00\00\00 \001\002\003\00 ") + (data (i32.const 2172) ",") + (data (i32.const 2184) "\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000") + (data (i32.const 2220) "\1c") + (data (i32.const 2232) "\01\00\00\00\04\00\00\00?\00+") (data (i32.const 2252) "\1c") - (data (i32.const 2264) "\01\00\00\00\04\00\00\00?\00+") + (data (i32.const 2264) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") (data (i32.const 2284) "\1c") - (data (i32.const 2296) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") - (data (i32.const 2316) "\1c") - (data (i32.const 2328) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") - (data (i32.const 2348) ",") - (data (i32.const 2360) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") - (data (i32.const 2396) "\1c") - (data (i32.const 2408) "\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") - (data (i32.const 2428) "\\") - (data (i32.const 2440) "\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E") - (data (i32.const 2524) "\1c") - (data (i32.const 2536) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") - (data (i32.const 2556) "l") - (data (i32.const 2568) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") - (data (i32.const 2668) "\1c") - (data (i32.const 2680) "\01\00\00\00\06\00\00\00~\00\7f\00\80") - (data (i32.const 2700) ",") - (data (i32.const 2712) "\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000") - (data (i32.const 2748) "\1c") - (data (i32.const 2760) "\01\00\00\00\04\00\00\00\00\d8\ff\df") - (data (i32.const 2780) ",") - (data (i32.const 2792) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") - (data (i32.const 2828) "\1c") - (data (i32.const 2840) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") - (data (i32.const 2860) "L") - (data (i32.const 2872) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") - (data (i32.const 2940) "\1c") - (data (i32.const 2952) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") - (data (i32.const 2972) "<") - (data (i32.const 2984) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") - (data (i32.const 3036) ",") - (data (i32.const 3048) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") - (data (i32.const 3084) "L") - (data (i32.const 3096) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") - (data (i32.const 3164) "l") - (data (i32.const 3176) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 3276) "\8c") - (data (i32.const 3288) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 3424) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 2296) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") + (data (i32.const 2316) ",") + (data (i32.const 2328) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") + (data (i32.const 2364) "\1c") + (data (i32.const 2376) "\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") + (data (i32.const 2396) "\\") + (data (i32.const 2408) "\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E") + (data (i32.const 2492) "\1c") + (data (i32.const 2504) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") + (data (i32.const 2524) "l") + (data (i32.const 2536) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") + (data (i32.const 2636) "\1c") + (data (i32.const 2648) "\01\00\00\00\06\00\00\00~\00\7f\00\80") + (data (i32.const 2668) ",") + (data (i32.const 2680) "\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000") + (data (i32.const 2716) "\1c") + (data (i32.const 2728) "\01\00\00\00\04\00\00\00\00\d8\ff\df") + (data (i32.const 2748) ",") + (data (i32.const 2760) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") + (data (i32.const 2796) "\1c") + (data (i32.const 2808) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") + (data (i32.const 2828) "L") + (data (i32.const 2840) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") + (data (i32.const 2908) "\1c") + (data (i32.const 2920) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") + (data (i32.const 2940) "<") + (data (i32.const 2952) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") + (data (i32.const 3004) ",") + (data (i32.const 3016) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") + (data (i32.const 3052) "L") + (data (i32.const 3064) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") + (data (i32.const 3132) "l") + (data (i32.const 3144) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 3244) "\8c") + (data (i32.const 3256) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 3392) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -108,7 +108,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19836)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19804)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -127,7 +127,7 @@ call $~lib/rt/itcms/__visit i32.const 1088 call $~lib/rt/itcms/__visit - i32.const 1616 + i32.const 1584 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 @@ -239,7 +239,7 @@ if i32.const 0 local.get $0 - i32.const 19836 + i32.const 19804 i32.lt_u local.get $0 i32.load offset=8 @@ -285,7 +285,7 @@ i32.const 1 else local.get $1 - i32.const 3424 + i32.const 3392 i32.load i32.gt_u if @@ -299,7 +299,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 3428 + i32.const 3396 i32.add i32.load i32.const 32 @@ -904,10 +904,10 @@ if unreachable end - i32.const 19840 + i32.const 19808 i32.const 0 i32.store - i32.const 21408 + i32.const 21376 i32.const 0 i32.store loop $for-loop|0 @@ -918,7 +918,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 19840 + i32.const 19808 i32.add i32.const 0 i32.store offset=4 @@ -936,7 +936,7 @@ i32.add i32.const 2 i32.shl - i32.const 19840 + i32.const 19808 i32.add i32.const 0 i32.store offset=96 @@ -954,13 +954,13 @@ br $for-loop|0 end end - i32.const 19840 - i32.const 21412 + i32.const 19808 + i32.const 21380 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 19840 + i32.const 19808 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1039,7 +1039,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 19836 + i32.const 19804 i32.lt_u if local.get $0 @@ -1129,7 +1129,7 @@ unreachable end local.get $0 - i32.const 19836 + i32.const 19804 i32.lt_u if local.get $0 @@ -1152,7 +1152,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 19836 + i32.const 19804 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2016,13 +2016,13 @@ i32.shr_u i32.const 15 i32.and - i32.const 1708 + i32.const 1676 i32.add i32.load8_u local.get $2 i32.const 15 i32.and - i32.const 1708 + i32.const 1676 i32.add i32.load8_u i32.const 16 @@ -2067,11 +2067,13 @@ i32.add i32.load16_u local.tee $3 - i32.const 127 + i32.const 33 + i32.sub + i32.const 94 i32.ge_u br_if $do-break|1 local.get $3 - i32.const 1468 + i32.const 1435 i32.add i32.load8_u br_if $do-break|1 @@ -2175,8 +2177,8 @@ i32.ge_u select if - i32.const 1616 - i32.const 1664 + i32.const 1584 + i32.const 1632 i32.const 82 i32.const 9 call $~lib/builtins/abort @@ -2190,8 +2192,8 @@ local.get $4 i32.le_u if - i32.const 1616 - i32.const 1664 + i32.const 1584 + i32.const 1632 i32.const 86 i32.const 11 call $~lib/builtins/abort @@ -2215,8 +2217,8 @@ i32.lt_u select if - i32.const 1616 - i32.const 1664 + i32.const 1584 + i32.const 1632 i32.const 90 i32.const 11 call $~lib/builtins/abort @@ -2540,11 +2542,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3452 + i32.const 3420 i32.lt_s if - i32.const 19856 - i32.const 19904 + i32.const 19824 + i32.const 19872 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2559,7 +2561,7 @@ memory.size i32.const 16 i32.shl - i32.const 19836 + i32.const 19804 i32.sub i32.const 1 i32.shr_u @@ -2591,427 +2593,427 @@ i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 3 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1792 + i32.const 1760 i32.store offset=8 - i32.const 1792 + i32.const 1760 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1792 + i32.const 1760 i32.store offset=4 local.get $0 - i32.const 1792 + i32.const 1760 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 4 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 1792 i32.store offset=8 - i32.const 1824 + i32.const 1792 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1824 + i32.const 1792 i32.store offset=4 local.get $0 - i32.const 1824 + i32.const 1792 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 5 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1856 + i32.const 1824 i32.store offset=8 - i32.const 1856 + i32.const 1824 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1856 + i32.const 1824 i32.store offset=4 local.get $0 - i32.const 1856 + i32.const 1824 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 6 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1888 + i32.const 1856 i32.store offset=8 - i32.const 1888 + i32.const 1856 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1888 + i32.const 1856 i32.store offset=4 local.get $0 - i32.const 1888 + i32.const 1856 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 7 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1984 + i32.const 1952 i32.store offset=8 - i32.const 1984 + i32.const 1952 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2016 + i32.const 1984 i32.store offset=4 local.get $0 - i32.const 2016 + i32.const 1984 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 11 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2048 + i32.const 2016 i32.store offset=8 - i32.const 2048 + i32.const 2016 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2080 + i32.const 2048 i32.store offset=4 local.get $0 - i32.const 2080 + i32.const 2048 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 12 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2112 + i32.const 2080 i32.store - i32.const 2112 + i32.const 2080 call $~lib/uri/encodeURIComponent - i32.const 2144 + i32.const 2112 i32.eq if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2192 + i32.const 2160 i32.store - i32.const 2192 + i32.const 2160 call $~lib/uri/encodeURIComponent - i32.const 2224 + i32.const 2192 i32.eq if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 14 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2272 + i32.const 2240 i32.store offset=8 - i32.const 2272 + i32.const 2240 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2304 + i32.const 2272 i32.store offset=4 local.get $0 - i32.const 2304 + i32.const 2272 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2336 + i32.const 2304 i32.store offset=8 - i32.const 2336 + i32.const 2304 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2368 + i32.const 2336 i32.store offset=4 local.get $0 - i32.const 2368 + i32.const 2336 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2416 + i32.const 2384 i32.store offset=8 - i32.const 2416 + i32.const 2384 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2448 + i32.const 2416 i32.store offset=4 local.get $0 - i32.const 2448 + i32.const 2416 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2544 + i32.const 2512 i32.store offset=8 - i32.const 2544 + i32.const 2512 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2576 + i32.const 2544 i32.store offset=4 local.get $0 - i32.const 2576 + i32.const 2544 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2688 + i32.const 2656 i32.store offset=8 - i32.const 2688 + i32.const 2656 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2720 + i32.const 2688 i32.store offset=4 local.get $0 - i32.const 2720 + i32.const 2688 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2768 + i32.const 2736 i32.store offset=8 - i32.const 2768 + i32.const 2736 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2800 + i32.const 2768 i32.store offset=4 local.get $0 - i32.const 2800 + i32.const 2768 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 20 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2848 + i32.const 2816 i32.store offset=8 - i32.const 2848 + i32.const 2816 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2880 + i32.const 2848 i32.store offset=4 local.get $0 - i32.const 2880 + i32.const 2848 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 2960 + i32.const 2928 i32.store offset=8 - i32.const 2960 + i32.const 2928 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2992 + i32.const 2960 i32.store offset=4 local.get $0 - i32.const 2992 + i32.const 2960 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 23 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3056 + i32.const 3024 i32.store offset=8 - i32.const 3056 + i32.const 3024 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3104 + i32.const 3072 i32.store offset=4 local.get $0 - i32.const 3104 + i32.const 3072 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 25 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3184 + i32.const 3152 i32.store offset=8 - i32.const 3184 + i32.const 3152 call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3296 + i32.const 3264 i32.store offset=4 local.get $0 - i32.const 3296 + i32.const 3264 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1744 + i32.const 1712 i32.const 27 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 19836 + i32.const 19804 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 0ead5a7d59..dc2542e73a 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -21,44 +21,44 @@ (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 444) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") - (data (i32.const 572) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") - (data (i32.const 620) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 684) "0123456789ABCDEF") - (data (i32.const 700) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") - (data (i32.const 812) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") - (data (i32.const 844) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") - (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\000\000\00\00\00\00\00\00\00") - (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") - (data (i32.const 1068) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00#\000\00=\00\00\00\00\00\00\00") - (data (i32.const 1100) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1148) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00 \001\002\003\00 \00\00\00") - (data (i32.const 1180) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") - (data (i32.const 1260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") - (data (i32.const 1292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") - (data (i32.const 1324) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1372) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") - (data (i32.const 1404) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E\00\00\00\00\00") - (data (i32.const 1500) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") - (data (i32.const 1532) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") - (data (i32.const 1644) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00~\00\7f\00\80\00\00\00\00\00\00\00") - (data (i32.const 1676) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000\00\00\00\00\00\00\00\00\00") - (data (i32.const 1724) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") - (data (i32.const 1756) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") - (data (i32.const 1804) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") - (data (i32.const 1836) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1916) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") - (data (i32.const 1948) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2012) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") - (data (i32.const 2060) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") - (data (i32.const 2140) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") - (data (i32.const 2252) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") - (data (i32.const 2400) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 444) "\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") + (data (i32.const 540) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") + (data (i32.const 588) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 652) "0123456789ABCDEF") + (data (i32.const 668) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") + (data (i32.const 812) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") + (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\000\000\00\00\00\00\00\00\00") + (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00#\000\00=\00\00\00\00\00\00\00") + (data (i32.const 1068) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1116) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00 \001\002\003\00 \00\00\00") + (data (i32.const 1148) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1196) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") + (data (i32.const 1228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") + (data (i32.const 1260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") + (data (i32.const 1292) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1340) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") + (data (i32.const 1372) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E\00\00\00\00\00") + (data (i32.const 1468) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") + (data (i32.const 1500) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") + (data (i32.const 1612) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00~\00\7f\00\80\00\00\00\00\00\00\00") + (data (i32.const 1644) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000\00\00\00\00\00\00\00\00\00") + (data (i32.const 1692) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") + (data (i32.const 1724) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") + (data (i32.const 1772) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") + (data (i32.const 1804) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1884) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") + (data (i32.const 1916) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1980) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") + (data (i32.const 2028) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") + (data (i32.const 2108) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") + (data (i32.const 2220) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") + (data (i32.const 2368) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -73,10 +73,10 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 2400)) - (global $~lib/memory/__data_end i32 (i32.const 2428)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18812)) - (global $~lib/memory/__heap_base i32 (i32.const 18812)) + (global $~lib/rt/__rtti_base i32 (i32.const 2368)) + (global $~lib/memory/__data_end i32 (i32.const 2396)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18780)) + (global $~lib/memory/__heap_base i32 (i32.const 18780)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3700,7 +3700,7 @@ ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - i32.const 684 + i32.const 652 local.get $2 i32.const 4 i32.shr_u @@ -3708,7 +3708,7 @@ i32.and i32.add i32.load8_u - i32.const 684 + i32.const 652 local.get $2 i32.const 15 i32.and @@ -3766,11 +3766,17 @@ i32.load16_u local.set $9 local.get $9 + i32.const 33 + i32.sub i32.const 127 + i32.const 33 + i32.sub i32.lt_u if local.get $3 local.get $9 + i32.const 33 + i32.sub i32.add i32.load8_u if @@ -3883,8 +3889,8 @@ i32.const 0 end if - i32.const 592 - i32.const 640 + i32.const 560 + i32.const 608 i32.const 82 i32.const 9 call $~lib/builtins/abort @@ -3898,8 +3904,8 @@ local.get $2 i32.ge_u if - i32.const 592 - i32.const 640 + i32.const 560 + i32.const 608 i32.const 86 i32.const 11 call $~lib/builtins/abort @@ -3926,8 +3932,8 @@ i32.gt_u end if - i32.const 592 - i32.const 640 + i32.const 560 + i32.const 608 i32.const 90 i32.const 11 call $~lib/builtins/abort @@ -4341,7 +4347,7 @@ i32.const 64 local.get $0 call $~lib/rt/itcms/__visit - i32.const 592 + i32.const 560 local.get $0 call $~lib/rt/itcms/__visit ) @@ -4386,8 +4392,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 18832 - i32.const 18880 + i32.const 18800 + i32.const 18848 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4446,13 +4452,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 3 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 768 + i32.const 736 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4464,7 +4470,7 @@ local.get $0 i32.store local.get $0 - i32.const 768 + i32.const 736 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4474,13 +4480,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 4 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 800 + i32.const 768 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4492,7 +4498,7 @@ local.get $0 i32.store local.get $0 - i32.const 800 + i32.const 768 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4502,13 +4508,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 5 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 832 + i32.const 800 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4520,7 +4526,7 @@ local.get $0 i32.store local.get $0 - i32.const 832 + i32.const 800 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4530,13 +4536,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 6 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 864 + i32.const 832 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4548,7 +4554,7 @@ local.get $0 i32.store local.get $0 - i32.const 864 + i32.const 832 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4558,13 +4564,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 7 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 960 + i32.const 928 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4576,7 +4582,7 @@ local.get $0 i32.store local.get $0 - i32.const 992 + i32.const 960 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4586,13 +4592,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 11 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1024 + i32.const 992 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4604,7 +4610,7 @@ local.get $0 i32.store local.get $0 - i32.const 1056 + i32.const 1024 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4614,49 +4620,49 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 12 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1088 + i32.const 1056 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store local.get $0 call $~lib/uri/encodeURIComponent - i32.const 1120 + i32.const 1088 i32.ne i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1168 + i32.const 1136 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store local.get $0 call $~lib/uri/encodeURIComponent - i32.const 1200 + i32.const 1168 i32.ne i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 14 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1248 + i32.const 1216 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4668,7 +4674,7 @@ local.get $0 i32.store local.get $0 - i32.const 1280 + i32.const 1248 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4678,13 +4684,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1312 + i32.const 1280 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4696,7 +4702,7 @@ local.get $0 i32.store local.get $0 - i32.const 1344 + i32.const 1312 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4706,13 +4712,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1392 + i32.const 1360 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4724,7 +4730,7 @@ local.get $0 i32.store local.get $0 - i32.const 1424 + i32.const 1392 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4734,13 +4740,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1520 + i32.const 1488 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4752,7 +4758,7 @@ local.get $0 i32.store local.get $0 - i32.const 1552 + i32.const 1520 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4762,13 +4768,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1664 + i32.const 1632 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4780,7 +4786,7 @@ local.get $0 i32.store local.get $0 - i32.const 1696 + i32.const 1664 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4790,13 +4796,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1744 + i32.const 1712 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4808,7 +4814,7 @@ local.get $0 i32.store local.get $0 - i32.const 1776 + i32.const 1744 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4818,13 +4824,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 20 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1824 + i32.const 1792 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4836,7 +4842,7 @@ local.get $0 i32.store local.get $0 - i32.const 1856 + i32.const 1824 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4846,13 +4852,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 1936 + i32.const 1904 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4864,7 +4870,7 @@ local.get $0 i32.store local.get $0 - i32.const 1968 + i32.const 1936 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4874,13 +4880,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 23 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2032 + i32.const 2000 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4892,7 +4898,7 @@ local.get $0 i32.store local.get $0 - i32.const 2080 + i32.const 2048 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4902,13 +4908,13 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 25 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2160 + i32.const 2128 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4920,7 +4926,7 @@ local.get $0 i32.store local.get $0 - i32.const 2272 + i32.const 2240 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4930,7 +4936,7 @@ i32.eqz if i32.const 0 - i32.const 720 + i32.const 688 i32.const 27 i32.const 1 call $~lib/builtins/abort From 2174b692fc50313803f42e0060aee163fba13349 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 16:35:55 +0200 Subject: [PATCH 44/87] more detailed comments --- std/assembly/util/uri.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 5a863fd786..2a06ac95bc 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -7,26 +7,26 @@ import { CharCode } from "./string"; // @ts-ignore: decorator @lazy export const URI_UNSAFE = memory.data([ -/* skip 32 + 1 head slots +/* skip 32 + 1 always set to '1' head slots */ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, /* - skip 128 + 1 tail slots */ + skip 128 + 1 always set to '1' tail slots */ ]); // @ts-ignore: decorator @lazy export const URL_UNSAFE = memory.data([ -/* skip 32 + 1 head slots +/* skip 32 + 1 always set to '1' head slots */ 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, /* - skip 128 + 1 tail slots */ + skip 128 + 1 always set to '1' tail slots */ ]); function storeHex(dst: usize, offset: usize, ch: u32): void { From 3a4cdd436eb8dcef714b1dcbd40b82a62166c226 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 17:11:49 +0200 Subject: [PATCH 45/87] add encodeURI tests --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 502 ++++++++++++++++++++------- tests/compiler/std/uri.ts | 30 +- tests/compiler/std/uri.untouched.wat | 341 ++++++++++++++++-- 4 files changed, 720 insertions(+), 155 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 2a06ac95bc..4dd367c324 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -51,7 +51,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize let c: u32, c1: u32; do { c = load(src + (i << 1)); - if ((c - 33) < 0x7F - 33) { + if (c - 33 < 94) { // 127 - 33 if (load(table + (c - 33))) break; } else break; } while (++i < len); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 63d41e598c..8ef1b593ae 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -7,7 +7,7 @@ (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") @@ -40,7 +40,7 @@ (data (i32.const 1804) "\1c") (data (i32.const 1816) "\01\00\00\00\06\00\00\00a\00b\00_") (data (i32.const 1836) "\\") - (data (i32.const 1848) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 1848) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00w\00y\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") (data (i32.const 1932) "\1c") (data (i32.const 1944) "\01\00\00\00\02") (data (i32.const 1964) "\1c") @@ -97,7 +97,17 @@ (data (i32.const 3144) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") (data (i32.const 3244) "\8c") (data (i32.const 3256) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 3392) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3389) "\01\00\00\01") + (data (i32.const 3415) "\01\00\01") + (data (i32.const 3446) "\01\01\01\01\00\01") + (data (i32.const 3478) "\01\01\01") + (data (i32.const 3484) ",") + (data (i32.const 3496) "\01\00\00\00\16\00\00\00;\00,\00/\00?\00:\00@\00&\00=\00+\00$\00#") + (data (i32.const 3532) "\1c") + (data (i32.const 3544) "\01\00\00\00\02\00\00\00 ") + (data (i32.const 3564) "\1c") + (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") + (data (i32.const 3600) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -108,7 +118,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19804)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20012)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -239,7 +249,7 @@ if i32.const 0 local.get $0 - i32.const 19804 + i32.const 20012 i32.lt_u local.get $0 i32.load offset=8 @@ -285,7 +295,7 @@ i32.const 1 else local.get $1 - i32.const 3392 + i32.const 3600 i32.load i32.gt_u if @@ -299,7 +309,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 3396 + i32.const 3604 i32.add i32.load i32.const 32 @@ -904,10 +914,10 @@ if unreachable end - i32.const 19808 + i32.const 20016 i32.const 0 i32.store - i32.const 21376 + i32.const 21584 i32.const 0 i32.store loop $for-loop|0 @@ -918,7 +928,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 19808 + i32.const 20016 i32.add i32.const 0 i32.store offset=4 @@ -936,7 +946,7 @@ i32.add i32.const 2 i32.shl - i32.const 19808 + i32.const 20016 i32.add i32.const 0 i32.store offset=96 @@ -954,13 +964,13 @@ br $for-loop|0 end end - i32.const 19808 - i32.const 21380 + i32.const 20016 + i32.const 21588 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 19808 + i32.const 20016 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1039,7 +1049,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 19804 + i32.const 20012 i32.lt_u if local.get $0 @@ -1129,7 +1139,7 @@ unreachable end local.get $0 - i32.const 19804 + i32.const 20012 i32.lt_u if local.get $0 @@ -1152,7 +1162,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 19804 + i32.const 20012 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2039,100 +2049,102 @@ local.get $2 i32.store offset=2 ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) local.get $2 i32.const 1 i32.shl - local.set $7 + local.set $8 loop $while-continue|0 local.get $2 - local.get $4 + local.get $5 i32.gt_u if block $while-break|0 - local.get $4 - local.set $5 + local.get $5 + local.set $6 loop $do-continue|1 block $do-break|1 local.get $1 - local.get $4 + local.get $5 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $3 + local.tee $4 i32.const 33 i32.sub i32.const 94 i32.ge_u br_if $do-break|1 local.get $3 - i32.const 1435 + local.get $4 + i32.const 33 + i32.sub i32.add i32.load8_u br_if $do-break|1 local.get $2 - local.get $4 + local.get $5 i32.const 1 i32.add - local.tee $4 + local.tee $5 i32.gt_u br_if $do-continue|1 end end - local.get $4 local.get $5 + local.get $6 i32.gt_u if - local.get $7 - local.get $6 - local.get $4 + local.get $8 + local.get $9 local.get $5 + local.get $6 i32.sub i32.const 1 i32.shl - local.tee $8 + local.tee $7 i32.add i32.lt_u if local.get $0 - local.get $6 - local.get $8 + local.get $7 + local.get $9 i32.add - local.tee $7 + local.tee $8 call $~lib/rt/itcms/__renew local.set $0 end - local.get $8 + local.get $7 i32.const 2 i32.eq if local.get $0 - local.get $6 + local.get $9 i32.add local.get $1 - local.get $5 + local.get $6 i32.const 1 i32.shl i32.add i32.load16_u i32.store16 else - local.get $8 + local.get $7 i32.const 4 i32.eq if local.get $0 - local.get $6 + local.get $9 i32.add local.get $1 - local.get $5 + local.get $6 i32.const 1 i32.shl i32.add @@ -2140,39 +2152,39 @@ i32.store else local.get $0 - local.get $6 + local.get $9 i32.add local.get $1 - local.get $5 + local.get $6 i32.const 1 i32.shl i32.add - local.get $8 + local.get $7 call $~lib/memory/memory.copy end end - local.get $6 - local.get $8 + local.get $7 + local.get $9 i32.add - local.set $6 + local.set $9 local.get $2 - local.get $4 + local.get $5 i32.le_u br_if $while-break|0 end - local.get $7 - local.get $6 + local.get $8 + local.get $9 i32.const 6 i32.const 24 - local.get $3 + local.get $4 i32.const 55296 i32.ge_u if - local.get $3 + local.get $4 i32.const 57343 i32.le_u i32.const 0 - local.get $3 + local.get $4 i32.const 56320 i32.ge_u select @@ -2184,12 +2196,12 @@ call $~lib/builtins/abort unreachable end - local.get $3 + local.get $4 i32.const 56319 i32.le_u if (result i32) local.get $2 - local.get $4 + local.get $5 i32.le_u if i32.const 1584 @@ -2201,18 +2213,18 @@ end i32.const 1 local.get $1 - local.get $4 + local.get $5 i32.const 1 i32.add - local.tee $4 + local.tee $5 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $5 + local.tee $6 i32.const 57343 i32.gt_u - local.get $5 + local.get $6 i32.const 56320 i32.lt_u select @@ -2224,10 +2236,10 @@ call $~lib/builtins/abort unreachable end - local.get $5 + local.get $6 i32.const 1023 i32.and - local.get $3 + local.get $4 i32.const 1023 i32.and i32.const 10 @@ -2236,47 +2248,47 @@ i32.const 65536 i32.add else - local.get $3 + local.get $4 end - local.set $3 + local.set $4 end - local.get $3 + local.get $4 i32.const 128 i32.lt_u select i32.add - local.tee $5 + local.tee $6 i32.lt_u if local.get $0 - local.get $5 + local.get $6 i32.const 1 i32.shl - local.get $5 + local.get $6 local.get $2 i32.const 1 i32.gt_u select - local.tee $7 + local.tee $8 call $~lib/rt/itcms/__renew local.set $0 end - local.get $3 + local.get $4 i32.const 128 i32.lt_u if local.get $0 - local.get $6 - local.get $3 + local.get $9 + local.get $4 call $~lib/util/uri/storeHex else - local.get $3 + local.get $4 i32.const 2048 i32.lt_u if local.get $0 - local.get $6 - local.get $3 + local.get $9 + local.get $4 i32.const 6 i32.shr_u i32.const 192 @@ -2284,33 +2296,36 @@ call $~lib/util/uri/storeHex else local.get $0 - local.get $3 + local.get $4 i32.const 65536 i32.lt_u - if + if (result i32) local.get $0 - local.get $6 - local.get $3 + local.get $9 + local.get $4 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex + local.get $9 + i32.const 6 + i32.add else local.get $0 - local.get $6 - local.get $3 + local.get $9 + local.get $4 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex local.get $0 - local.get $6 + local.get $9 i32.const 6 i32.add local.tee $6 - local.get $3 + local.get $4 i32.const 12 i32.shr_u i32.const 63 @@ -2318,12 +2333,12 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex + local.get $6 + i32.const 6 + i32.add end - local.get $6 - i32.const 6 - i32.add - local.tee $6 - local.get $3 + local.tee $9 + local.get $4 i32.const 6 i32.shr_u i32.const 63 @@ -2333,35 +2348,35 @@ call $~lib/util/uri/storeHex end local.get $0 - local.get $6 + local.get $9 i32.const 6 i32.add - local.tee $6 - local.get $3 + local.tee $9 + local.get $4 i32.const 63 i32.and i32.const 128 i32.or call $~lib/util/uri/storeHex end - local.get $6 + local.get $9 i32.const 6 i32.add - local.set $6 - local.get $4 + local.set $9 + local.get $5 i32.const 1 i32.add - local.set $4 + local.set $5 br $while-continue|0 end end end - local.get $6 - local.get $7 - i32.lt_u + local.get $8 + local.get $9 + i32.gt_u if (result i32) local.get $0 - local.get $6 + local.get $9 call $~lib/rt/itcms/__renew else local.get $0 @@ -2388,6 +2403,7 @@ call $~lib/rt/itcms/__new local.get $0 local.get $1 + i32.const 1468 call $~lib/util/uri/encode ) (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) @@ -2506,6 +2522,30 @@ end i32.eqz ) + (func $~lib/uri/encodeURI (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + i32.const 3388 + call $~lib/util/uri/encode + ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid block $~lib/arraybuffer/ArrayBufferView @@ -2542,11 +2582,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3420 + i32.const 3628 i32.lt_s if - i32.const 19824 - i32.const 19872 + i32.const 20032 + i32.const 20080 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2561,7 +2601,7 @@ memory.size i32.const 16 i32.shl - i32.const 19804 + i32.const 20012 i32.sub i32.const 1 i32.shr_u @@ -2594,7 +2634,7 @@ if i32.const 0 i32.const 1712 - i32.const 3 + i32.const 6 i32.const 1 call $~lib/builtins/abort unreachable @@ -2618,7 +2658,7 @@ if i32.const 0 i32.const 1712 - i32.const 4 + i32.const 7 i32.const 1 call $~lib/builtins/abort unreachable @@ -2642,7 +2682,7 @@ if i32.const 0 i32.const 1712 - i32.const 5 + i32.const 8 i32.const 1 call $~lib/builtins/abort unreachable @@ -2666,7 +2706,7 @@ if i32.const 0 i32.const 1712 - i32.const 6 + i32.const 9 i32.const 1 call $~lib/builtins/abort unreachable @@ -2690,7 +2730,7 @@ if i32.const 0 i32.const 1712 - i32.const 7 + i32.const 10 i32.const 1 call $~lib/builtins/abort unreachable @@ -2714,7 +2754,7 @@ if i32.const 0 i32.const 1712 - i32.const 11 + i32.const 14 i32.const 1 call $~lib/builtins/abort unreachable @@ -2738,7 +2778,7 @@ if i32.const 0 i32.const 1712 - i32.const 12 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable @@ -2753,7 +2793,7 @@ if i32.const 0 i32.const 1712 - i32.const 13 + i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable @@ -2768,7 +2808,7 @@ if i32.const 0 i32.const 1712 - i32.const 14 + i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable @@ -2792,7 +2832,7 @@ if i32.const 0 i32.const 1712 - i32.const 15 + i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable @@ -2816,7 +2856,7 @@ if i32.const 0 i32.const 1712 - i32.const 16 + i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable @@ -2840,7 +2880,7 @@ if i32.const 0 i32.const 1712 - i32.const 17 + i32.const 20 i32.const 1 call $~lib/builtins/abort unreachable @@ -2864,7 +2904,7 @@ if i32.const 0 i32.const 1712 - i32.const 18 + i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable @@ -2888,7 +2928,7 @@ if i32.const 0 i32.const 1712 - i32.const 19 + i32.const 22 i32.const 1 call $~lib/builtins/abort unreachable @@ -2912,7 +2952,7 @@ if i32.const 0 i32.const 1712 - i32.const 20 + i32.const 23 i32.const 1 call $~lib/builtins/abort unreachable @@ -2936,7 +2976,7 @@ if i32.const 0 i32.const 1712 - i32.const 21 + i32.const 24 i32.const 1 call $~lib/builtins/abort unreachable @@ -2960,7 +3000,7 @@ if i32.const 0 i32.const 1712 - i32.const 23 + i32.const 26 i32.const 1 call $~lib/builtins/abort unreachable @@ -2984,7 +3024,7 @@ if i32.const 0 i32.const 1712 - i32.const 25 + i32.const 28 i32.const 1 call $~lib/builtins/abort unreachable @@ -3008,12 +3048,228 @@ if i32.const 0 i32.const 1712 - i32.const 27 + i32.const 30 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 43 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=8 + i32.const 1760 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=4 + local.get $0 + i32.const 1760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 44 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3504 + i32.store offset=8 + i32.const 3504 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3504 + i32.store offset=4 + local.get $0 + i32.const 3504 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 45 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=8 + i32.const 1856 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=4 + local.get $0 + i32.const 1856 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 46 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3552 + i32.store offset=8 + i32.const 3552 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3584 + i32.store offset=4 + local.get $0 + i32.const 3584 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 50 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2656 + i32.store offset=8 + i32.const 2656 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2688 + i32.store offset=4 + local.get $0 + i32.const 2688 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 51 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=8 + i32.const 2736 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2768 + i32.store offset=4 + local.get $0 + i32.const 2768 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 52 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2928 + i32.store offset=8 + i32.const 2928 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2960 + i32.store offset=4 + local.get $0 + i32.const 2960 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 54 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3152 + i32.store offset=8 + i32.const 3152 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3152 + i32.store offset=4 + local.get $0 + i32.const 3152 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 55 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 19804 + i32.const 20012 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index f8518e8fca..092293d2ac 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -1,10 +1,13 @@ + +// encodeURIComponent + // not escaped assert(encodeURIComponent("") == ""); assert(encodeURIComponent("a") == "a"); assert(encodeURIComponent("a1") == "a1"); assert(encodeURIComponent("ab_") == "ab_"); -assert(encodeURIComponent("ABCDXYZafgklmnyzz0123456789-_.!~*'()") == "ABCDXYZafgklmnyzz0123456789-_.!~*'()"); +assert(encodeURIComponent("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == "ABCDXYZafgklmnwyz0123456789-_.!~*'()"); // escaped @@ -32,5 +35,30 @@ assert( // assert(encodeURIComponent("\uD800")); // malformed URI sequence // assert(encodeURIComponent("\uDFFF")); // malformed URI sequence + +// encodeURI + +// not escaped + +assert(encodeURI("") == ""); +assert(encodeURI("a") == "a"); +assert(encodeURI(";,/?:@&=+$#") == ";,/?:@&=+$#"); +assert(encodeURI("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == "ABCDXYZafgklmnwyz0123456789-_.!~*'()"); + +// escaped + +assert(encodeURI(" ") == "%20"); +assert(encodeURI("\x7E\x7F\x80") == "~%7F%C2%80"); +assert(encodeURI("\uD800\uDFFF") == "%F0%90%8F%BF"); +// line terminators +assert(encodeURI("\n\t\v\f\r") == "%0A%09%0B%0C%0D"); +assert( + encodeURI("http://en.wikipedia.org/wiki/UTF-8#Description") == + "http://en.wikipedia.org/wiki/UTF-8#Description" +); + +// assert(encodeURI("\uD800")); // malformed URI sequence +// assert(encodeURI("\uDFFF")); // malformed URI sequence + __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index dc2542e73a..4bf8f621e0 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -29,7 +29,7 @@ (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") - (data (i32.const 812) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00y\00z\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") + (data (i32.const 812) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00w\00y\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\000\000\00\00\00\00\00\00\00") (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") @@ -58,7 +58,11 @@ (data (i32.const 2028) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") (data (i32.const 2108) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") (data (i32.const 2220) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") - (data (i32.const 2368) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2364) "\00\01\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") + (data (i32.const 2460) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\16\00\00\00;\00,\00/\00?\00:\00@\00&\00=\00+\00$\00#\00\00\00\00\00\00\00") + (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") + (data (i32.const 2576) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -73,10 +77,11 @@ (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) - (global $~lib/rt/__rtti_base i32 (i32.const 2368)) - (global $~lib/memory/__data_end i32 (i32.const 2396)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18780)) - (global $~lib/memory/__heap_base i32 (i32.const 18780)) + (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) + (global $~lib/rt/__rtti_base i32 (i32.const 2576)) + (global $~lib/memory/__data_end i32 (i32.const 2604)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18988)) + (global $~lib/memory/__heap_base i32 (i32.const 18988)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3768,9 +3773,7 @@ local.get $9 i32.const 33 i32.sub - i32.const 127 - i32.const 33 - i32.sub + i32.const 94 i32.lt_u if local.get $3 @@ -4284,6 +4287,32 @@ call $~lib/util/string/compareImpl i32.eqz ) + (func $~lib/uri/encodeURI (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + global.get $~lib/util/uri/URI_UNSAFE + call $~lib/util/uri/encode + local.set $2 + local.get $2 + ) (func $~lib/rt/itcms/__collect (local $0 i32) i32.const 0 @@ -4392,8 +4421,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 18800 - i32.const 18848 + i32.const 19008 + i32.const 19056 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4453,7 +4482,7 @@ if i32.const 0 i32.const 688 - i32.const 3 + i32.const 6 i32.const 1 call $~lib/builtins/abort unreachable @@ -4481,7 +4510,7 @@ if i32.const 0 i32.const 688 - i32.const 4 + i32.const 7 i32.const 1 call $~lib/builtins/abort unreachable @@ -4509,7 +4538,7 @@ if i32.const 0 i32.const 688 - i32.const 5 + i32.const 8 i32.const 1 call $~lib/builtins/abort unreachable @@ -4537,7 +4566,7 @@ if i32.const 0 i32.const 688 - i32.const 6 + i32.const 9 i32.const 1 call $~lib/builtins/abort unreachable @@ -4565,7 +4594,7 @@ if i32.const 0 i32.const 688 - i32.const 7 + i32.const 10 i32.const 1 call $~lib/builtins/abort unreachable @@ -4593,7 +4622,7 @@ if i32.const 0 i32.const 688 - i32.const 11 + i32.const 14 i32.const 1 call $~lib/builtins/abort unreachable @@ -4621,7 +4650,7 @@ if i32.const 0 i32.const 688 - i32.const 12 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable @@ -4639,7 +4668,7 @@ if i32.const 0 i32.const 688 - i32.const 13 + i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable @@ -4657,7 +4686,7 @@ if i32.const 0 i32.const 688 - i32.const 14 + i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable @@ -4685,7 +4714,7 @@ if i32.const 0 i32.const 688 - i32.const 15 + i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable @@ -4713,7 +4742,7 @@ if i32.const 0 i32.const 688 - i32.const 16 + i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable @@ -4741,7 +4770,7 @@ if i32.const 0 i32.const 688 - i32.const 17 + i32.const 20 i32.const 1 call $~lib/builtins/abort unreachable @@ -4769,7 +4798,7 @@ if i32.const 0 i32.const 688 - i32.const 18 + i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable @@ -4797,7 +4826,7 @@ if i32.const 0 i32.const 688 - i32.const 19 + i32.const 22 i32.const 1 call $~lib/builtins/abort unreachable @@ -4825,7 +4854,7 @@ if i32.const 0 i32.const 688 - i32.const 20 + i32.const 23 i32.const 1 call $~lib/builtins/abort unreachable @@ -4853,7 +4882,7 @@ if i32.const 0 i32.const 688 - i32.const 21 + i32.const 24 i32.const 1 call $~lib/builtins/abort unreachable @@ -4881,7 +4910,7 @@ if i32.const 0 i32.const 688 - i32.const 23 + i32.const 26 i32.const 1 call $~lib/builtins/abort unreachable @@ -4909,7 +4938,7 @@ if i32.const 0 i32.const 688 - i32.const 25 + i32.const 28 i32.const 1 call $~lib/builtins/abort unreachable @@ -4937,7 +4966,259 @@ if i32.const 0 i32.const 688 - i32.const 27 + i32.const 30 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 43 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 44 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2480 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2480 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 45 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 46 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2528 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2560 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 50 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1632 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1664 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 51 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1744 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 52 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1904 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1936 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 54 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 55 i32.const 1 call $~lib/builtins/abort unreachable From 4938263788963851d65b39d1bd9a52f19845f3e6 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 21:03:31 +0200 Subject: [PATCH 46/87] wip --- std/assembly/index.d.ts | 4 + std/assembly/uri.ts | 18 +- std/assembly/util/uri.ts | 139 ++ tests/compiler/std/uri.optimized.wat | 1768 ++++++++------------------ tests/compiler/std/uri.ts | 15 + tests/compiler/std/uri.untouched.wat | 1589 +++++++---------------- 6 files changed, 1206 insertions(+), 2327 deletions(-) diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 331864493e..ecf66e770e 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -220,6 +220,10 @@ declare function lengthof any>(func?: T): i32; declare function encodeURI(str: string): string; /** Encodes a text string as a valid component of a Uniform Resource Identifier (URI). */ declare function encodeURIComponent(str: string): string; +/** Decodes a Uniform Resource Identifier (URI) previously created by encodeURI. */ +declare function decodeURI(str: string): string; +/** Decodes a Uniform Resource Identifier (URI) component previously created by encodeURIComponent. */ +declare function decodeURIComponent(str: string): string; /** Atomic operations. */ declare namespace atomic { diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index 5b72154dab..6eb0ebdcf4 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -1,4 +1,4 @@ -import { encode, URI_UNSAFE, URL_UNSAFE } from "./util/uri"; +import { encode, decode, URI_UNSAFE, URL_UNSAFE } from "./util/uri"; export function encodeURI(str: string): string { var len = str.length; @@ -15,3 +15,19 @@ export function encodeURIComponent(str: string): string { result = encode(result, changetype(str), len, URL_UNSAFE); return changetype(result); } + +export function decodeURI(str: string): string { + var len = str.length; + if (!len) return str; + var result = __new(len << 1, idof()); + result = decode(result, changetype(str), len); + return changetype(result); +} + +export function decodeURIComponent(str: string): string { + var len = str.length; + if (!len) return str; + var result = __new(len << 1, idof()); + result = decode(result, changetype(str), len, true); + return changetype(result); +} diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 4dd367c324..91ffc0db20 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -29,6 +29,14 @@ import { CharCode } from "./string"; skip 128 + 1 always set to '1' tail slots */ ]); +// @ts-ignore: decorator +@lazy export const URI_RESERVED = memory.data([ + /* skip 32 + 3 always set to '0' head slots + */ 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, + 1, /* skip 191 always set to '0' tail slots */ +]); + function storeHex(dst: usize, offset: usize, ch: u32): void { // @ts-ignore: decorator const HEX_CHARS = memory.data([ @@ -129,3 +137,134 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize } return dst; } + +// @ts-ignore: decorator +@inline function isReserved(ch: u32): bool { + if (((ch - 35) >>> 0) < 30) { + return load(URI_RESERVED + (ch - 35)); + } + return false; +} + +// @ts-ignore: decorator +@inline function isHex(ch: u32): bool { + return ch - CharCode._0 < 10 || (ch | 32) - CharCode.a < 6; +} + +// @ts-ignore: decorator +@inline function fromHex(ch: u32): u32 { + return (ch | 32) % 39 - 9; +} + +function loadHex(src: usize, i: usize): u32 { + // i -= 1; + let c0 = load(src + (i << 1)); + let c1 = load(src + (i << 1), 2); + + trace("c0", 1, c0); + trace("c1", 1, c1); + + if (!isHex(c0) || !isHex(c1)) return -1; + + return fromHex(c0) << 4 | fromHex(c1); +} + +export function decode(dst: usize, src: usize, len: usize, component: bool = false): usize { + var i: usize = 0, offset: usize = 0, org: usize, ch: u32; + + while (i < len) { + org = i; + do { + ch = load(src + (i++ << 1)); + } while (i < len && ch != CharCode.PERCENT); + + if (i > org) { + let size = i - org << 1; + if (size == 2) { + store(dst + offset, load(src + (org << 1))); + } else if (size == 4) { + store(dst + offset, load(src + (org << 1))); + } else { + memory.copy( + dst + offset, + src + (org << 1), + size + ); + } + offset += size; + if (i >= len) break; + } + + // decode hex + if (i >= len || ch != CharCode.PERCENT) { + throw new URIError(E_URI_MALFORMED); + } + if (i + 2 >= len) { + ch = loadHex(src, i + 1); + if (ch == -1) { + throw new URIError(E_URI_MALFORMED); + } + } + + i += 3; + if (ch < 0x80) { + if (!component && isReserved(ch)) { + ch = CharCode.PERCENT; + i -= 2; + } + } else { + // decode UTF-8 sequence + let n = 0, lo: u32 = 1; + if (ch >= 0xC0 && ch <= 0xDF) { + n = 1; + lo = 0x80; + ch &= 0x1F; + } else if (ch >= 0xE0 && ch <= 0xEF) { + n = 2; + lo = 0x800; + ch &= 0x0F; + } else if (ch >= 0xF0 && ch <= 0xF7) { + n = 3; + lo = 0x10000; + ch &= 0x07; + } else { + ch = 0; + } + + while (n-- > 0) { + // decode hex + if (i >= len || ch != CharCode.PERCENT) { + throw new URIError(E_URI_MALFORMED); + } + let c1: u32 = 0; + if (i + 2 >= len) { + c1 = loadHex(src, i + 1); + if (c1 == -1) { + throw new URIError(E_URI_MALFORMED); + } + } + if (c1 == -1) break; + i += 3; + + if ((c1 & 0xc0) != 0x80) { + ch = 0; + break; + } + ch = (ch << 6) | (c1 & 0x3F); + } + + if (ch < lo || ch > 0x10FFFF || (ch >= 0xD800 && ch < 0xE000)) { + throw new URIError(E_URI_MALFORMED); + } + + store(dst + offset, ch); + offset += 2; + } + } + if ((len << 1) > offset) { + dst = __renew(dst, offset); + } + trace(changetype(dst)); + + return dst; +} diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 8ef1b593ae..aa9b2ed683 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,17 +1,18 @@ (module + (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $none_=>_none (func)) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01") + (data (i32.const 1048) "\01\00\00\00\06\00\00\00%\002\006") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -22,92 +23,21 @@ (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data (i32.const 1404) "<") (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1469) "\01\01\01\01\01\00\00\00\00\01\01\00\00\01") - (data (i32.const 1493) "\01\01\01\01\01\01\01") - (data (i32.const 1526) "\01\01\01\01\00\01") - (data (i32.const 1558) "\01\01\01") - (data (i32.const 1564) ",") - (data (i32.const 1576) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") - (data (i32.const 1612) "<") - (data (i32.const 1624) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1676) "0123456789ABCDEF") - (data (i32.const 1692) ",") - (data (i32.const 1704) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1740) "\1c") - (data (i32.const 1752) "\01\00\00\00\02\00\00\00a") - (data (i32.const 1772) "\1c") - (data (i32.const 1784) "\01\00\00\00\04\00\00\00a\001") - (data (i32.const 1804) "\1c") - (data (i32.const 1816) "\01\00\00\00\06\00\00\00a\00b\00_") - (data (i32.const 1836) "\\") - (data (i32.const 1848) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00w\00y\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") - (data (i32.const 1932) "\1c") - (data (i32.const 1944) "\01\00\00\00\02") - (data (i32.const 1964) "\1c") - (data (i32.const 1976) "\01\00\00\00\06\00\00\00%\000\000") - (data (i32.const 1996) "\1c") - (data (i32.const 2008) "\01\00\00\00\02\00\00\00+") - (data (i32.const 2028) "\1c") - (data (i32.const 2040) "\01\00\00\00\06\00\00\00%\002\00B") - (data (i32.const 2060) "\1c") - (data (i32.const 2072) "\01\00\00\00\06\00\00\00#\000\00=") - (data (i32.const 2092) ",") - (data (i32.const 2104) "\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D") - (data (i32.const 2140) "\1c") - (data (i32.const 2152) "\01\00\00\00\n\00\00\00 \001\002\003\00 ") - (data (i32.const 2172) ",") - (data (i32.const 2184) "\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000") - (data (i32.const 2220) "\1c") - (data (i32.const 2232) "\01\00\00\00\04\00\00\00?\00+") - (data (i32.const 2252) "\1c") - (data (i32.const 2264) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") - (data (i32.const 2284) "\1c") - (data (i32.const 2296) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") - (data (i32.const 2316) ",") - (data (i32.const 2328) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") - (data (i32.const 2364) "\1c") - (data (i32.const 2376) "\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") - (data (i32.const 2396) "\\") - (data (i32.const 2408) "\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E") - (data (i32.const 2492) "\1c") - (data (i32.const 2504) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") - (data (i32.const 2524) "l") - (data (i32.const 2536) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") - (data (i32.const 2636) "\1c") - (data (i32.const 2648) "\01\00\00\00\06\00\00\00~\00\7f\00\80") - (data (i32.const 2668) ",") - (data (i32.const 2680) "\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000") - (data (i32.const 2716) "\1c") - (data (i32.const 2728) "\01\00\00\00\04\00\00\00\00\d8\ff\df") - (data (i32.const 2748) ",") - (data (i32.const 2760) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") - (data (i32.const 2796) "\1c") - (data (i32.const 2808) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") - (data (i32.const 2828) "L") - (data (i32.const 2840) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") - (data (i32.const 2908) "\1c") - (data (i32.const 2920) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") - (data (i32.const 2940) "<") - (data (i32.const 2952) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") - (data (i32.const 3004) ",") - (data (i32.const 3016) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") - (data (i32.const 3052) "L") - (data (i32.const 3064) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") - (data (i32.const 3132) "l") - (data (i32.const 3144) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 3244) "\8c") - (data (i32.const 3256) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 3389) "\01\00\00\01") - (data (i32.const 3415) "\01\00\01") - (data (i32.const 3446) "\01\01\01\01\00\01") - (data (i32.const 3478) "\01\01\01") - (data (i32.const 3484) ",") - (data (i32.const 3496) "\01\00\00\00\16\00\00\00;\00,\00/\00?\00:\00@\00&\00=\00+\00$\00#") - (data (i32.const 3532) "\1c") - (data (i32.const 3544) "\01\00\00\00\02\00\00\00 ") - (data (i32.const 3564) "\1c") - (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") - (data (i32.const 3600) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1468) ",") + (data (i32.const 1480) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") + (data (i32.const 1516) "<") + (data (i32.const 1528) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1580) "\1c") + (data (i32.const 1592) "\01\00\00\00\04\00\00\00c\000") + (data (i32.const 1612) "\1c") + (data (i32.const 1624) "\01\00\00\00\04\00\00\00c\001") + (data (i32.const 1644) "\01\01\00\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 1667) "\01\01\00\01\00\01\01") + (data (i32.const 1676) "\1c") + (data (i32.const 1688) "\01\00\00\00\02\00\00\00&") + (data (i32.const 1708) ",") + (data (i32.const 1720) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1760) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -118,7 +48,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20012)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18172)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -137,7 +67,7 @@ call $~lib/rt/itcms/__visit i32.const 1088 call $~lib/rt/itcms/__visit - i32.const 1584 + i32.const 1488 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 @@ -249,7 +179,7 @@ if i32.const 0 local.get $0 - i32.const 20012 + i32.const 18172 i32.lt_u local.get $0 i32.load offset=8 @@ -295,7 +225,7 @@ i32.const 1 else local.get $1 - i32.const 3600 + i32.const 1760 i32.load i32.gt_u if @@ -309,7 +239,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 3604 + i32.const 1764 i32.add i32.load i32.const 32 @@ -914,10 +844,10 @@ if unreachable end - i32.const 20016 + i32.const 18176 i32.const 0 i32.store - i32.const 21584 + i32.const 19744 i32.const 0 i32.store loop $for-loop|0 @@ -928,7 +858,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20016 + i32.const 18176 i32.add i32.const 0 i32.store offset=4 @@ -946,7 +876,7 @@ i32.add i32.const 2 i32.shl - i32.const 20016 + i32.const 18176 i32.add i32.const 0 i32.store offset=96 @@ -964,13 +894,13 @@ br $for-loop|0 end end - i32.const 20016 - i32.const 21588 + i32.const 18176 + i32.const 19748 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20016 + i32.const 18176 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1049,7 +979,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20012 + i32.const 18172 i32.lt_u if local.get $0 @@ -1139,7 +1069,7 @@ unreachable end local.get $0 - i32.const 20012 + i32.const 18172 i32.lt_u if local.get $0 @@ -1162,7 +1092,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20012 + i32.const 18172 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1982,569 +1912,384 @@ end end ) - (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - local.get $1 - local.get $0 - i32.const 20 - i32.sub - local.tee $2 - i32.load - i32.const -4 - i32.and - i32.const 16 - i32.sub - i32.le_u - if - local.get $2 - local.get $1 - i32.store offset=16 - local.get $0 - return - end - local.get $1 - local.get $2 - i32.load offset=12 - call $~lib/rt/itcms/__new - local.tee $3 - local.get $0 - local.get $1 - local.get $2 - i32.load offset=16 - local.tee $0 - local.get $0 - local.get $1 - i32.gt_u - select - call $~lib/memory/memory.copy - local.get $3 - ) - (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) - local.get $2 - i32.const 4 - i32.shr_u - i32.const 15 - i32.and - i32.const 1676 - i32.add - i32.load8_u - local.get $2 - i32.const 15 - i32.and - i32.const 1676 - i32.add - i32.load8_u - i32.const 16 - i32.shl - i32.or - local.set $2 - local.get $0 - local.get $1 - i32.add - local.tee $0 - i32.const 37 - i32.store16 - local.get $0 - local.get $2 - i32.store offset=2 - ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) - (local $8 i32) - (local $9 i32) - local.get $2 - i32.const 1 - i32.shl - local.set $8 loop $while-continue|0 - local.get $2 + local.get $1 local.get $5 i32.gt_u if block $while-break|0 local.get $5 - local.set $6 + local.set $4 loop $do-continue|1 - block $do-break|1 - local.get $1 - local.get $5 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.tee $4 - i32.const 33 - i32.sub - i32.const 94 - i32.ge_u - br_if $do-break|1 - local.get $3 - local.get $4 - i32.const 33 - i32.sub - i32.add - i32.load8_u - br_if $do-break|1 + local.get $5 + i32.const 1 + i32.shl + i32.const 1056 + i32.add + i32.load16_u + local.set $6 + local.get $1 + local.get $5 + i32.const 1 + i32.add + local.tee $5 + i32.gt_u + local.tee $2 + if (result i32) + local.get $6 + i32.const 37 + i32.ne + else local.get $2 - local.get $5 - i32.const 1 - i32.add - local.tee $5 - i32.gt_u - br_if $do-continue|1 end + br_if $do-continue|1 end + local.get $4 local.get $5 - local.get $6 - i32.gt_u + i32.lt_u if - local.get $8 - local.get $9 local.get $5 - local.get $6 + local.get $4 i32.sub i32.const 1 i32.shl - local.tee $7 - i32.add - i32.lt_u - if - local.get $0 - local.get $7 - local.get $9 - i32.add - local.tee $8 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $7 + local.tee $2 i32.const 2 i32.eq if local.get $0 - local.get $9 + local.get $3 i32.add - local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.shl + i32.const 1056 i32.add i32.load16_u i32.store16 else - local.get $7 + local.get $2 i32.const 4 i32.eq if local.get $0 - local.get $9 + local.get $3 i32.add - local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.shl + i32.const 1056 i32.add i32.load i32.store else local.get $0 - local.get $9 + local.get $3 i32.add - local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.shl + i32.const 1056 i32.add - local.get $7 + local.get $2 call $~lib/memory/memory.copy end end - local.get $7 - local.get $9 - i32.add - local.set $9 local.get $2 + local.get $3 + i32.add + local.set $3 + local.get $1 local.get $5 i32.le_u br_if $while-break|0 end - local.get $8 - local.get $9 - i32.const 6 - i32.const 24 - local.get $4 - i32.const 55296 - i32.ge_u + i32.const 1 + local.get $6 + i32.const 37 + i32.ne + local.get $1 + local.get $5 + i32.le_u + select if - local.get $4 - i32.const 57343 - i32.le_u - i32.const 0 - local.get $4 - i32.const 56320 - i32.ge_u - select + i32.const 1488 + i32.const 1536 + i32.const 200 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $5 + i32.const 2 + i32.add + i32.le_u + if + local.get $5 + i32.const 1 + i32.add + call $~lib/util/uri/loadHex + local.tee $6 + i32.const -1 + i32.eq if - i32.const 1584 - i32.const 1632 - i32.const 82 + i32.const 1488 + i32.const 1536 + i32.const 205 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $4 - i32.const 56319 + end + local.get $5 + i32.const 3 + i32.add + local.set $5 + local.get $6 + i32.const 128 + i32.ge_u + if + i32.const 0 + local.set $4 + i32.const 1 + local.set $7 + local.get $6 + i32.const 223 i32.le_u + i32.const 0 + local.get $6 + i32.const 192 + i32.ge_u + select if (result i32) - local.get $2 - local.get $5 - i32.le_u - if - i32.const 1584 - i32.const 1632 - i32.const 86 - i32.const 11 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - local.get $1 - local.get $5 i32.const 1 - i32.add - local.tee $5 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.tee $6 - i32.const 57343 - i32.gt_u - local.get $6 - i32.const 56320 - i32.lt_u - select - if - i32.const 1584 - i32.const 1632 - i32.const 90 - i32.const 11 - call $~lib/builtins/abort - unreachable - end + local.set $4 + i32.const 128 + local.set $7 local.get $6 - i32.const 1023 - i32.and - local.get $4 - i32.const 1023 + i32.const 31 i32.and - i32.const 10 - i32.shl - i32.or - i32.const 65536 - i32.add else + local.get $6 + i32.const 239 + i32.le_u + i32.const 0 + local.get $6 + i32.const 224 + i32.ge_u + select + if (result i32) + i32.const 2 + local.set $4 + i32.const 2048 + local.set $7 + local.get $6 + i32.const 15 + i32.and + else + local.get $6 + i32.const 247 + i32.le_u + i32.const 0 + local.get $6 + i32.const 240 + i32.ge_u + select + if (result i32) + i32.const 3 + local.set $4 + i32.const 65536 + local.set $7 + local.get $6 + i32.const 7 + i32.and + else + i32.const 0 + end + end + end + local.set $6 + loop $while-continue|2 local.get $4 + local.tee $2 + i32.const 1 + i32.sub + local.set $4 + local.get $2 + i32.const 0 + i32.gt_s + if + block $while-break|2 + i32.const 1 + local.get $6 + i32.const 37 + i32.ne + local.get $1 + local.get $5 + i32.le_u + select + if + i32.const 1488 + i32.const 1536 + i32.const 237 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + local.set $2 + local.get $1 + local.get $5 + i32.const 2 + i32.add + i32.le_u + if + local.get $5 + i32.const 1 + i32.add + call $~lib/util/uri/loadHex + local.tee $2 + i32.const -1 + i32.eq + if + i32.const 1488 + i32.const 1536 + i32.const 243 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + i32.const -1 + i32.eq + br_if $while-break|2 + local.get $5 + i32.const 3 + i32.add + local.set $5 + local.get $2 + i32.const 192 + i32.and + i32.const 128 + i32.ne + if + i32.const 0 + local.set $6 + br $while-break|2 + end + local.get $2 + i32.const 63 + i32.and + local.get $6 + i32.const 6 + i32.shl + i32.or + local.set $6 + br $while-continue|2 + end + end end - local.set $4 - end - local.get $4 - i32.const 128 - i32.lt_u - select - i32.add - local.tee $6 - i32.lt_u - if - local.get $0 - local.get $6 i32.const 1 - i32.shl local.get $6 - local.get $2 + i32.const 57344 + i32.lt_u + i32.const 0 + local.get $6 + i32.const 55296 + i32.ge_u + select i32.const 1 + local.get $6 + i32.const 1114111 i32.gt_u + local.get $6 + local.get $7 + i32.lt_u + select select - local.tee $8 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $4 - i32.const 128 - i32.lt_u - if - local.get $0 - local.get $9 - local.get $4 - call $~lib/util/uri/storeHex - else - local.get $4 - i32.const 2048 - i32.lt_u if - local.get $0 - local.get $9 - local.get $4 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or - call $~lib/util/uri/storeHex - else - local.get $0 - local.get $4 - i32.const 65536 - i32.lt_u - if (result i32) - local.get $0 - local.get $9 - local.get $4 - i32.const 12 - i32.shr_u - i32.const 224 - i32.or - call $~lib/util/uri/storeHex - local.get $9 - i32.const 6 - i32.add - else - local.get $0 - local.get $9 - local.get $4 - i32.const 18 - i32.shr_u - i32.const 240 - i32.or - call $~lib/util/uri/storeHex - local.get $0 - local.get $9 - i32.const 6 - i32.add - local.tee $6 - local.get $4 - i32.const 12 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - local.get $6 - i32.const 6 - i32.add - end - local.tee $9 - local.get $4 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex + i32.const 1488 + i32.const 1536 + i32.const 257 + i32.const 9 + call $~lib/builtins/abort + unreachable end local.get $0 - local.get $9 - i32.const 6 + local.get $3 i32.add - local.tee $9 - local.get $4 - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex + local.get $6 + i32.store16 + local.get $3 + i32.const 2 + i32.add + local.set $3 end - local.get $9 - i32.const 6 - i32.add - local.set $9 - local.get $5 - i32.const 1 - i32.add - local.set $5 br $while-continue|0 end end end - local.get $8 - local.get $9 - i32.gt_u - if (result i32) - local.get $0 - local.get $9 - call $~lib/rt/itcms/__renew - else - local.get $0 - end - ) - (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end + local.get $3 local.get $1 i32.const 1 i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 - i32.const 1468 - call $~lib/util/uri/encode - ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - local.get $0 - local.get $1 - i32.eq - if - i32.const 1 - return - end - local.get $1 - i32.eqz - i32.const 1 - local.get $0 - select - if - i32.const 0 - return - end - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $2 - local.get $1 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - i32.ne + i32.lt_u if - i32.const 0 - return - end - block $__inlined_func$~lib/util/string/compareImpl (result i32) - local.get $0 - local.tee $3 - i32.const 7 - i32.and - local.get $1 - i32.const 7 - i32.and - i32.or - i32.eqz - i32.const 0 - local.get $2 - local.tee $0 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $3 - i64.load - local.get $1 - i64.load - i64.eq - if - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $1 - i32.const 8 - i32.add - local.set $1 - local.get $0 - i32.const 4 - i32.sub - local.tee $0 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 + block $__inlined_func$~lib/rt/itcms/__renew + local.get $3 local.get $0 - local.tee $2 - i32.const 1 + i32.const 20 i32.sub - local.set $0 - local.get $2 + local.tee $6 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.sub + i32.le_u if + local.get $6 local.get $3 - i32.load16_u - local.tee $2 - local.get $1 - i32.load16_u - local.tee $4 - i32.ne - if - local.get $2 - local.get $4 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $3 - i32.const 2 - i32.add - local.set $3 - local.get $1 - i32.const 2 - i32.add - local.set $1 - br $while-continue|1 + i32.store offset=16 + br $__inlined_func$~lib/rt/itcms/__renew end + local.get $3 + local.get $6 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $1 + local.get $0 + local.get $3 + local.get $6 + i32.load offset=16 + local.tee $0 + local.get $0 + local.get $3 + i32.gt_u + select + call $~lib/memory/memory.copy + local.get $1 + local.set $0 end - i32.const 0 end - i32.eqz - ) - (func $~lib/uri/encodeURI (param $0 i32) (result i32) - (local $1 i32) local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new + i32.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace local.get $0 - local.get $1 - i32.const 3388 - call $~lib/util/uri/encode ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid @@ -2575,701 +2320,300 @@ (func $~start call $start:std/uri ) - (func $start:std/uri - (local $0 i32) - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.sub - global.set $~lib/memory/__stack_pointer + (func $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 3628 + i32.const 1788 i32.lt_s if - i32.const 20032 - i32.const 20080 + i32.const 18192 + i32.const 18240 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end + ) + (func $~lib/util/uri/loadHex (param $0 i32) (result i32) + (local $1 i32) global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check global.get $~lib/memory/__stack_pointer i32.const 0 - i32.store offset=8 - memory.size - i32.const 16 - i32.shl - i32.const 20012 - i32.sub + i32.store + local.get $0 i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 1200 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/pinSpace - i32.const 1232 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace - i32.const 1376 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/fromSpace - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=8 - i32.const 1056 - call $~lib/uri/encodeURIComponent + i32.shl + i32.const 1054 + i32.add + local.tee $1 + i32.load16_u local.set $0 + local.get $1 + i32.load16_u offset=2 + local.set $1 global.get $~lib/memory/__stack_pointer - local.get $0 + i32.const 1600 i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=4 + i32.const 1600 + i32.const 1 local.get $0 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 6 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=8 - i32.const 1760 - call $~lib/uri/encodeURIComponent - local.set $0 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace global.get $~lib/memory/__stack_pointer - local.get $0 + i32.const 1632 i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=4 - local.get $0 - i32.const 1760 - call $~lib/string/String.__eq + i32.const 1632 + i32.const 1 + local.get $1 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + i32.const 1 + local.get $1 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + local.get $1 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + select i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 7 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1792 - i32.store offset=8 - i32.const 1792 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer + i32.const 1 + i32.const 1 local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1792 - i32.store offset=4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u local.get $0 - i32.const 1792 - call $~lib/string/String.__eq - i32.eqz + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + select + select if - i32.const 0 - i32.const 1712 - i32.const 8 - i32.const 1 - call $~lib/builtins/abort - unreachable + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const -1 + return end global.get $~lib/memory/__stack_pointer - i32.const 1824 - i32.store offset=8 - i32.const 1824 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1824 - i32.store offset=4 + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub local.get $0 - i32.const 1824 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 9 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1856 - i32.store offset=8 - i32.const 1856 - call $~lib/uri/encodeURIComponent - local.set $0 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.const 4 + i32.shl + i32.or + ) + (func $start:std/uri + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check global.get $~lib/memory/__stack_pointer - i32.const 1856 - i32.store offset=4 - local.get $0 - i32.const 1856 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 10 - i32.const 1 - call $~lib/builtins/abort - unreachable - end + i64.const 0 + i64.store global.get $~lib/memory/__stack_pointer - i32.const 1952 + i32.const 0 i32.store offset=8 - i32.const 1952 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1984 - i32.store offset=4 - local.get $0 - i32.const 1984 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 14 - i32.const 1 - call $~lib/builtins/abort - unreachable - end + memory.size + i32.const 16 + i32.shl + i32.const 18172 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1200 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 1232 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 1376 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace global.get $~lib/memory/__stack_pointer - i32.const 2016 + i32.const 1056 i32.store offset=8 - i32.const 2016 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2048 - i32.store offset=4 - local.get $0 - i32.const 2048 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 15 + block $__inlined_func$~lib/uri/decodeURIComponent (result i32) + i32.const 1056 + i32.const 1052 + i32.load i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2080 - i32.store - i32.const 2080 - call $~lib/uri/encodeURIComponent - i32.const 2112 - i32.eq - if - i32.const 0 - i32.const 1712 - i32.const 16 + i32.shr_u + local.tee $1 + i32.eqz + br_if $__inlined_func$~lib/uri/decodeURIComponent + drop + local.get $1 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2160 - i32.store - i32.const 2160 - call $~lib/uri/encodeURIComponent - i32.const 2192 - i32.eq - if - i32.const 0 - i32.const 1712 - i32.const 17 + i32.shl i32.const 1 - call $~lib/builtins/abort - unreachable + call $~lib/rt/itcms/__new + local.get $1 + call $~lib/util/uri/decode end - global.get $~lib/memory/__stack_pointer - i32.const 2240 - i32.store offset=8 - i32.const 2240 - call $~lib/uri/encodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 2272 + i32.const 1696 i32.store offset=4 - local.get $0 - i32.const 2272 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 18 + block $__inlined_func$~lib/string/String.__eq (result i32) i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2304 - i32.store offset=8 - i32.const 2304 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2336 - i32.store offset=4 - local.get $0 - i32.const 2336 - call $~lib/string/String.__eq - i32.eqz - if + local.get $0 + i32.const 1696 + i32.eq + br_if $__inlined_func$~lib/string/String.__eq + drop i32.const 0 - i32.const 1712 - i32.const 19 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2384 - i32.store offset=8 - i32.const 2384 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2416 - i32.store offset=4 - local.get $0 - i32.const 2416 - call $~lib/string/String.__eq - i32.eqz - if + local.get $0 + i32.eqz + br_if $__inlined_func$~lib/string/String.__eq + drop i32.const 0 - i32.const 1712 + local.get $0 i32.const 20 + i32.sub + i32.load offset=16 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2512 - i32.store offset=8 - i32.const 2512 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2544 - i32.store offset=4 - local.get $0 - i32.const 2544 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 21 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2656 - i32.store offset=8 - i32.const 2656 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2688 - i32.store offset=4 - local.get $0 - i32.const 2688 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 22 + i32.shr_u + local.tee $1 + i32.const 1692 + i32.load i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2736 - i32.store offset=8 - i32.const 2736 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2768 - i32.store offset=4 - local.get $0 - i32.const 2768 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 23 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2816 - i32.store offset=8 - i32.const 2816 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2848 - i32.store offset=4 - local.get $0 - i32.const 2848 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 24 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2928 - i32.store offset=8 - i32.const 2928 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2960 - i32.store offset=4 - local.get $0 - i32.const 2960 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 26 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3024 - i32.store offset=8 - i32.const 3024 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3072 - i32.store offset=4 - local.get $0 - i32.const 3072 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 28 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3152 - i32.store offset=8 - i32.const 3152 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3264 - i32.store offset=4 - local.get $0 - i32.const 3264 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 30 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=8 - i32.const 1056 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=4 - local.get $0 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 43 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=8 - i32.const 1760 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=4 - local.get $0 - i32.const 1760 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 44 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3504 - i32.store offset=8 - i32.const 3504 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3504 - i32.store offset=4 - local.get $0 - i32.const 3504 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 45 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1856 - i32.store offset=8 - i32.const 1856 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1856 - i32.store offset=4 - local.get $0 - i32.const 1856 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 46 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3552 - i32.store offset=8 - i32.const 3552 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3584 - i32.store offset=4 - local.get $0 - i32.const 3584 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 50 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2656 - i32.store offset=8 - i32.const 2656 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2688 - i32.store offset=4 - local.get $0 - i32.const 2688 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 51 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2736 - i32.store offset=8 - i32.const 2736 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2768 - i32.store offset=4 - local.get $0 - i32.const 2768 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 52 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 2928 - i32.store offset=8 - i32.const 2928 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 2960 - i32.store offset=4 - local.get $0 - i32.const 2960 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 54 - i32.const 1 - call $~lib/builtins/abort - unreachable + i32.shr_u + i32.ne + br_if $__inlined_func$~lib/string/String.__eq + drop + block $__inlined_func$~lib/util/string/compareImpl (result i32) + i32.const 1696 + local.set $3 + local.get $0 + local.tee $2 + i32.const 7 + i32.and + i32.eqz + i32.const 0 + local.get $1 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $2 + i64.load + local.get $3 + i64.load + i64.eq + if + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $1 + i32.const 1 + i32.sub + local.set $0 + local.get $1 + if + local.get $2 + i32.load16_u + local.tee $4 + local.get $3 + i32.load16_u + local.tee $1 + i32.ne + if + local.get $4 + local.get $1 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $2 + i32.const 2 + i32.add + local.set $2 + local.get $3 + i32.const 2 + i32.add + local.set $3 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz end - global.get $~lib/memory/__stack_pointer - i32.const 3152 - i32.store offset=8 - i32.const 3152 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3152 - i32.store offset=4 - local.get $0 - i32.const 3152 - call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1712 - i32.const 55 + i32.const 1728 + i32.const 70 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 20012 + i32.const 18172 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 @@ -3286,12 +2630,12 @@ end call $~lib/rt/itcms/step drop - loop $while-continue|1 + loop $while-continue|12 global.get $~lib/rt/itcms/state if call $~lib/rt/itcms/step drop - br $while-continue|1 + br $while-continue|12 end end global.get $~lib/rt/itcms/total diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 092293d2ac..b4d2d9d366 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -3,6 +3,7 @@ // not escaped +/* assert(encodeURIComponent("") == ""); assert(encodeURIComponent("a") == "a"); assert(encodeURIComponent("a1") == "a1"); @@ -59,6 +60,20 @@ assert( // assert(encodeURI("\uD800")); // malformed URI sequence // assert(encodeURI("\uDFFF")); // malformed URI sequence +*/ + +// decodeURIComponent + +// assert(decodeURIComponent("") == ""); +// assert(decodeURIComponent("a") == "a"); + +assert(decodeURIComponent("%26") == "&"); + +// decodeURI + +// assert(decodeURI("") == ""); +// assert(decodeURI("a") == "a"); +// assert(decodeURI("%26") == "%26"); __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 4bf8f621e0..302e23f2d9 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3,16 +3,18 @@ (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) (type $none_=>_none (func)) - (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -21,48 +23,14 @@ (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 444) "\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") - (data (i32.const 540) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") - (data (i32.const 588) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 652) "0123456789ABCDEF") - (data (i32.const 668) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") - (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") - (data (i32.const 812) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00w\00y\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") - (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\000\000\00\00\00\00\00\00\00") - (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") - (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00#\000\00=\00\00\00\00\00\00\00") - (data (i32.const 1068) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1116) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00 \001\002\003\00 \00\00\00") - (data (i32.const 1148) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1196) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") - (data (i32.const 1228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") - (data (i32.const 1260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") - (data (i32.const 1292) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1340) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") - (data (i32.const 1372) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E\00\00\00\00\00") - (data (i32.const 1468) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") - (data (i32.const 1500) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") - (data (i32.const 1612) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00~\00\7f\00\80\00\00\00\00\00\00\00") - (data (i32.const 1644) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000\00\00\00\00\00\00\00\00\00") - (data (i32.const 1692) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") - (data (i32.const 1724) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") - (data (i32.const 1772) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") - (data (i32.const 1804) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1884) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") - (data (i32.const 1916) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 1980) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") - (data (i32.const 2028) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") - (data (i32.const 2108) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") - (data (i32.const 2220) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") - (data (i32.const 2364) "\00\01\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") - (data (i32.const 2460) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\16\00\00\00;\00,\00/\00?\00:\00@\00&\00=\00+\00$\00#\00\00\00\00\00\00\00") - (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") - (data (i32.const 2576) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 444) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") + (data (i32.const 492) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 556) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00c\000\00\00\00\00\00\00\00\00\00") + (data (i32.const 588) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00c\001\00\00\00\00\00\00\00\00\00") + (data (i32.const 620) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") + (data (i32.const 652) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 684) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 736) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -76,12 +44,11 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) - (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) - (global $~lib/rt/__rtti_base i32 (i32.const 2576)) - (global $~lib/memory/__data_end i32 (i32.const 2604)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18988)) - (global $~lib/memory/__heap_base i32 (i32.const 18988)) + (global $~lib/util/uri/URI_RESERVED i32 (i32.const 620)) + (global $~lib/rt/__rtti_base i32 (i32.const 736)) + (global $~lib/memory/__data_end i32 (i32.const 764)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17148)) + (global $~lib/memory/__heap_base i32 (i32.const 17148)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3703,38 +3670,7 @@ call $~lib/memory/memory.copy local.get $3 ) - (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - i32.const 652 - local.get $2 - i32.const 4 - i32.shr_u - i32.const 15 - i32.and - i32.add - i32.load8_u - i32.const 652 - local.get $2 - i32.const 15 - i32.and - i32.add - i32.load8_u - i32.const 16 - i32.shl - i32.or - local.set $3 - local.get $0 - local.get $1 - i32.add - i32.const 37 - i32.store16 - local.get $0 - local.get $1 - i32.add - local.get $3 - i32.store offset=2 - ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) @@ -3743,88 +3679,60 @@ (local $9 i32) (local $10 i32) (local $11 i32) + (local $12 i32) i32.const 0 local.set $4 i32.const 0 local.set $5 - local.get $2 - i32.const 1 - i32.shl - local.set $6 block $while-break|0 loop $while-continue|0 local.get $4 local.get $2 i32.lt_u - local.set $7 - local.get $7 + local.set $8 + local.get $8 if local.get $4 - local.set $8 - block $do-break|1 - loop $do-continue|1 - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $9 + local.set $6 + loop $do-continue|1 + local.get $1 + local.get $4 + local.tee $9 + i32.const 1 + i32.add + local.set $4 + local.get $9 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $7 + local.get $4 + local.get $2 + i32.lt_u + local.tee $9 + if (result i32) + local.get $7 + i32.const 37 + i32.ne + else local.get $9 - i32.const 33 - i32.sub - i32.const 94 - i32.lt_u - if - local.get $3 - local.get $9 - i32.const 33 - i32.sub - i32.add - i32.load8_u - if - br $do-break|1 - end - else - br $do-break|1 - end - local.get $4 - i32.const 1 - i32.add - local.tee $4 - local.get $2 - i32.lt_u - local.set $11 - local.get $11 - br_if $do-continue|1 end + local.set $9 + local.get $9 + br_if $do-continue|1 end local.get $4 - local.get $8 + local.get $6 i32.gt_u if local.get $4 - local.get $8 + local.get $6 i32.sub i32.const 1 i32.shl - local.set $11 - local.get $5 - local.get $11 - i32.add - local.get $6 - i32.gt_u - if - local.get $5 - local.get $11 - i32.add - local.set $6 - local.get $0 - local.get $6 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $11 + local.set $9 + local.get $9 i32.const 2 i32.eq if @@ -3832,14 +3740,14 @@ local.get $5 i32.add local.get $1 - local.get $8 + local.get $6 i32.const 1 i32.shl i32.add i32.load16_u i32.store16 else - local.get $11 + local.get $9 i32.const 4 i32.eq if @@ -3847,7 +3755,7 @@ local.get $5 i32.add local.get $1 - local.get $8 + local.get $6 i32.const 1 i32.shl i32.add @@ -3858,16 +3766,16 @@ local.get $5 i32.add local.get $1 - local.get $8 + local.get $6 i32.const 1 i32.shl i32.add - local.get $11 + local.get $9 call $~lib/memory/memory.copy end end local.get $5 - local.get $11 + local.get $9 i32.add local.set $5 local.get $4 @@ -3877,231 +3785,299 @@ br $while-break|0 end end - local.get $9 - i32.const 55296 + local.get $4 + local.get $2 i32.ge_u + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 37 + i32.ne + end if - local.get $9 - i32.const 56320 - i32.ge_u - if (result i32) - local.get $9 - i32.const 57343 - i32.le_u - else - i32.const 0 - end + i32.const 464 + i32.const 512 + i32.const 200 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 2 + i32.add + local.get $2 + i32.ge_u + if + local.get $1 + local.get $4 + i32.const 1 + i32.add + call $~lib/util/uri/loadHex + local.set $7 + local.get $7 + i32.const -1 + i32.eq if - i32.const 560 - i32.const 608 - i32.const 82 + i32.const 464 + i32.const 512 + i32.const 205 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $9 - i32.const 56319 - i32.le_u - if - local.get $4 - local.get $2 - i32.ge_u - if - i32.const 560 - i32.const 608 - i32.const 86 - i32.const 11 - call $~lib/builtins/abort - unreachable + end + local.get $4 + i32.const 3 + i32.add + local.set $4 + local.get $7 + i32.const 128 + i32.lt_u + if + local.get $3 + i32.eqz + if (result i32) + block $~lib/util/uri/isReserved|inlined.0 (result i32) + local.get $7 + local.set $9 + local.get $9 + i32.const 35 + i32.sub + i32.const 0 + i32.shr_u + i32.const 30 + i32.lt_u + if + global.get $~lib/util/uri/URI_RESERVED + local.get $9 + i32.const 35 + i32.sub + i32.add + i32.load16_u + br $~lib/util/uri/isReserved|inlined.0 + end + i32.const 0 end - local.get $1 + else + i32.const 0 + end + if + i32.const 37 + local.set $7 local.get $4 + i32.const 2 + i32.sub + local.set $4 + end + else + i32.const 0 + local.set $9 + i32.const 1 + local.set $10 + local.get $7 + i32.const 192 + i32.ge_u + if (result i32) + local.get $7 + i32.const 223 + i32.le_u + else + i32.const 0 + end + if i32.const 1 - i32.add - local.tee $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u + local.set $9 + i32.const 128 local.set $10 - local.get $10 - i32.const 56320 - i32.lt_u + local.get $7 + i32.const 31 + i32.and + local.set $7 + else + local.get $7 + i32.const 224 + i32.ge_u if (result i32) - i32.const 1 + local.get $7 + i32.const 239 + i32.le_u else - local.get $10 - i32.const 57343 - i32.gt_u + i32.const 0 end if - i32.const 560 - i32.const 608 - i32.const 90 - i32.const 11 - call $~lib/builtins/abort - unreachable + i32.const 2 + local.set $9 + i32.const 2048 + local.set $10 + local.get $7 + i32.const 15 + i32.and + local.set $7 + else + local.get $7 + i32.const 240 + i32.ge_u + if (result i32) + local.get $7 + i32.const 247 + i32.le_u + else + i32.const 0 + end + if + i32.const 3 + local.set $9 + i32.const 65536 + local.set $10 + local.get $7 + i32.const 7 + i32.and + local.set $7 + else + i32.const 0 + local.set $7 + end end - local.get $9 - i32.const 1023 - i32.and - i32.const 10 - i32.shl - local.get $10 - i32.const 1023 - i32.and - i32.or - i32.const 65536 - i32.add - local.set $9 end - end - local.get $5 - local.get $9 - i32.const 128 - i32.lt_u - if (result i32) - i32.const 1 - i32.const 6 - i32.mul - else - i32.const 4 - i32.const 6 - i32.mul - end - i32.add - local.set $11 - local.get $11 - local.get $6 - i32.gt_u - if - local.get $2 - i32.const 1 - i32.gt_u + block $while-break|2 + loop $while-continue|2 + local.get $9 + local.tee $11 + i32.const 1 + i32.sub + local.set $9 + local.get $11 + i32.const 0 + i32.gt_s + local.set $11 + local.get $11 + if + local.get $4 + local.get $2 + i32.ge_u + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 37 + i32.ne + end + if + i32.const 464 + i32.const 512 + i32.const 237 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + local.set $12 + local.get $4 + i32.const 2 + i32.add + local.get $2 + i32.ge_u + if + local.get $1 + local.get $4 + i32.const 1 + i32.add + call $~lib/util/uri/loadHex + local.set $12 + local.get $12 + i32.const -1 + i32.eq + if + i32.const 464 + i32.const 512 + i32.const 243 + i32.const 13 + call $~lib/builtins/abort + unreachable + end + end + local.get $12 + i32.const -1 + i32.eq + if + br $while-break|2 + end + local.get $4 + i32.const 3 + i32.add + local.set $4 + local.get $12 + i32.const 192 + i32.and + i32.const 128 + i32.ne + if + i32.const 0 + local.set $7 + br $while-break|2 + end + local.get $7 + i32.const 6 + i32.shl + local.get $12 + i32.const 63 + i32.and + i32.or + local.set $7 + br $while-continue|2 + end + end + end + local.get $7 + local.get $10 + i32.lt_u if (result i32) - local.get $11 i32.const 1 - i32.shl else - local.get $11 + local.get $7 + i32.const 1114111 + i32.gt_u + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 55296 + i32.ge_u + if (result i32) + local.get $7 + i32.const 57344 + i32.lt_u + else + i32.const 0 + end + end + if + i32.const 464 + i32.const 512 + i32.const 257 + i32.const 9 + call $~lib/builtins/abort + unreachable end - local.set $6 local.get $0 - local.get $6 - call $~lib/rt/itcms/__renew - local.set $0 - end - local.get $9 - i32.const 128 - i32.lt_u - if - local.get $0 - local.get $5 - local.get $9 - call $~lib/util/uri/storeHex local.get $5 - i32.const 6 i32.add - local.set $5 - else - local.get $9 - i32.const 2048 - i32.lt_u - if - local.get $0 - local.get $5 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or - call $~lib/util/uri/storeHex - local.get $5 - i32.const 6 - i32.add - local.set $5 - else - local.get $9 - i32.const 65536 - i32.lt_u - if - local.get $0 - local.get $5 - local.get $9 - i32.const 12 - i32.shr_u - i32.const 224 - i32.or - call $~lib/util/uri/storeHex - local.get $5 - i32.const 6 - i32.add - local.set $5 - else - local.get $0 - local.get $5 - local.get $9 - i32.const 18 - i32.shr_u - i32.const 240 - i32.or - call $~lib/util/uri/storeHex - local.get $5 - i32.const 6 - i32.add - local.set $5 - local.get $0 - local.get $5 - local.get $9 - i32.const 12 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - local.get $5 - i32.const 6 - i32.add - local.set $5 - end - local.get $0 - local.get $5 - local.get $9 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex - local.get $5 - i32.const 6 - i32.add - local.set $5 - end - local.get $0 - local.get $5 - local.get $9 - i32.const 63 - i32.and - i32.const 128 - i32.or - call $~lib/util/uri/storeHex + local.get $7 + i32.store16 local.get $5 - i32.const 6 + i32.const 2 i32.add local.set $5 end - local.get $4 - i32.const 1 - i32.add - local.set $4 br $while-continue|0 end end end - local.get $6 + local.get $2 + i32.const 1 + i32.shl local.get $5 i32.gt_u if @@ -4111,8 +4087,16 @@ local.set $0 end local.get $0 + i32.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + local.get $0 ) - (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) (local $1 i32) (local $2 i32) local.get $0 @@ -4133,8 +4117,8 @@ local.get $2 local.get $0 local.get $1 - global.get $~lib/util/uri/URL_UNSAFE - call $~lib/util/uri/encode + i32.const 1 + call $~lib/util/uri/decode local.set $2 local.get $2 ) @@ -4287,32 +4271,6 @@ call $~lib/util/string/compareImpl i32.eqz ) - (func $~lib/uri/encodeURI (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 - local.get $0 - local.get $1 - global.get $~lib/util/uri/URI_UNSAFE - call $~lib/util/uri/encode - local.set $2 - local.get $2 - ) (func $~lib/rt/itcms/__collect (local $0 i32) i32.const 0 @@ -4376,7 +4334,7 @@ i32.const 64 local.get $0 call $~lib/rt/itcms/__visit - i32.const 560 + i32.const 464 local.get $0 call $~lib/rt/itcms/__visit ) @@ -4421,14 +4379,153 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19008 - i32.const 19056 + i32.const 17168 + i32.const 17216 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable end ) + (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $1 + i32.const 1 + i32.sub + local.set $1 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $2 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + i32.load16_u offset=2 + local.set $3 + i32.const 576 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + i32.const 1 + local.get $2 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + i32.const 608 + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + i32.const 1 + local.get $3 + f64.convert_i32_u + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + local.get $2 + local.set $4 + local.get $4 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + end + i32.eqz + if (result i32) + i32.const 1 + else + local.get $3 + local.set $4 + local.get $4 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + end + i32.eqz + end + if + i32.const -1 + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + end + local.get $2 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.const 4 + i32.shl + local.get $3 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.or + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + ) (func $start:std/uri (local $0 i32) global.get $~lib/memory/__stack_pointer @@ -4465,749 +4562,13 @@ local.get $0 i32.store offset=8 local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 6 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 7 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 768 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 768 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 8 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 800 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 800 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 9 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 832 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 832 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 10 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 928 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 960 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 14 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 992 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1024 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 15 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1056 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - call $~lib/uri/encodeURIComponent - i32.const 1088 - i32.ne - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 16 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1136 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - call $~lib/uri/encodeURIComponent - i32.const 1168 - i32.ne - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 17 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1216 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1248 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 18 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1280 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1312 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 19 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1360 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1392 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 20 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1488 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1520 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 21 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1632 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1664 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 22 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1712 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1744 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 23 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1792 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1824 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 24 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1904 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1936 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 26 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2000 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2048 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 28 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2128 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2240 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 30 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 43 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 44 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2480 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2480 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 45 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 832 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 832 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 46 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2528 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2560 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 50 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1632 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1664 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 51 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1712 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1744 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 52 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1904 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 1936 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 54 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2128 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/encodeURI + call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store local.get $0 - i32.const 2128 + i32.const 672 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5217,8 +4578,8 @@ i32.eqz if i32.const 0 - i32.const 688 - i32.const 55 + i32.const 704 + i32.const 70 i32.const 1 call $~lib/builtins/abort unreachable From d8814feee5e5be26b0f6265e4e3f1a9e516e1e7b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 26 Mar 2021 21:41:46 +0200 Subject: [PATCH 47/87] fixes (wip) --- std/assembly/util/uri.ts | 12 +- tests/compiler/std/uri.optimized.wat | 180 ++++++++++++++------------- tests/compiler/std/uri.untouched.wat | 59 ++++----- 3 files changed, 124 insertions(+), 127 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 91ffc0db20..38f1b5f8b3 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -231,22 +231,21 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal ch = 0; } + let c1: u32 = 0; while (n-- > 0) { // decode hex - if (i >= len || ch != CharCode.PERCENT) { + if (i >= len || load(src + (i << 1)) != CharCode.PERCENT) { throw new URIError(E_URI_MALFORMED); } - let c1: u32 = 0; if (i + 2 >= len) { c1 = loadHex(src, i + 1); if (c1 == -1) { throw new URIError(E_URI_MALFORMED); } } - if (c1 == -1) break; i += 3; - if ((c1 & 0xc0) != 0x80) { + if ((c1 & 0xC0) != 0x80) { ch = 0; break; } @@ -256,10 +255,9 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal if (ch < lo || ch > 0x10FFFF || (ch >= 0xD800 && ch < 0xE000)) { throw new URIError(E_URI_MALFORMED); } - - store(dst + offset, ch); - offset += 2; } + store(dst + offset, ch); + offset += 2; } if ((len << 1) > offset) { dst = __renew(dst, offset); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index aa9b2ed683..1c152fec79 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1919,31 +1919,32 @@ (local $5 i32) (local $6 i32) (local $7 i32) + (local $8 i32) loop $while-continue|0 local.get $1 - local.get $5 + local.get $4 i32.gt_u if block $while-break|0 - local.get $5 - local.set $4 + local.get $4 + local.set $3 loop $do-continue|1 - local.get $5 + local.get $4 i32.const 1 i32.shl i32.const 1056 i32.add i32.load16_u - local.set $6 + local.set $5 local.get $1 - local.get $5 + local.get $4 i32.const 1 i32.add - local.tee $5 + local.tee $4 i32.gt_u local.tee $2 if (result i32) - local.get $6 + local.get $5 i32.const 37 i32.ne else @@ -1951,12 +1952,12 @@ end br_if $do-continue|1 end + local.get $3 local.get $4 - local.get $5 i32.lt_u if - local.get $5 local.get $4 + local.get $3 i32.sub i32.const 1 i32.shl @@ -1965,9 +1966,9 @@ i32.eq if local.get $0 - local.get $3 + local.get $6 i32.add - local.get $4 + local.get $3 i32.const 1 i32.shl i32.const 1056 @@ -1980,9 +1981,9 @@ i32.eq if local.get $0 - local.get $3 + local.get $6 i32.add - local.get $4 + local.get $3 i32.const 1 i32.shl i32.const 1056 @@ -1991,9 +1992,9 @@ i32.store else local.get $0 - local.get $3 + local.get $6 i32.add - local.get $4 + local.get $3 i32.const 1 i32.shl i32.const 1056 @@ -2003,20 +2004,20 @@ end end local.get $2 - local.get $3 + local.get $6 i32.add - local.set $3 + local.set $6 local.get $1 - local.get $5 + local.get $4 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $6 + local.get $5 i32.const 37 i32.ne local.get $1 - local.get $5 + local.get $4 i32.le_u select if @@ -2028,16 +2029,16 @@ unreachable end local.get $1 - local.get $5 + local.get $4 i32.const 2 i32.add i32.le_u if - local.get $5 + local.get $4 i32.const 1 i32.add call $~lib/util/uri/loadHex - local.tee $6 + local.tee $5 i32.const -1 i32.eq if @@ -2049,66 +2050,66 @@ unreachable end end - local.get $5 + local.get $4 i32.const 3 i32.add - local.set $5 - local.get $6 + local.set $4 + local.get $5 i32.const 128 i32.ge_u if i32.const 0 - local.set $4 + local.set $3 i32.const 1 local.set $7 - local.get $6 + local.get $5 i32.const 223 i32.le_u i32.const 0 - local.get $6 + local.get $5 i32.const 192 i32.ge_u select if (result i32) i32.const 1 - local.set $4 + local.set $3 i32.const 128 local.set $7 - local.get $6 + local.get $5 i32.const 31 i32.and else - local.get $6 + local.get $5 i32.const 239 i32.le_u i32.const 0 - local.get $6 + local.get $5 i32.const 224 i32.ge_u select if (result i32) i32.const 2 - local.set $4 + local.set $3 i32.const 2048 local.set $7 - local.get $6 + local.get $5 i32.const 15 i32.and else - local.get $6 + local.get $5 i32.const 247 i32.le_u i32.const 0 - local.get $6 + local.get $5 i32.const 240 i32.ge_u select if (result i32) i32.const 3 - local.set $4 + local.set $3 i32.const 65536 local.set $7 - local.get $6 + local.get $5 i32.const 7 i32.and else @@ -2116,47 +2117,54 @@ end end end - local.set $6 + local.set $5 + i32.const 0 + local.set $8 loop $while-continue|2 - local.get $4 + local.get $3 local.tee $2 i32.const 1 i32.sub - local.set $4 + local.set $3 local.get $2 i32.const 0 i32.gt_s if block $while-break|2 - i32.const 1 - local.get $6 - i32.const 37 - i32.ne local.get $1 - local.get $5 + local.get $4 i32.le_u - select + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 1 + i32.shl + i32.const 1056 + i32.add + i32.load16_u + i32.const 37 + i32.ne + end if i32.const 1488 i32.const 1536 - i32.const 237 + i32.const 238 i32.const 11 call $~lib/builtins/abort unreachable end - i32.const 0 - local.set $2 local.get $1 - local.get $5 + local.get $4 i32.const 2 i32.add i32.le_u if - local.get $5 + local.get $4 i32.const 1 i32.add call $~lib/util/uri/loadHex - local.tee $2 + local.tee $8 i32.const -1 i32.eq if @@ -2168,50 +2176,46 @@ unreachable end end - local.get $2 - i32.const -1 - i32.eq - br_if $while-break|2 - local.get $5 + local.get $4 i32.const 3 i32.add - local.set $5 - local.get $2 + local.set $4 + local.get $8 i32.const 192 i32.and i32.const 128 i32.ne if i32.const 0 - local.set $6 + local.set $5 br $while-break|2 end - local.get $2 + local.get $8 i32.const 63 i32.and - local.get $6 + local.get $5 i32.const 6 i32.shl i32.or - local.set $6 + local.set $5 br $while-continue|2 end end end i32.const 1 - local.get $6 + local.get $5 i32.const 57344 i32.lt_u i32.const 0 - local.get $6 + local.get $5 i32.const 55296 i32.ge_u select i32.const 1 - local.get $6 + local.get $5 i32.const 1114111 i32.gt_u - local.get $6 + local.get $5 local.get $7 i32.lt_u select @@ -2219,37 +2223,37 @@ if i32.const 1488 i32.const 1536 - i32.const 257 + i32.const 256 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $0 - local.get $3 - i32.add - local.get $6 - i32.store16 - local.get $3 - i32.const 2 - i32.add - local.set $3 end + local.get $0 + local.get $6 + i32.add + local.get $5 + i32.store16 + local.get $6 + i32.const 2 + i32.add + local.set $6 br $while-continue|0 end end end - local.get $3 + local.get $6 local.get $1 i32.const 1 i32.shl i32.lt_u if block $__inlined_func$~lib/rt/itcms/__renew - local.get $3 + local.get $6 local.get $0 i32.const 20 i32.sub - local.tee $6 + local.tee $5 i32.load i32.const -4 i32.and @@ -2257,23 +2261,23 @@ i32.sub i32.le_u if + local.get $5 local.get $6 - local.get $3 i32.store offset=16 br $__inlined_func$~lib/rt/itcms/__renew end - local.get $3 local.get $6 + local.get $5 i32.load offset=12 call $~lib/rt/itcms/__new local.tee $1 local.get $0 - local.get $3 local.get $6 + local.get $5 i32.load offset=16 local.tee $0 local.get $0 - local.get $3 + local.get $6 i32.gt_u select call $~lib/memory/memory.copy @@ -2346,7 +2350,7 @@ local.get $0 i32.const 1 i32.shl - i32.const 1054 + i32.const 1056 i32.add local.tee $1 i32.load16_u diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 302e23f2d9..c3b7868af8 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3940,18 +3940,20 @@ end end end + i32.const 0 + local.set $11 block $while-break|2 loop $while-continue|2 local.get $9 - local.tee $11 + local.tee $12 i32.const 1 i32.sub local.set $9 - local.get $11 + local.get $12 i32.const 0 i32.gt_s - local.set $11 - local.get $11 + local.set $12 + local.get $12 if local.get $4 local.get $2 @@ -3959,20 +3961,23 @@ if (result i32) i32.const 1 else - local.get $7 + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u i32.const 37 i32.ne end if i32.const 464 i32.const 512 - i32.const 237 + i32.const 238 i32.const 11 call $~lib/builtins/abort unreachable end - i32.const 0 - local.set $12 local.get $4 i32.const 2 i32.add @@ -3984,8 +3989,8 @@ i32.const 1 i32.add call $~lib/util/uri/loadHex - local.set $12 - local.get $12 + local.set $11 + local.get $11 i32.const -1 i32.eq if @@ -3997,17 +4002,11 @@ unreachable end end - local.get $12 - i32.const -1 - i32.eq - if - br $while-break|2 - end local.get $4 i32.const 3 i32.add local.set $4 - local.get $12 + local.get $11 i32.const 192 i32.and i32.const 128 @@ -4020,7 +4019,7 @@ local.get $7 i32.const 6 i32.shl - local.get $12 + local.get $11 i32.const 63 i32.and i32.or @@ -4056,21 +4055,21 @@ if i32.const 464 i32.const 512 - i32.const 257 + i32.const 256 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $0 - local.get $5 - i32.add - local.get $7 - i32.store16 - local.get $5 - i32.const 2 - i32.add - local.set $5 end + local.get $0 + local.get $5 + i32.add + local.get $7 + i32.store16 + local.get $5 + i32.const 2 + i32.add + local.set $5 br $while-continue|0 end end @@ -4400,10 +4399,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $1 - i32.const 1 - i32.sub - local.set $1 local.get $0 local.get $1 i32.const 1 From a350c00254a9f5b94664b94772bbeef2ed8223f4 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 00:32:38 +0200 Subject: [PATCH 48/87] fixes (wip) --- std/assembly/util/uri.ts | 35 +- tests/compiler/std/uri.optimized.wat | 907 ++++++++++++++++----------- tests/compiler/std/uri.ts | 10 +- tests/compiler/std/uri.untouched.wat | 515 +++++++++------ 4 files changed, 864 insertions(+), 603 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 38f1b5f8b3..c39ea213ce 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -156,13 +156,12 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize return (ch | 32) % 39 - 9; } -function loadHex(src: usize, i: usize): u32 { - // i -= 1; - let c0 = load(src + (i << 1)); - let c1 = load(src + (i << 1), 2); +function loadHex(src: usize, offset: usize): u32 { + let c0 = load(src + offset, 0); + let c1 = load(src + offset, 2); - trace("c0", 1, c0); - trace("c1", 1, c1); + // trace("c0", 1, c0); + // trace("c1", 1, c1); if (!isHex(c0) || !isHex(c1)) return -1; @@ -170,15 +169,13 @@ function loadHex(src: usize, i: usize): u32 { } export function decode(dst: usize, src: usize, len: usize, component: bool = false): usize { - var i: usize = 0, offset: usize = 0, org: usize, ch: u32; + var i: usize = 0, offset: usize = 0, org: usize, ch: u32 = 0; while (i < len) { org = i; - do { - ch = load(src + (i++ << 1)); - } while (i < len && ch != CharCode.PERCENT); + while (i < len && (ch = load(src + (i << 1))) != CharCode.PERCENT) i++; - if (i > org) { + if (ch != CharCode.PERCENT && i > org) { let size = i - org << 1; if (size == 2) { store(dst + offset, load(src + (org << 1))); @@ -199,11 +196,8 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal if (i >= len || ch != CharCode.PERCENT) { throw new URIError(E_URI_MALFORMED); } - if (i + 2 >= len) { - ch = loadHex(src, i + 1); - if (ch == -1) { - throw new URIError(E_URI_MALFORMED); - } + if (i + 2 >= len || (ch = loadHex(src, i + 1 << 1)) == -1) { + throw new URIError(E_URI_MALFORMED); } i += 3; @@ -237,11 +231,8 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal if (i >= len || load(src + (i << 1)) != CharCode.PERCENT) { throw new URIError(E_URI_MALFORMED); } - if (i + 2 >= len) { - c1 = loadHex(src, i + 1); - if (c1 == -1) { - throw new URIError(E_URI_MALFORMED); - } + if (i + 2 >= len || (c1 = loadHex(src, i + 1 << 1)) == -1) { + throw new URIError(E_URI_MALFORMED); } i += 3; @@ -262,7 +253,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal if ((len << 1) > offset) { dst = __renew(dst, offset); } - trace(changetype(dst)); + // trace(changetype(dst)); return dst; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 1c152fec79..63cf9f8fbd 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,18 +1,17 @@ (module - (type $none_=>_none (func)) (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $none_=>_none (func)) (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") - (data (i32.const 1048) "\01\00\00\00\06\00\00\00%\002\006") + (data (i32.const 1048) "\01") (data (i32.const 1068) "<") (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data (i32.const 1132) "<") @@ -27,16 +26,16 @@ (data (i32.const 1480) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") (data (i32.const 1516) "<") (data (i32.const 1528) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1580) "\1c") - (data (i32.const 1592) "\01\00\00\00\04\00\00\00c\000") - (data (i32.const 1612) "\1c") - (data (i32.const 1624) "\01\00\00\00\04\00\00\00c\001") - (data (i32.const 1644) "\01\01\00\01\00\00\00\00\01\01\00\00\01") - (data (i32.const 1667) "\01\01\00\01\00\01\01") - (data (i32.const 1676) "\1c") - (data (i32.const 1688) "\01\00\00\00\02\00\00\00&") - (data (i32.const 1708) ",") - (data (i32.const 1720) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1580) "\01\01\00\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 1603) "\01\01\00\01\00\01\01") + (data (i32.const 1612) ",") + (data (i32.const 1624) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1660) "\1c") + (data (i32.const 1672) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1692) "\1c") + (data (i32.const 1704) "\01\00\00\00\06\00\00\00%\002\006") + (data (i32.const 1724) "\1c") + (data (i32.const 1736) "\01\00\00\00\02\00\00\00&") (data (i32.const 1760) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -1912,204 +1911,306 @@ end end ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) + (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + i32.add + local.tee $1 + i32.load16_u + local.set $0 + i32.const 1 + local.get $1 + i32.load16_u offset=2 + local.tee $1 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + local.get $1 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + select + i32.eqz + i32.const 1 + i32.const 1 + local.get $0 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + local.get $0 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + select + select + if + i32.const -1 + return + end + local.get $1 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + local.get $0 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.const 4 + i32.shl + i32.or + ) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) + (local $10 i32) loop $while-continue|0 - local.get $1 + local.get $2 local.get $4 i32.gt_u if block $while-break|0 local.get $4 - local.set $3 - loop $do-continue|1 - local.get $4 - i32.const 1 - i32.shl - i32.const 1056 - i32.add - i32.load16_u - local.set $5 - local.get $1 + local.set $5 + loop $while-continue|1 + local.get $2 local.get $4 - i32.const 1 - i32.add - local.tee $4 i32.gt_u - local.tee $2 if (result i32) - local.get $5 + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $7 i32.const 37 i32.ne else - local.get $2 + i32.const 0 + end + if + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $while-continue|1 end - br_if $do-continue|1 end - local.get $3 local.get $4 - i32.lt_u + local.get $5 + i32.gt_u + i32.const 0 + local.get $7 + i32.const 37 + i32.ne + select if local.get $4 - local.get $3 + local.get $5 i32.sub i32.const 1 i32.shl - local.tee $2 + local.tee $6 i32.const 2 i32.eq if local.get $0 - local.get $6 + local.get $8 i32.add - local.get $3 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 1056 i32.add i32.load16_u i32.store16 else - local.get $2 + local.get $6 i32.const 4 i32.eq if local.get $0 - local.get $6 + local.get $8 i32.add - local.get $3 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 1056 i32.add i32.load i32.store else local.get $0 - local.get $6 + local.get $8 i32.add - local.get $3 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 1056 i32.add - local.get $2 + local.get $6 call $~lib/memory/memory.copy end end - local.get $2 local.get $6 + local.get $8 i32.add - local.set $6 - local.get $1 + local.set $8 + local.get $2 local.get $4 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $5 + local.get $7 i32.const 37 i32.ne - local.get $1 + local.get $2 local.get $4 i32.le_u select if i32.const 1488 i32.const 1536 - i32.const 200 + i32.const 197 i32.const 7 call $~lib/builtins/abort unreachable end - local.get $1 + local.get $2 local.get $4 i32.const 2 i32.add i32.le_u - if + if (result i32) + i32.const 1 + else + local.get $1 local.get $4 i32.const 1 i32.add + i32.const 1 + i32.shl call $~lib/util/uri/loadHex - local.tee $5 + local.tee $7 i32.const -1 i32.eq - if - i32.const 1488 - i32.const 1536 - i32.const 205 - i32.const 9 - call $~lib/builtins/abort - unreachable - end + end + if + i32.const 1488 + i32.const 1536 + i32.const 200 + i32.const 7 + call $~lib/builtins/abort + unreachable end local.get $4 i32.const 3 i32.add local.set $4 - local.get $5 + local.get $7 i32.const 128 - i32.ge_u + i32.lt_u if + local.get $3 + if (result i32) + i32.const 0 + else + block $~lib/util/uri/isReserved|inlined.0 (result i32) + local.get $7 + i32.const 35 + i32.sub + i32.const 30 + i32.lt_u + if + local.get $7 + i32.const 1545 + i32.add + i32.load16_u + br $~lib/util/uri/isReserved|inlined.0 + end + i32.const 0 + end + end + if + i32.const 37 + local.set $7 + local.get $4 + i32.const 2 + i32.sub + local.set $4 + end + else i32.const 0 - local.set $3 + local.set $5 i32.const 1 - local.set $7 - local.get $5 + local.set $9 + local.get $7 i32.const 223 i32.le_u i32.const 0 - local.get $5 + local.get $7 i32.const 192 i32.ge_u select if (result i32) i32.const 1 - local.set $3 + local.set $5 i32.const 128 - local.set $7 - local.get $5 + local.set $9 + local.get $7 i32.const 31 i32.and else - local.get $5 + local.get $7 i32.const 239 i32.le_u i32.const 0 - local.get $5 + local.get $7 i32.const 224 i32.ge_u select if (result i32) i32.const 2 - local.set $3 + local.set $5 i32.const 2048 - local.set $7 - local.get $5 + local.set $9 + local.get $7 i32.const 15 i32.and else - local.get $5 + local.get $7 i32.const 247 i32.le_u i32.const 0 - local.get $5 + local.get $7 i32.const 240 i32.ge_u select if (result i32) i32.const 3 - local.set $3 + local.set $5 i32.const 65536 - local.set $7 - local.get $5 + local.set $9 + local.get $7 i32.const 7 i32.and else @@ -2117,30 +2218,30 @@ end end end - local.set $5 + local.set $7 i32.const 0 - local.set $8 + local.set $10 loop $while-continue|2 - local.get $3 - local.tee $2 + local.get $5 + local.tee $6 i32.const 1 i32.sub - local.set $3 - local.get $2 + local.set $5 + local.get $6 i32.const 0 i32.gt_s if block $while-break|2 - local.get $1 + local.get $2 local.get $4 i32.le_u if (result i32) i32.const 1 else + local.get $1 local.get $4 i32.const 1 i32.shl - i32.const 1056 i32.add i32.load16_u i32.const 37 @@ -2149,111 +2250,116 @@ if i32.const 1488 i32.const 1536 - i32.const 238 + i32.const 232 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $1 + local.get $2 local.get $4 i32.const 2 i32.add i32.le_u - if + if (result i32) + i32.const 1 + else + local.get $1 local.get $4 i32.const 1 i32.add + i32.const 1 + i32.shl call $~lib/util/uri/loadHex - local.tee $8 + local.tee $10 i32.const -1 i32.eq - if - i32.const 1488 - i32.const 1536 - i32.const 243 - i32.const 13 - call $~lib/builtins/abort - unreachable - end + end + if + i32.const 1488 + i32.const 1536 + i32.const 235 + i32.const 11 + call $~lib/builtins/abort + unreachable end local.get $4 i32.const 3 i32.add local.set $4 - local.get $8 + local.get $10 i32.const 192 i32.and i32.const 128 i32.ne if i32.const 0 - local.set $5 + local.set $7 br $while-break|2 end - local.get $8 + local.get $10 i32.const 63 i32.and - local.get $5 + local.get $7 i32.const 6 i32.shl i32.or - local.set $5 + local.set $7 br $while-continue|2 end end end i32.const 1 - local.get $5 + local.get $7 i32.const 57344 i32.lt_u i32.const 0 - local.get $5 + local.get $7 i32.const 55296 i32.ge_u select i32.const 1 - local.get $5 + local.get $7 i32.const 1114111 i32.gt_u - local.get $5 local.get $7 + local.get $9 i32.lt_u select select if i32.const 1488 i32.const 1536 - i32.const 256 + i32.const 247 i32.const 9 call $~lib/builtins/abort unreachable end end local.get $0 - local.get $6 + local.get $8 i32.add - local.get $5 + local.get $7 i32.store16 - local.get $6 + local.get $8 i32.const 2 i32.add - local.set $6 + local.set $8 br $while-continue|0 end end end - local.get $6 - local.get $1 + local.get $8 + local.get $2 i32.const 1 i32.shl i32.lt_u if block $__inlined_func$~lib/rt/itcms/__renew - local.get $6 + local.get $8 local.get $0 i32.const 20 i32.sub - local.tee $5 + local.tee $2 i32.load i32.const -4 i32.and @@ -2261,23 +2367,23 @@ i32.sub i32.le_u if - local.get $5 - local.get $6 + local.get $2 + local.get $8 i32.store offset=16 br $__inlined_func$~lib/rt/itcms/__renew end - local.get $6 - local.get $5 + local.get $8 + local.get $2 i32.load offset=12 call $~lib/rt/itcms/__new local.tee $1 local.get $0 - local.get $6 - local.get $5 + local.get $8 + local.get $2 i32.load offset=16 local.tee $0 local.get $0 - local.get $6 + local.get $8 i32.gt_u select call $~lib/memory/memory.copy @@ -2286,17 +2392,173 @@ end end local.get $0 - i32.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace + ) + (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new local.get $0 + local.get $1 + i32.const 1 + call $~lib/util/uri/decode ) - (func $~lib/rt/__visit_members (param $0 i32) - block $invalid + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + if + i32.const 0 + return + end + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $2 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + if + i32.const 0 + return + end + block $__inlined_func$~lib/util/string/compareImpl (result i32) + local.get $0 + local.tee $3 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + i32.eqz + i32.const 0 + local.get $2 + local.tee $0 + i32.const 4 + i32.ge_u + select + if + loop $do-continue|0 + local.get $3 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $3 + i32.const 8 + i32.add + local.set $3 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $0 + local.tee $2 + i32.const 1 + i32.sub + local.set $0 + local.get $2 + if + local.get $3 + i32.load16_u + local.tee $2 + local.get $1 + i32.load16_u + local.tee $4 + i32.ne + if + local.get $2 + local.get $4 + i32.sub + br $__inlined_func$~lib/util/string/compareImpl + end + local.get $3 + i32.const 2 + i32.add + local.set $3 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + end + i32.eqz + ) + (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/uri/decode + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid block $~lib/arraybuffer/ArrayBufferView block $~lib/string/String block $~lib/arraybuffer/ArrayBuffer @@ -2324,7 +2586,12 @@ (func $~start call $start:std/uri ) - (func $~stack_check + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer i32.const 1788 i32.lt_s @@ -2336,124 +2603,6 @@ call $~lib/builtins/abort unreachable end - ) - (func $~lib/util/uri/loadHex (param $0 i32) (result i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $0 - i32.const 1 - i32.shl - i32.const 1056 - i32.add - local.tee $1 - i32.load16_u - local.set $0 - local.get $1 - i32.load16_u offset=2 - local.set $1 - global.get $~lib/memory/__stack_pointer - i32.const 1600 - i32.store - i32.const 1600 - i32.const 1 - local.get $0 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - global.get $~lib/memory/__stack_pointer - i32.const 1632 - i32.store - i32.const 1632 - i32.const 1 - local.get $1 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - i32.const 1 - local.get $1 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - local.get $1 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - select - i32.eqz - i32.const 1 - i32.const 1 - local.get $0 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - local.get $0 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - select - select - if - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - i32.const -1 - return - end - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - local.get $0 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - i32.const 4 - i32.shl - i32.or - ) - (func $start:std/uri - (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check global.get $~lib/memory/__stack_pointer i64.const 0 i64.store @@ -2480,139 +2629,143 @@ global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 - block $__inlined_func$~lib/uri/decodeURIComponent (result i32) - i32.const 1056 - i32.const 1052 - i32.load - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - br_if $__inlined_func$~lib/uri/decodeURIComponent - drop - local.get $1 - i32.const 1 - i32.shl + i32.const 1056 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1632 + i32.const 67 i32.const 1 - call $~lib/rt/itcms/__new - local.get $1 - call $~lib/util/uri/decode + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 1680 + i32.store offset=8 + i32.const 1680 + call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1696 + i32.const 1680 i32.store offset=4 - block $__inlined_func$~lib/string/String.__eq (result i32) + local.get $0 + i32.const 1680 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1632 + i32.const 68 i32.const 1 - local.get $0 - i32.const 1696 - i32.eq - br_if $__inlined_func$~lib/string/String.__eq - drop + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1712 + i32.store offset=8 + i32.const 1712 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1744 + i32.store offset=4 + local.get $0 + i32.const 1744 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $0 - i32.eqz - br_if $__inlined_func$~lib/string/String.__eq - drop + i32.const 1632 + i32.const 70 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 + i32.const 1632 + i32.const 74 i32.const 1 - i32.shr_u - local.tee $1 - i32.const 1692 - i32.load + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1680 + i32.store offset=8 + i32.const 1680 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1680 + i32.store offset=4 + local.get $0 + i32.const 1680 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1632 + i32.const 75 i32.const 1 - i32.shr_u - i32.ne - br_if $__inlined_func$~lib/string/String.__eq - drop - block $__inlined_func$~lib/util/string/compareImpl (result i32) - i32.const 1696 - local.set $3 - local.get $0 - local.tee $2 - i32.const 7 - i32.and - i32.eqz - i32.const 0 - local.get $1 - local.tee $0 - i32.const 4 - i32.ge_u - select - if - loop $do-continue|0 - local.get $2 - i64.load - local.get $3 - i64.load - i64.eq - if - local.get $2 - i32.const 8 - i32.add - local.set $2 - local.get $3 - i32.const 8 - i32.add - local.set $3 - local.get $0 - i32.const 4 - i32.sub - local.tee $0 - i32.const 4 - i32.ge_u - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $0 - local.tee $1 - i32.const 1 - i32.sub - local.set $0 - local.get $1 - if - local.get $2 - i32.load16_u - local.tee $4 - local.get $3 - i32.load16_u - local.tee $1 - i32.ne - if - local.get $4 - local.get $1 - i32.sub - br $__inlined_func$~lib/util/string/compareImpl - end - local.get $2 - i32.const 2 - i32.add - local.set $2 - local.get $3 - i32.const 2 - i32.add - local.set $3 - br $while-continue|1 - end - end - i32.const 0 - end - i32.eqz + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 1712 + i32.store offset=8 + i32.const 1712 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1712 + i32.store offset=4 + local.get $0 + i32.const 1712 + call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1728 - i32.const 70 + i32.const 1632 + i32.const 76 i32.const 1 call $~lib/builtins/abort unreachable @@ -2634,12 +2787,12 @@ end call $~lib/rt/itcms/step drop - loop $while-continue|12 + loop $while-continue|1 global.get $~lib/rt/itcms/state if call $~lib/rt/itcms/step drop - br $while-continue|12 + br $while-continue|1 end end global.get $~lib/rt/itcms/total diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index b4d2d9d366..41a3fc4fcc 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -64,16 +64,16 @@ assert( // decodeURIComponent -// assert(decodeURIComponent("") == ""); -// assert(decodeURIComponent("a") == "a"); +assert(decodeURIComponent("") == ""); +assert(decodeURIComponent("a") == "a"); assert(decodeURIComponent("%26") == "&"); // decodeURI -// assert(decodeURI("") == ""); -// assert(decodeURI("a") == "a"); -// assert(decodeURI("%26") == "%26"); +assert(decodeURI("") == ""); +assert(decodeURI("a") == "a"); +assert(decodeURI("%26") == "%26"); __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index c3b7868af8..bc238b3fe3 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -6,15 +6,13 @@ (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) - (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") + (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") @@ -25,11 +23,11 @@ (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 444) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") (data (i32.const 492) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 556) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00c\000\00\00\00\00\00\00\00\00\00") - (data (i32.const 588) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00c\001\00\00\00\00\00\00\00\00\00") - (data (i32.const 620) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") - (data (i32.const 652) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 684) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 556) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") + (data (i32.const 588) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 636) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 668) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") + (data (i32.const 700) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 736) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -44,7 +42,7 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/uri/URI_RESERVED i32 (i32.const 620)) + (global $~lib/util/uri/URI_RESERVED i32 (i32.const 556)) (global $~lib/rt/__rtti_base i32 (i32.const 736)) (global $~lib/memory/__data_end i32 (i32.const 764)) (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17148)) @@ -3625,6 +3623,88 @@ end end ) + (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.add + i32.load16_u + local.set $2 + local.get $0 + local.get $1 + i32.add + i32.load16_u offset=2 + local.set $3 + local.get $2 + local.set $4 + local.get $4 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + end + i32.eqz + if (result i32) + i32.const 1 + else + local.get $3 + local.set $4 + local.get $4 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + end + i32.eqz + end + if + i32.const -1 + return + end + local.get $2 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.const 4 + i32.shl + local.get $3 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.or + ) (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -3684,6 +3764,8 @@ local.set $4 i32.const 0 local.set $5 + i32.const 0 + local.set $7 block $while-break|0 loop $while-continue|0 local.get $4 @@ -3694,37 +3776,43 @@ if local.get $4 local.set $6 - loop $do-continue|1 - local.get $1 - local.get $4 - local.tee $9 - i32.const 1 - i32.add - local.set $4 - local.get $9 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $7 + loop $while-continue|1 local.get $4 local.get $2 i32.lt_u - local.tee $9 if (result i32) - local.get $7 + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $7 i32.const 37 i32.ne else - local.get $9 + i32.const 0 end local.set $9 local.get $9 - br_if $do-continue|1 + if + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $while-continue|1 + end + end + local.get $7 + i32.const 37 + i32.ne + if (result i32) + local.get $4 + local.get $6 + i32.gt_u + else + i32.const 0 end - local.get $4 - local.get $6 - i32.gt_u if local.get $4 local.get $6 @@ -3798,7 +3886,7 @@ if i32.const 464 i32.const 512 - i32.const 200 + i32.const 197 i32.const 7 call $~lib/builtins/abort unreachable @@ -3808,24 +3896,27 @@ i32.add local.get $2 i32.ge_u - if + if (result i32) + i32.const 1 + else local.get $1 local.get $4 i32.const 1 i32.add + i32.const 1 + i32.shl call $~lib/util/uri/loadHex - local.set $7 - local.get $7 + local.tee $7 i32.const -1 i32.eq - if - i32.const 464 - i32.const 512 - i32.const 205 - i32.const 9 - call $~lib/builtins/abort - unreachable - end + end + if + i32.const 464 + i32.const 512 + i32.const 200 + i32.const 7 + call $~lib/builtins/abort + unreachable end local.get $4 i32.const 3 @@ -3973,7 +4064,7 @@ if i32.const 464 i32.const 512 - i32.const 238 + i32.const 232 i32.const 11 call $~lib/builtins/abort unreachable @@ -3983,24 +4074,27 @@ i32.add local.get $2 i32.ge_u - if + if (result i32) + i32.const 1 + else local.get $1 local.get $4 i32.const 1 i32.add + i32.const 1 + i32.shl call $~lib/util/uri/loadHex - local.set $11 - local.get $11 + local.tee $11 i32.const -1 i32.eq - if - i32.const 464 - i32.const 512 - i32.const 243 - i32.const 13 - call $~lib/builtins/abort - unreachable - end + end + if + i32.const 464 + i32.const 512 + i32.const 235 + i32.const 11 + call $~lib/builtins/abort + unreachable end local.get $4 i32.const 3 @@ -4055,7 +4149,7 @@ if i32.const 464 i32.const 512 - i32.const 256 + i32.const 247 i32.const 9 call $~lib/builtins/abort unreachable @@ -4086,14 +4180,6 @@ local.set $0 end local.get $0 - i32.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - local.get $0 ) (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) (local $1 i32) @@ -4270,6 +4356,32 @@ call $~lib/util/string/compareImpl i32.eqz ) + (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/uri/decode + local.set $2 + local.get $2 + ) (func $~lib/rt/itcms/__collect (local $0 i32) i32.const 0 @@ -4386,141 +4498,6 @@ unreachable end ) - (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add - i32.load16_u - local.set $2 - local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add - i32.load16_u offset=2 - local.set $3 - i32.const 576 - local.set $5 - global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store - local.get $5 - i32.const 1 - local.get $2 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - i32.const 608 - local.set $5 - global.get $~lib/memory/__stack_pointer - local.get $5 - i32.store - local.get $5 - i32.const 1 - local.get $3 - f64.convert_i32_u - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - local.get $2 - local.set $4 - local.get $4 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $4 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - end - i32.eqz - if (result i32) - i32.const 1 - else - local.get $3 - local.set $4 - local.get $4 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $4 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - end - i32.eqz - end - if - i32.const -1 - local.set $5 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $5 - return - end - local.get $2 - local.set $4 - local.get $4 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - i32.const 4 - i32.shl - local.get $3 - local.set $4 - local.get $4 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - i32.or - local.set $5 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $5 - ) (func $start:std/uri (local $0 i32) global.get $~lib/memory/__stack_pointer @@ -4563,7 +4540,35 @@ local.get $0 i32.store local.get $0 - i32.const 672 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 67 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 656 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 656 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4573,12 +4578,124 @@ i32.eqz if i32.const 0 - i32.const 704 + i32.const 608 + i32.const 68 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 688 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 720 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 608 i32.const 70 i32.const 1 call $~lib/builtins/abort unreachable end + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 74 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 656 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 656 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 75 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 688 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 688 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 76 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__heap_base global.set $~lib/memory/__stack_pointer call $~lib/rt/itcms/__collect From 43f90cbcdd6c4a36c0f78a135c8774d74962edf6 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 00:54:36 +0200 Subject: [PATCH 49/87] opt (experimental) --- std/assembly/util/uri.ts | 10 +++- tests/compiler/std/uri.optimized.wat | 65 +++++++--------------- tests/compiler/std/uri.untouched.wat | 80 +++++++++------------------- 3 files changed, 54 insertions(+), 101 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index c39ea213ce..f2278f855f 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -163,9 +163,15 @@ function loadHex(src: usize, offset: usize): u32 { // trace("c0", 1, c0); // trace("c1", 1, c1); - if (!isHex(c0) || !isHex(c1)) return -1; + // if (!isHex(c0) || !isHex(c1)) return -1; + // return fromHex(c0) << 4 | fromHex(c1); - return fromHex(c0) << 4 | fromHex(c1); + c0 = fromHex(c0); + c1 = fromHex(c1); + + return c0 < 16 && c1 < 16 + ? c0 << 4 | c1 + : -1; } export function decode(dst: usize, src: usize, len: usize, component: bool = false): usize { diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 63cf9f8fbd..61a250e5ba 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1917,61 +1917,36 @@ i32.add local.tee $1 i32.load16_u - local.set $0 - i32.const 1 - local.get $1 - i32.load16_u offset=2 - local.tee $1 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - local.get $1 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - select - i32.eqz - i32.const 1 - i32.const 1 - local.get $0 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - local.get $0 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - select - select - if - i32.const -1 - return - end - local.get $1 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.get $0 + local.set $0 + local.get $1 + i32.load16_u offset=2 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub + local.tee $1 + local.get $0 i32.const 4 i32.shl i32.or + i32.const -1 + local.get $1 + i32.const 16 + i32.lt_u + i32.const 0 + local.get $0 + i32.const 16 + i32.lt_u + select + select ) (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) @@ -2090,7 +2065,7 @@ if i32.const 1488 i32.const 1536 - i32.const 197 + i32.const 203 i32.const 7 call $~lib/builtins/abort unreachable @@ -2117,7 +2092,7 @@ if i32.const 1488 i32.const 1536 - i32.const 200 + i32.const 206 i32.const 7 call $~lib/builtins/abort unreachable @@ -2250,7 +2225,7 @@ if i32.const 1488 i32.const 1536 - i32.const 232 + i32.const 238 i32.const 11 call $~lib/builtins/abort unreachable @@ -2277,7 +2252,7 @@ if i32.const 1488 i32.const 1536 - i32.const 235 + i32.const 241 i32.const 11 call $~lib/builtins/abort unreachable @@ -2329,7 +2304,7 @@ if i32.const 1488 i32.const 1536 - i32.const 247 + i32.const 253 i32.const 9 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index bc238b3fe3..aab9b58d51 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3640,60 +3640,13 @@ local.get $2 local.set $4 local.get $4 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $4 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - end - i32.eqz - if (result i32) - i32.const 1 - else - local.get $3 - local.set $4 - local.get $4 - i32.const 48 - i32.sub - i32.const 10 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $4 - i32.const 32 - i32.or - i32.const 97 - i32.sub - i32.const 6 - i32.lt_u - end - i32.eqz - end - if - i32.const -1 - return - end - local.get $2 - local.set $4 - local.get $4 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - i32.const 4 - i32.shl + local.set $2 local.get $3 local.set $4 local.get $4 @@ -3703,7 +3656,26 @@ i32.rem_u i32.const 9 i32.sub - i32.or + local.set $3 + local.get $2 + i32.const 16 + i32.lt_u + if (result i32) + local.get $3 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + if (result i32) + local.get $2 + i32.const 4 + i32.shl + local.get $3 + i32.or + else + i32.const -1 + end ) (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -3886,7 +3858,7 @@ if i32.const 464 i32.const 512 - i32.const 197 + i32.const 203 i32.const 7 call $~lib/builtins/abort unreachable @@ -3913,7 +3885,7 @@ if i32.const 464 i32.const 512 - i32.const 200 + i32.const 206 i32.const 7 call $~lib/builtins/abort unreachable @@ -4064,7 +4036,7 @@ if i32.const 464 i32.const 512 - i32.const 232 + i32.const 238 i32.const 11 call $~lib/builtins/abort unreachable @@ -4091,7 +4063,7 @@ if i32.const 464 i32.const 512 - i32.const 235 + i32.const 241 i32.const 11 call $~lib/builtins/abort unreachable @@ -4149,7 +4121,7 @@ if i32.const 464 i32.const 512 - i32.const 247 + i32.const 253 i32.const 9 call $~lib/builtins/abort unreachable From 16cfeb3f7ebad439e88c4cea7cfab4b91cafbef7 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 01:06:35 +0200 Subject: [PATCH 50/87] refactor --- std/assembly/util/uri.ts | 24 +++++++++----------- tests/compiler/std/uri.optimized.wat | 32 ++++---------------------- tests/compiler/std/uri.untouched.wat | 34 +++++----------------------- 3 files changed, 22 insertions(+), 68 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index f2278f855f..8a6957be44 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -199,12 +199,11 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal } // decode hex - if (i >= len || ch != CharCode.PERCENT) { - throw new URIError(E_URI_MALFORMED); - } - if (i + 2 >= len || (ch = loadHex(src, i + 1 << 1)) == -1) { - throw new URIError(E_URI_MALFORMED); - } + if ( + i + 2 >= len || + ch != CharCode.PERCENT || + (ch = loadHex(src, i + 1 << 1)) == -1 + ) throw new URIError(E_URI_MALFORMED); i += 3; if (ch < 0x80) { @@ -234,14 +233,13 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal let c1: u32 = 0; while (n-- > 0) { // decode hex - if (i >= len || load(src + (i << 1)) != CharCode.PERCENT) { - throw new URIError(E_URI_MALFORMED); - } - if (i + 2 >= len || (c1 = loadHex(src, i + 1 << 1)) == -1) { - throw new URIError(E_URI_MALFORMED); - } - i += 3; + if ( + i + 2 >= len || + load(src + (i << 1)) != CharCode.PERCENT || + (c1 = loadHex(src, i + 1 << 1)) == -1 + ) throw new URIError(E_URI_MALFORMED); + i += 3; if ((c1 & 0xC0) != 0x80) { ch = 0; break; diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 61a250e5ba..07816d72c9 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2060,21 +2060,10 @@ i32.ne local.get $2 local.get $4 - i32.le_u - select - if - i32.const 1488 - i32.const 1536 - i32.const 203 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $2 - local.get $4 i32.const 2 i32.add i32.le_u + select if (result i32) i32.const 1 else @@ -2209,6 +2198,8 @@ block $while-break|2 local.get $2 local.get $4 + i32.const 2 + i32.add i32.le_u if (result i32) i32.const 1 @@ -2222,19 +2213,6 @@ i32.const 37 i32.ne end - if - i32.const 1488 - i32.const 1536 - i32.const 238 - i32.const 11 - call $~lib/builtins/abort - unreachable - end - local.get $2 - local.get $4 - i32.const 2 - i32.add - i32.le_u if (result i32) i32.const 1 else @@ -2252,7 +2230,7 @@ if i32.const 1488 i32.const 1536 - i32.const 241 + i32.const 240 i32.const 11 call $~lib/builtins/abort unreachable @@ -2304,7 +2282,7 @@ if i32.const 1488 i32.const 1536 - i32.const 253 + i32.const 251 i32.const 9 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index aab9b58d51..264f64d470 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3846,6 +3846,8 @@ end end local.get $4 + i32.const 2 + i32.add local.get $2 i32.ge_u if (result i32) @@ -3855,19 +3857,6 @@ i32.const 37 i32.ne end - if - i32.const 464 - i32.const 512 - i32.const 203 - i32.const 7 - call $~lib/builtins/abort - unreachable - end - local.get $4 - i32.const 2 - i32.add - local.get $2 - i32.ge_u if (result i32) i32.const 1 else @@ -4019,6 +4008,8 @@ local.get $12 if local.get $4 + i32.const 2 + i32.add local.get $2 i32.ge_u if (result i32) @@ -4033,19 +4024,6 @@ i32.const 37 i32.ne end - if - i32.const 464 - i32.const 512 - i32.const 238 - i32.const 11 - call $~lib/builtins/abort - unreachable - end - local.get $4 - i32.const 2 - i32.add - local.get $2 - i32.ge_u if (result i32) i32.const 1 else @@ -4063,7 +4041,7 @@ if i32.const 464 i32.const 512 - i32.const 241 + i32.const 240 i32.const 11 call $~lib/builtins/abort unreachable @@ -4121,7 +4099,7 @@ if i32.const 464 i32.const 512 - i32.const 253 + i32.const 251 i32.const 9 call $~lib/builtins/abort unreachable From 5b9ba294a7350a38ba6ccbb6b5f8a8a25bc80d18 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 01:35:43 +0200 Subject: [PATCH 51/87] more tests --- tests/compiler/std/uri.optimized.wat | 2135 +++++++++++++++----- tests/compiler/std/uri.ts | 19 +- tests/compiler/std/uri.untouched.wat | 2718 +++++++++++++++++++------- 3 files changed, 3730 insertions(+), 1142 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 07816d72c9..72033145d6 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,13 +1,13 @@ (module - (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $none_=>_none (func)) - (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) + (type $i32_=>_none (func (param i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") @@ -22,21 +22,106 @@ (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data (i32.const 1404) "<") (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1468) ",") - (data (i32.const 1480) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") - (data (i32.const 1516) "<") - (data (i32.const 1528) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1580) "\01\01\00\01\00\00\00\00\01\01\00\00\01") - (data (i32.const 1603) "\01\01\00\01\00\01\01") - (data (i32.const 1612) ",") - (data (i32.const 1624) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") - (data (i32.const 1660) "\1c") - (data (i32.const 1672) "\01\00\00\00\02\00\00\00a") - (data (i32.const 1692) "\1c") - (data (i32.const 1704) "\01\00\00\00\06\00\00\00%\002\006") - (data (i32.const 1724) "\1c") - (data (i32.const 1736) "\01\00\00\00\02\00\00\00&") - (data (i32.const 1760) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 1469) "\01\01\01\01\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 1493) "\01\01\01\01\01\01\01") + (data (i32.const 1526) "\01\01\01\01\00\01") + (data (i32.const 1558) "\01\01\01") + (data (i32.const 1564) ",") + (data (i32.const 1576) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") + (data (i32.const 1612) "<") + (data (i32.const 1624) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1676) "0123456789ABCDEF") + (data (i32.const 1692) ",") + (data (i32.const 1704) "\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s") + (data (i32.const 1740) "\1c") + (data (i32.const 1752) "\01\00\00\00\02\00\00\00a") + (data (i32.const 1772) "\1c") + (data (i32.const 1784) "\01\00\00\00\04\00\00\00a\001") + (data (i32.const 1804) "\1c") + (data (i32.const 1816) "\01\00\00\00\06\00\00\00a\00b\00_") + (data (i32.const 1836) "\\") + (data (i32.const 1848) "\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00w\00y\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)") + (data (i32.const 1932) "\1c") + (data (i32.const 1944) "\01\00\00\00\02") + (data (i32.const 1964) "\1c") + (data (i32.const 1976) "\01\00\00\00\06\00\00\00%\000\000") + (data (i32.const 1996) "\1c") + (data (i32.const 2008) "\01\00\00\00\02\00\00\00+") + (data (i32.const 2028) "\1c") + (data (i32.const 2040) "\01\00\00\00\06\00\00\00%\002\00B") + (data (i32.const 2060) "\1c") + (data (i32.const 2072) "\01\00\00\00\06\00\00\00#\000\00=") + (data (i32.const 2092) ",") + (data (i32.const 2104) "\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D") + (data (i32.const 2140) "\1c") + (data (i32.const 2152) "\01\00\00\00\n\00\00\00 \001\002\003\00 ") + (data (i32.const 2172) ",") + (data (i32.const 2184) "\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000") + (data (i32.const 2220) "\1c") + (data (i32.const 2232) "\01\00\00\00\04\00\00\00?\00+") + (data (i32.const 2252) "\1c") + (data (i32.const 2264) "\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B") + (data (i32.const 2284) "\1c") + (data (i32.const 2296) "\01\00\00\00\n\00\00\00-\00?\001\00.\00-") + (data (i32.const 2316) ",") + (data (i32.const 2328) "\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-") + (data (i32.const 2364) "\1c") + (data (i32.const 2376) "\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") + (data (i32.const 2396) "\\") + (data (i32.const 2408) "\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E") + (data (i32.const 2492) "\1c") + (data (i32.const 2504) "\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6") + (data (i32.const 2524) "l") + (data (i32.const 2536) "\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004") + (data (i32.const 2636) "\1c") + (data (i32.const 2648) "\01\00\00\00\06\00\00\00~\00\7f\00\80") + (data (i32.const 2668) ",") + (data (i32.const 2680) "\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000") + (data (i32.const 2716) "\1c") + (data (i32.const 2728) "\01\00\00\00\04\00\00\00\00\d8\ff\df") + (data (i32.const 2748) ",") + (data (i32.const 2760) "\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F") + (data (i32.const 2796) "\1c") + (data (i32.const 2808) "\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc") + (data (i32.const 2828) "L") + (data (i32.const 2840) "\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002") + (data (i32.const 2908) "\1c") + (data (i32.const 2920) "\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d") + (data (i32.const 2940) "<") + (data (i32.const 2952) "\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D") + (data (i32.const 3004) ",") + (data (i32.const 3016) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,") + (data (i32.const 3052) "L") + (data (i32.const 3064) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C") + (data (i32.const 3132) "l") + (data (i32.const 3144) "\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 3244) "\8c") + (data (i32.const 3256) "\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 3389) "\01\00\00\01") + (data (i32.const 3415) "\01\00\01") + (data (i32.const 3446) "\01\01\01\01\00\01") + (data (i32.const 3478) "\01\01\01") + (data (i32.const 3484) ",") + (data (i32.const 3496) "\01\00\00\00\16\00\00\00;\00,\00/\00?\00:\00@\00&\00=\00+\00$\00#") + (data (i32.const 3532) "\1c") + (data (i32.const 3544) "\01\00\00\00\02\00\00\00 ") + (data (i32.const 3564) "\1c") + (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") + (data (i32.const 3596) "\01\01\00\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 3619) "\01\01\00\01\00\01\01") + (data (i32.const 3628) "\1c") + (data (i32.const 3640) "\01\00\00\00\06\00\00\00%\002\006") + (data (i32.const 3660) "\1c") + (data (i32.const 3672) "\01\00\00\00\02\00\00\00&") + (data (i32.const 3692) "L") + (data (i32.const 3704) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") + (data (i32.const 3772) ",") + (data (i32.const 3784) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") + (data (i32.const 3820) "L") + (data (i32.const 3832) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") + (data (i32.const 3900) "|") + (data (i32.const 3912) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 4032) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -47,7 +132,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 18172)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20444)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -66,7 +151,7 @@ call $~lib/rt/itcms/__visit i32.const 1088 call $~lib/rt/itcms/__visit - i32.const 1488 + i32.const 1584 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 @@ -178,7 +263,7 @@ if i32.const 0 local.get $0 - i32.const 18172 + i32.const 20444 i32.lt_u local.get $0 i32.load offset=8 @@ -224,7 +309,7 @@ i32.const 1 else local.get $1 - i32.const 1760 + i32.const 4032 i32.load i32.gt_u if @@ -238,7 +323,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 1764 + i32.const 4036 i32.add i32.load i32.const 32 @@ -843,10 +928,10 @@ if unreachable end - i32.const 18176 + i32.const 20448 i32.const 0 i32.store - i32.const 19744 + i32.const 22016 i32.const 0 i32.store loop $for-loop|0 @@ -857,7 +942,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 18176 + i32.const 20448 i32.add i32.const 0 i32.store offset=4 @@ -875,7 +960,7 @@ i32.add i32.const 2 i32.shl - i32.const 18176 + i32.const 20448 i32.add i32.const 0 i32.store offset=96 @@ -893,13 +978,13 @@ br $for-loop|0 end end - i32.const 18176 - i32.const 19748 + i32.const 20448 + i32.const 22020 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 18176 + i32.const 20448 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -978,7 +1063,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 18172 + i32.const 20444 i32.lt_u if local.get $0 @@ -1068,7 +1153,7 @@ unreachable end local.get $0 - i32.const 18172 + i32.const 20444 i32.lt_u if local.get $0 @@ -1091,7 +1176,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 18172 + i32.const 20444 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1911,122 +1996,169 @@ end end ) - (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) - local.get $0 + (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) local.get $1 - i32.add - local.tee $1 - i32.load16_u - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 + local.get $0 + i32.const 20 i32.sub - local.set $0 - local.get $1 - i32.load16_u offset=2 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 + local.tee $2 + i32.load + i32.const -4 + i32.and + i32.const 16 i32.sub - local.tee $1 + i32.le_u + if + local.get $2 + local.get $1 + i32.store offset=16 + local.get $0 + return + end + local.get $1 + local.get $2 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $3 + local.get $0 + local.get $1 + local.get $2 + i32.load offset=16 + local.tee $0 local.get $0 + local.get $1 + i32.gt_u + select + call $~lib/memory/memory.copy + local.get $3 + ) + (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) + local.get $2 i32.const 4 + i32.shr_u + i32.const 15 + i32.and + i32.const 1676 + i32.add + i32.load8_u + local.get $2 + i32.const 15 + i32.and + i32.const 1676 + i32.add + i32.load8_u + i32.const 16 i32.shl i32.or - i32.const -1 + local.set $2 + local.get $0 local.get $1 - i32.const 16 - i32.lt_u - i32.const 0 + i32.add + local.tee $0 + i32.const 37 + i32.store16 local.get $0 - i32.const 16 - i32.lt_u - select - select + local.get $2 + i32.store offset=2 ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) (local $9 i32) - (local $10 i32) + local.get $2 + i32.const 1 + i32.shl + local.set $8 loop $while-continue|0 local.get $2 - local.get $4 + local.get $5 i32.gt_u if block $while-break|0 - local.get $4 - local.set $5 - loop $while-continue|1 - local.get $2 - local.get $4 - i32.gt_u - if (result i32) + local.get $5 + local.set $6 + loop $do-continue|1 + block $do-break|1 local.get $1 - local.get $4 + local.get $5 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $7 - i32.const 37 - i32.ne - else - i32.const 0 - end - if + local.tee $4 + i32.const 33 + i32.sub + i32.const 94 + i32.ge_u + br_if $do-break|1 + local.get $3 local.get $4 + i32.const 33 + i32.sub + i32.add + i32.load8_u + br_if $do-break|1 + local.get $2 + local.get $5 i32.const 1 i32.add - local.set $4 - br $while-continue|1 + local.tee $5 + i32.gt_u + br_if $do-continue|1 end end - local.get $4 local.get $5 + local.get $6 i32.gt_u - i32.const 0 - local.get $7 - i32.const 37 - i32.ne - select if - local.get $4 + local.get $8 + local.get $9 local.get $5 + local.get $6 i32.sub i32.const 1 i32.shl - local.tee $6 + local.tee $7 + i32.add + i32.lt_u + if + local.get $0 + local.get $7 + local.get $9 + i32.add + local.tee $8 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $7 i32.const 2 i32.eq if local.get $0 - local.get $8 + local.get $9 i32.add local.get $1 - local.get $5 + local.get $6 i32.const 1 i32.shl i32.add i32.load16_u i32.store16 else - local.get $6 + local.get $7 i32.const 4 i32.eq if local.get $0 - local.get $8 + local.get $9 i32.add local.get $1 - local.get $5 + local.get $6 i32.const 1 i32.shl i32.add @@ -2034,319 +2166,237 @@ i32.store else local.get $0 - local.get $8 + local.get $9 i32.add local.get $1 - local.get $5 + local.get $6 i32.const 1 i32.shl i32.add - local.get $6 + local.get $7 call $~lib/memory/memory.copy end end - local.get $6 - local.get $8 + local.get $7 + local.get $9 i32.add - local.set $8 + local.set $9 local.get $2 - local.get $4 + local.get $5 i32.le_u br_if $while-break|0 end - i32.const 1 - local.get $7 - i32.const 37 - i32.ne - local.get $2 + local.get $8 + local.get $9 + i32.const 6 + i32.const 24 local.get $4 - i32.const 2 - i32.add - i32.le_u - select - if (result i32) - i32.const 1 - else - local.get $1 + i32.const 55296 + i32.ge_u + if local.get $4 - i32.const 1 - i32.add - i32.const 1 - i32.shl - call $~lib/util/uri/loadHex - local.tee $7 - i32.const -1 - i32.eq + i32.const 57343 + i32.le_u + i32.const 0 + local.get $4 + i32.const 56320 + i32.ge_u + select + if + i32.const 1584 + i32.const 1632 + i32.const 90 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 56319 + i32.le_u + if (result i32) + local.get $2 + local.get $5 + i32.le_u + if + i32.const 1584 + i32.const 1632 + i32.const 94 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + local.get $1 + local.get $5 + i32.const 1 + i32.add + local.tee $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $6 + i32.const 57343 + i32.gt_u + local.get $6 + i32.const 56320 + i32.lt_u + select + if + i32.const 1584 + i32.const 1632 + i32.const 98 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $6 + i32.const 1023 + i32.and + local.get $4 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + i32.or + i32.const 65536 + i32.add + else + local.get $4 + end + local.set $4 end + local.get $4 + i32.const 128 + i32.lt_u + select + i32.add + local.tee $6 + i32.lt_u if - i32.const 1488 - i32.const 1536 - i32.const 206 - i32.const 7 - call $~lib/builtins/abort - unreachable + local.get $0 + local.get $6 + i32.const 1 + i32.shl + local.get $6 + local.get $2 + i32.const 1 + i32.gt_u + select + local.tee $8 + call $~lib/rt/itcms/__renew + local.set $0 end local.get $4 - i32.const 3 - i32.add - local.set $4 - local.get $7 i32.const 128 i32.lt_u if - local.get $3 - if (result i32) - i32.const 0 - else - block $~lib/util/uri/isReserved|inlined.0 (result i32) - local.get $7 - i32.const 35 - i32.sub - i32.const 30 - i32.lt_u - if - local.get $7 - i32.const 1545 - i32.add - i32.load16_u - br $~lib/util/uri/isReserved|inlined.0 - end - i32.const 0 - end - end + local.get $0 + local.get $9 + local.get $4 + call $~lib/util/uri/storeHex + else + local.get $4 + i32.const 2048 + i32.lt_u if - i32.const 37 - local.set $7 + local.get $0 + local.get $9 local.get $4 - i32.const 2 - i32.sub - local.set $4 - end - else - i32.const 0 - local.set $5 - i32.const 1 - local.set $9 - local.get $7 - i32.const 223 - i32.le_u - i32.const 0 - local.get $7 - i32.const 192 - i32.ge_u - select - if (result i32) - i32.const 1 - local.set $5 - i32.const 128 - local.set $9 - local.get $7 - i32.const 31 - i32.and + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + call $~lib/util/uri/storeHex else - local.get $7 - i32.const 239 - i32.le_u - i32.const 0 - local.get $7 - i32.const 224 - i32.ge_u - select + local.get $0 + local.get $4 + i32.const 65536 + i32.lt_u if (result i32) - i32.const 2 - local.set $5 - i32.const 2048 - local.set $9 - local.get $7 - i32.const 15 - i32.and + local.get $0 + local.get $9 + local.get $4 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + local.get $9 + i32.const 6 + i32.add else - local.get $7 - i32.const 247 - i32.le_u - i32.const 0 - local.get $7 + local.get $0 + local.get $9 + local.get $4 + i32.const 18 + i32.shr_u i32.const 240 - i32.ge_u - select - if (result i32) - i32.const 3 - local.set $5 - i32.const 65536 - local.set $9 - local.get $7 - i32.const 7 - i32.and - else - i32.const 0 - end - end - end - local.set $7 - i32.const 0 - local.set $10 - loop $while-continue|2 - local.get $5 - local.tee $6 - i32.const 1 - i32.sub - local.set $5 - local.get $6 - i32.const 0 - i32.gt_s - if - block $while-break|2 - local.get $2 - local.get $4 - i32.const 2 - i32.add - i32.le_u - if (result i32) - i32.const 1 - else - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - i32.const 37 - i32.ne - end - if (result i32) - i32.const 1 - else - local.get $1 - local.get $4 - i32.const 1 - i32.add - i32.const 1 - i32.shl - call $~lib/util/uri/loadHex - local.tee $10 - i32.const -1 - i32.eq - end - if - i32.const 1488 - i32.const 1536 - i32.const 240 - i32.const 11 - call $~lib/builtins/abort - unreachable - end - local.get $4 - i32.const 3 - i32.add - local.set $4 - local.get $10 - i32.const 192 - i32.and - i32.const 128 - i32.ne - if - i32.const 0 - local.set $7 - br $while-break|2 - end - local.get $10 - i32.const 63 - i32.and - local.get $7 - i32.const 6 - i32.shl - i32.or - local.set $7 - br $while-continue|2 - end + i32.or + call $~lib/util/uri/storeHex + local.get $0 + local.get $9 + i32.const 6 + i32.add + local.tee $6 + local.get $4 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $6 + i32.const 6 + i32.add end + local.tee $9 + local.get $4 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex end - i32.const 1 - local.get $7 - i32.const 57344 - i32.lt_u - i32.const 0 - local.get $7 - i32.const 55296 - i32.ge_u - select - i32.const 1 - local.get $7 - i32.const 1114111 - i32.gt_u - local.get $7 + local.get $0 local.get $9 - i32.lt_u - select - select - if - i32.const 1488 - i32.const 1536 - i32.const 251 - i32.const 9 - call $~lib/builtins/abort - unreachable - end + i32.const 6 + i32.add + local.tee $9 + local.get $4 + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex end - local.get $0 - local.get $8 + local.get $9 + i32.const 6 i32.add - local.get $7 - i32.store16 - local.get $8 - i32.const 2 + local.set $9 + local.get $5 + i32.const 1 i32.add - local.set $8 + local.set $5 br $while-continue|0 end end end local.get $8 - local.get $2 - i32.const 1 - i32.shl - i32.lt_u - if - block $__inlined_func$~lib/rt/itcms/__renew - local.get $8 - local.get $0 - i32.const 20 - i32.sub - local.tee $2 - i32.load - i32.const -4 - i32.and - i32.const 16 - i32.sub - i32.le_u - if - local.get $2 - local.get $8 - i32.store offset=16 - br $__inlined_func$~lib/rt/itcms/__renew - end - local.get $8 - local.get $2 - i32.load offset=12 - call $~lib/rt/itcms/__new - local.tee $1 - local.get $0 - local.get $8 - local.get $2 - i32.load offset=16 - local.tee $0 - local.get $0 - local.get $8 - i32.gt_u - select - call $~lib/memory/memory.copy - local.get $1 - local.set $0 - end + local.get $9 + i32.gt_u + if (result i32) + local.get $0 + local.get $9 + call $~lib/rt/itcms/__renew + else + local.get $0 end - local.get $0 ) - (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) (local $1 i32) local.get $0 i32.const 20 @@ -2367,8 +2417,8 @@ call $~lib/rt/itcms/__new local.get $0 local.get $1 - i32.const 1 - call $~lib/util/uri/decode + i32.const 1468 + call $~lib/util/uri/encode ) (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -2486,7 +2536,7 @@ end i32.eqz ) - (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (func $~lib/uri/encodeURI (param $0 i32) (result i32) (local $1 i32) local.get $0 i32.const 20 @@ -2507,78 +2557,1183 @@ call $~lib/rt/itcms/__new local.get $0 local.get $1 + i32.const 3388 + call $~lib/util/uri/encode + ) + (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) + local.get $0 + local.get $1 + i32.add + local.tee $1 + i32.load16_u + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + local.set $0 + local.get $1 + i32.load16_u offset=2 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + local.tee $1 + local.get $0 + i32.const 4 + i32.shl + i32.or + i32.const -1 + local.get $1 + i32.const 16 + i32.lt_u i32.const 0 - call $~lib/util/uri/decode + local.get $0 + i32.const 16 + i32.lt_u + select + select ) - (func $~lib/rt/__visit_members (param $0 i32) - block $invalid - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + loop $while-continue|0 + local.get $2 + local.get $4 + i32.gt_u + if + block $while-break|0 + local.get $4 + local.set $5 + loop $while-continue|1 + local.get $2 + local.get $4 + i32.gt_u + if (result i32) + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $7 + i32.const 37 + i32.ne + else + i32.const 0 + end + if + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $while-continue|1 + end + end + local.get $4 + local.get $5 + i32.gt_u + i32.const 0 + local.get $7 + i32.const 37 + i32.ne + select + if + local.get $4 + local.get $5 i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + i32.const 1 + i32.shl + local.tee $6 + i32.const 2 + i32.eq + if + local.get $0 + local.get $8 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + else + local.get $6 + i32.const 4 + i32.eq + if + local.get $0 + local.get $8 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + i32.load + i32.store + else + local.get $0 + local.get $8 + i32.add + local.get $1 + local.get $5 + i32.const 1 + i32.shl + i32.add + local.get $6 + call $~lib/memory/memory.copy + end + end + local.get $6 + local.get $8 + i32.add + local.set $8 + local.get $2 + local.get $4 + i32.le_u + br_if $while-break|0 end - return - end - return - end - local.get $0 - i32.load - local.tee $0 - if - local.get $0 - call $~lib/rt/itcms/__visit - end - return + i32.const 1 + local.get $7 + i32.const 37 + i32.ne + local.get $2 + local.get $4 + i32.const 2 + i32.add + i32.le_u + select + if (result i32) + i32.const 1 + else + local.get $1 + local.get $4 + i32.const 1 + i32.add + i32.const 1 + i32.shl + call $~lib/util/uri/loadHex + local.tee $7 + i32.const -1 + i32.eq + end + if + i32.const 1584 + i32.const 1632 + i32.const 206 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 3 + i32.add + local.set $4 + local.get $7 + i32.const 128 + i32.lt_u + if + local.get $3 + if (result i32) + i32.const 0 + else + block $~lib/util/uri/isReserved|inlined.0 (result i32) + local.get $7 + i32.const 35 + i32.sub + i32.const 30 + i32.lt_u + if + local.get $7 + i32.const 3561 + i32.add + i32.load16_u + br $~lib/util/uri/isReserved|inlined.0 + end + i32.const 0 + end + end + if + i32.const 37 + local.set $7 + local.get $4 + i32.const 2 + i32.sub + local.set $4 + end + else + i32.const 0 + local.set $5 + i32.const 1 + local.set $9 + local.get $7 + i32.const 223 + i32.le_u + i32.const 0 + local.get $7 + i32.const 192 + i32.ge_u + select + if (result i32) + i32.const 1 + local.set $5 + i32.const 128 + local.set $9 + local.get $7 + i32.const 31 + i32.and + else + local.get $7 + i32.const 239 + i32.le_u + i32.const 0 + local.get $7 + i32.const 224 + i32.ge_u + select + if (result i32) + i32.const 2 + local.set $5 + i32.const 2048 + local.set $9 + local.get $7 + i32.const 15 + i32.and + else + local.get $7 + i32.const 247 + i32.le_u + i32.const 0 + local.get $7 + i32.const 240 + i32.ge_u + select + if (result i32) + i32.const 3 + local.set $5 + i32.const 65536 + local.set $9 + local.get $7 + i32.const 7 + i32.and + else + i32.const 0 + end + end + end + local.set $7 + i32.const 0 + local.set $10 + loop $while-continue|2 + local.get $5 + local.tee $6 + i32.const 1 + i32.sub + local.set $5 + local.get $6 + i32.const 0 + i32.gt_s + if + block $while-break|2 + local.get $2 + local.get $4 + i32.const 2 + i32.add + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.const 37 + i32.ne + end + if (result i32) + i32.const 1 + else + local.get $1 + local.get $4 + i32.const 1 + i32.add + i32.const 1 + i32.shl + call $~lib/util/uri/loadHex + local.tee $10 + i32.const -1 + i32.eq + end + if + i32.const 1584 + i32.const 1632 + i32.const 240 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 3 + i32.add + local.set $4 + local.get $10 + i32.const 192 + i32.and + i32.const 128 + i32.ne + if + i32.const 0 + local.set $7 + br $while-break|2 + end + local.get $10 + i32.const 63 + i32.and + local.get $7 + i32.const 6 + i32.shl + i32.or + local.set $7 + br $while-continue|2 + end + end + end + i32.const 1 + local.get $7 + i32.const 57344 + i32.lt_u + i32.const 0 + local.get $7 + i32.const 55296 + i32.ge_u + select + i32.const 1 + local.get $7 + i32.const 1114111 + i32.gt_u + local.get $7 + local.get $9 + i32.lt_u + select + select + if + i32.const 1584 + i32.const 1632 + i32.const 251 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + end + local.get $0 + local.get $8 + i32.add + local.get $7 + i32.store16 + local.get $8 + i32.const 2 + i32.add + local.set $8 + br $while-continue|0 + end + end + end + local.get $8 + local.get $2 + i32.const 1 + i32.shl + i32.lt_u + if (result i32) + local.get $0 + local.get $8 + call $~lib/rt/itcms/__renew + else + local.get $0 + end + ) + (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + i32.const 1 + call $~lib/util/uri/decode + ) + (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/uri/decode + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + unreachable + ) + (func $~start + call $start:std/uri + ) + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 4060 + i32.lt_s + if + i32.const 20464 + i32.const 20512 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + memory.size + i32.const 16 + i32.shl + i32.const 20444 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1200 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 1232 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 1376 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=8 + i32.const 1760 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=4 + local.get $0 + i32.const 1760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 7 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1792 + i32.store offset=8 + i32.const 1792 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1792 + i32.store offset=4 + local.get $0 + i32.const 1792 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 8 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store offset=8 + i32.const 1824 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1824 + i32.store offset=4 + local.get $0 + i32.const 1824 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 9 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=8 + i32.const 1856 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=4 + local.get $0 + i32.const 1856 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 10 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1952 + i32.store offset=8 + i32.const 1952 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1984 + i32.store offset=4 + local.get $0 + i32.const 1984 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 17 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2016 + i32.store offset=8 + i32.const 2016 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2048 + i32.store offset=4 + local.get $0 + i32.const 2048 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 18 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2080 + i32.store + i32.const 2080 + call $~lib/uri/encodeURIComponent + i32.const 2112 + i32.eq + if + i32.const 0 + i32.const 1712 + i32.const 19 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2160 + i32.store + i32.const 2160 + call $~lib/uri/encodeURIComponent + i32.const 2192 + i32.eq + if + i32.const 0 + i32.const 1712 + i32.const 20 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2240 + i32.store offset=8 + i32.const 2240 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2272 + i32.store offset=4 + local.get $0 + i32.const 2272 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 21 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2304 + i32.store offset=8 + i32.const 2304 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2336 + i32.store offset=4 + local.get $0 + i32.const 2336 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2384 + i32.store offset=8 + i32.const 2384 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=4 + local.get $0 + i32.const 2416 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 23 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2512 + i32.store offset=8 + i32.const 2512 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2544 + i32.store offset=4 + local.get $0 + i32.const 2544 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 24 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2656 + i32.store offset=8 + i32.const 2656 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2688 + i32.store offset=4 + local.get $0 + i32.const 2688 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=8 + i32.const 2736 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2768 + i32.store offset=4 + local.get $0 + i32.const 2768 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 26 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2816 + i32.store offset=8 + i32.const 2816 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2848 + i32.store offset=4 + local.get $0 + i32.const 2848 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 27 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2928 + i32.store offset=8 + i32.const 2928 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2960 + i32.store offset=4 + local.get $0 + i32.const 2960 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 29 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3024 + i32.store offset=8 + i32.const 3024 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3072 + i32.store offset=4 + local.get $0 + i32.const 3072 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 31 + i32.const 1 + call $~lib/builtins/abort + unreachable end - unreachable - ) - (func $~start - call $start:std/uri - ) - (func $start:std/uri - (local $0 i32) global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.sub - global.set $~lib/memory/__stack_pointer + i32.const 3152 + i32.store offset=8 + i32.const 3152 + call $~lib/uri/encodeURIComponent + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 1788 - i32.lt_s + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3264 + i32.store offset=4 + local.get $0 + i32.const 3264 + call $~lib/string/String.__eq + i32.eqz if - i32.const 18192 - i32.const 18240 + i32.const 0 + i32.const 1712 + i32.const 33 i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 46 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + i32.const 1760 + i32.store offset=8 + i32.const 1760 + call $~lib/uri/encodeURI + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 0 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=4 + local.get $0 + i32.const 1760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 47 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3504 i32.store offset=8 - memory.size - i32.const 16 - i32.shl - i32.const 18172 - i32.sub - i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 1200 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/pinSpace - i32.const 1232 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace - i32.const 1376 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/fromSpace + i32.const 3504 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3504 + i32.store offset=4 + local.get $0 + i32.const 3504 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 48 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=8 + i32.const 1856 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1856 + i32.store offset=4 + local.get $0 + i32.const 1856 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 49 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3552 + i32.store offset=8 + i32.const 3552 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3584 + i32.store offset=4 + local.get $0 + i32.const 3584 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 56 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2656 + i32.store offset=8 + i32.const 2656 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2688 + i32.store offset=4 + local.get $0 + i32.const 2688 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 57 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=8 + i32.const 2736 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2768 + i32.store offset=4 + local.get $0 + i32.const 2768 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 58 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2928 + i32.store offset=8 + i32.const 2928 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2960 + i32.store offset=4 + local.get $0 + i32.const 2960 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 60 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3152 + i32.store offset=8 + i32.const 3152 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3152 + i32.store offset=4 + local.get $0 + i32.const 3152 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 61 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 @@ -2597,56 +3752,128 @@ i32.eqz if i32.const 0 - i32.const 1632 - i32.const 67 + i32.const 1712 + i32.const 71 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=8 + i32.const 1760 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=4 + local.get $0 + i32.const 1760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 72 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3648 + i32.store offset=8 + i32.const 3648 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3680 + i32.store offset=4 + local.get $0 + i32.const 3680 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 73 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3712 + i32.store offset=8 + i32.const 3712 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3792 + i32.store offset=4 + local.get $0 + i32.const 3792 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 74 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 3840 i32.store offset=8 - i32.const 1680 + i32.const 3840 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 3792 i32.store offset=4 local.get $0 - i32.const 1680 + i32.const 3792 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1632 - i32.const 68 + i32.const 1712 + i32.const 75 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1712 + i32.const 3920 i32.store offset=8 - i32.const 1712 + i32.const 3920 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1744 + i32.const 3152 i32.store offset=4 local.get $0 - i32.const 1744 + i32.const 3152 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1632 - i32.const 70 + i32.const 1712 + i32.const 76 i32.const 1 call $~lib/builtins/abort unreachable @@ -2669,61 +3896,61 @@ i32.eqz if i32.const 0 - i32.const 1632 - i32.const 74 + i32.const 1712 + i32.const 83 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 1760 i32.store offset=8 - i32.const 1680 + i32.const 1760 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1680 + i32.const 1760 i32.store offset=4 local.get $0 - i32.const 1680 + i32.const 1760 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1632 - i32.const 75 + i32.const 1712 + i32.const 84 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1712 + i32.const 3648 i32.store offset=8 - i32.const 1712 + i32.const 3648 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 1712 + i32.const 3648 i32.store offset=4 local.get $0 - i32.const 1712 + i32.const 3648 call $~lib/string/String.__eq i32.eqz if i32.const 0 - i32.const 1632 - i32.const 76 + i32.const 1712 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 18172 + i32.const 20444 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 41a3fc4fcc..8f69749760 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -3,12 +3,14 @@ // not escaped -/* assert(encodeURIComponent("") == ""); assert(encodeURIComponent("a") == "a"); assert(encodeURIComponent("a1") == "a1"); assert(encodeURIComponent("ab_") == "ab_"); -assert(encodeURIComponent("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == "ABCDXYZafgklmnwyz0123456789-_.!~*'()"); +assert( + encodeURIComponent("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == + "ABCDXYZafgklmnwyz0123456789-_.!~*'()" +); // escaped @@ -44,7 +46,10 @@ assert( assert(encodeURI("") == ""); assert(encodeURI("a") == "a"); assert(encodeURI(";,/?:@&=+$#") == ";,/?:@&=+$#"); -assert(encodeURI("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == "ABCDXYZafgklmnwyz0123456789-_.!~*'()"); +assert( + encodeURI("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == + "ABCDXYZafgklmnwyz0123456789-_.!~*'()" +); // escaped @@ -60,14 +65,18 @@ assert( // assert(encodeURI("\uD800")); // malformed URI sequence // assert(encodeURI("\uDFFF")); // malformed URI sequence -*/ // decodeURIComponent assert(decodeURIComponent("") == ""); assert(decodeURIComponent("a") == "a"); - assert(decodeURIComponent("%26") == "&"); +assert(decodeURIComponent("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == ";/?:@=+$,#"); +assert(decodeURIComponent("%3B%2F%3F%3A%40%3D%2B%24%2C%23") == ";/?:@=+$,#"); +assert( + decodeURIComponent("http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description") == + "http://en.wikipedia.org/wiki/UTF-8#Description" +); // fail // decodeURI diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 264f64d470..c31a13b0c8 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3,12 +3,12 @@ (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) (type $none_=>_none (func)) - (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) @@ -21,14 +21,55 @@ (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 444) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") - (data (i32.const 492) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 556) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") - (data (i32.const 588) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 636) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 668) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") - (data (i32.const 700) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 736) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 444) "\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") + (data (i32.const 540) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") + (data (i32.const 588) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 652) "0123456789ABCDEF") + (data (i32.const 668) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00s\00t\00d\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00a\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00a\001\00\00\00\00\00\00\00\00\00") + (data (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00a\00b\00_\00\00\00\00\00\00\00") + (data (i32.const 812) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00A\00B\00C\00D\00X\00Y\00Z\00a\00f\00g\00k\00l\00m\00n\00w\00y\00z\000\001\002\003\004\005\006\007\008\009\00-\00_\00.\00!\00~\00*\00\'\00(\00)\00\00\00\00\00") + (data (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\000\000\00\00\00\00\00\00\00") + (data (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00+\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1004) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\00B\00\00\00\00\00\00\00") + (data (i32.const 1036) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00#\000\00=\00\00\00\00\00\00\00") + (data (i32.const 1068) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00%\002\003\000\00%\003\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1116) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00 \001\002\003\00 \00\00\00") + (data (i32.const 1148) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\12\00\00\00%\002\000\001\002\003\00%\002\000\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1196) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00?\00+\00\00\00\00\00\00\00\00\00") + (data (i32.const 1228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\003\00F\00%\002\00B\00") + (data (i32.const 1260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00-\00?\001\00.\00-\00\00\00") + (data (i32.const 1292) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00-\00%\003\00F\001\00.\00-\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1340) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00<\d8\ed\dd<\d8\fa\dd<\d8N\df") + (data (i32.const 1372) "\\\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00H\00\00\00%\00F\000\00%\009\00F\00%\008\007\00%\00A\00D\00%\00F\000\00%\009\00F\00%\008\007\00%\00B\00A\00%\00F\000\00%\009\00F\00%\008\00D\00%\008\00E\00\00\00\00\00") + (data (i32.const 1468) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00H\c5U\b1X\d58\c1\94\c6\00\00") + (data (i32.const 1500) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00Z\00\00\00%\00E\00C\00%\009\005\00%\008\008\00%\00E\00B\00%\008\005\00%\009\005\00%\00E\00D\00%\009\005\00%\009\008\00%\00E\00C\00%\008\004\00%\00B\008\00%\00E\00C\00%\009\00A\00%\009\004\00\00\00") + (data (i32.const 1612) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00~\00\7f\00\80\00\00\00\00\00\00\00") + (data (i32.const 1644) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00%\007\00F\00%\00C\002\00%\008\000\00\00\00\00\00\00\00\00\00") + (data (i32.const 1692) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\04\00\00\00\00\d8\ff\df\00\00\00\00\00\00\00\00") + (data (i32.const 1724) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\18\00\00\00%\00F\000\00%\009\000\00%\008\00F\00%\00B\00F\00\00\00\00\00") + (data (i32.const 1772) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00{\da\01\dc-\00P\da\02\dc\00\00") + (data (i32.const 1804) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\002\00\00\00%\00F\002\00%\00A\00E\00%\00B\000\00%\008\001\00-\00%\00F\002\00%\00A\004\00%\008\000\00%\008\002\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1884) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\n\00\00\00\n\00\t\00\0b\00\0c\00\0d\00\00\00") + (data (i32.const 1916) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00%\000\00A\00%\000\009\00%\000\00B\00%\000\00C\00%\000\00D\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1980) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00&\00=\00+\00$\00,\00\00\00\00\00\00\00\00\00") + (data (i32.const 2028) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\002\006\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00") + (data (i32.const 2108) "l\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\\\00\00\00h\00t\00t\00p\00:\00/\00/\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00#\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00") + (data (i32.const 2220) "\8c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00t\00\00\00h\00t\00t\00p\00%\003\00A\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00%\002\00F\00w\00i\00k\00i\00%\002\00F\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00") + (data (i32.const 2364) "\00\01\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") + (data (i32.const 2460) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\16\00\00\00;\00,\00/\00?\00:\00@\00&\00=\00+\00$\00#\00\00\00\00\00\00\00") + (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") + (data (i32.const 2572) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") + (data (i32.const 2604) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") + (data (i32.const 2636) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2668) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") + (data (i32.const 2748) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") + (data (i32.const 2796) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") + (data (i32.const 2876) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") + (data (i32.const 3008) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -42,11 +83,13 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/uri/URI_RESERVED i32 (i32.const 556)) - (global $~lib/rt/__rtti_base i32 (i32.const 736)) - (global $~lib/memory/__data_end i32 (i32.const 764)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 17148)) - (global $~lib/memory/__heap_base i32 (i32.const 17148)) + (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) + (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) + (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) + (global $~lib/rt/__rtti_base i32 (i32.const 3008)) + (global $~lib/memory/__data_end i32 (i32.const 3036)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19420)) + (global $~lib/memory/__heap_base i32 (i32.const 19420)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3623,60 +3666,6 @@ end end ) - (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - local.get $0 - local.get $1 - i32.add - i32.load16_u - local.set $2 - local.get $0 - local.get $1 - i32.add - i32.load16_u offset=2 - local.set $3 - local.get $2 - local.set $4 - local.get $4 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - local.set $2 - local.get $3 - local.set $4 - local.get $4 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - local.set $3 - local.get $2 - i32.const 16 - i32.lt_u - if (result i32) - local.get $3 - i32.const 16 - i32.lt_u - else - i32.const 0 - end - if (result i32) - local.get $2 - i32.const 4 - i32.shl - local.get $3 - i32.or - else - i32.const -1 - end - ) (func $~lib/rt/itcms/__renew (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -3722,7 +3711,38 @@ call $~lib/memory/memory.copy local.get $3 ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + i32.const 652 + local.get $2 + i32.const 4 + i32.shr_u + i32.const 15 + i32.and + i32.add + i32.load8_u + i32.const 652 + local.get $2 + i32.const 15 + i32.and + i32.add + i32.load8_u + i32.const 16 + i32.shl + i32.or + local.set $3 + local.get $0 + local.get $1 + i32.add + i32.const 37 + i32.store16 + local.get $0 + local.get $1 + i32.add + local.get $3 + i32.store offset=2 + ) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) @@ -3731,68 +3751,88 @@ (local $9 i32) (local $10 i32) (local $11 i32) - (local $12 i32) i32.const 0 local.set $4 i32.const 0 local.set $5 - i32.const 0 - local.set $7 + local.get $2 + i32.const 1 + i32.shl + local.set $6 block $while-break|0 loop $while-continue|0 local.get $4 local.get $2 i32.lt_u - local.set $8 - local.get $8 + local.set $7 + local.get $7 if local.get $4 - local.set $6 - loop $while-continue|1 - local.get $4 - local.get $2 - i32.lt_u - if (result i32) + local.set $8 + block $do-break|1 + loop $do-continue|1 local.get $1 local.get $4 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $7 - i32.const 37 - i32.ne - else - i32.const 0 - end - local.set $9 - local.get $9 - if + local.set $9 + local.get $9 + i32.const 33 + i32.sub + i32.const 94 + i32.lt_u + if + local.get $3 + local.get $9 + i32.const 33 + i32.sub + i32.add + i32.load8_u + if + br $do-break|1 + end + else + br $do-break|1 + end local.get $4 i32.const 1 i32.add - local.set $4 - br $while-continue|1 + local.tee $4 + local.get $2 + i32.lt_u + local.set $11 + local.get $11 + br_if $do-continue|1 end end - local.get $7 - i32.const 37 - i32.ne - if (result i32) - local.get $4 - local.get $6 - i32.gt_u - else - i32.const 0 - end + local.get $4 + local.get $8 + i32.gt_u if local.get $4 - local.get $6 + local.get $8 i32.sub i32.const 1 i32.shl - local.set $9 - local.get $9 + local.set $11 + local.get $5 + local.get $11 + i32.add + local.get $6 + i32.gt_u + if + local.get $5 + local.get $11 + i32.add + local.set $6 + local.get $0 + local.get $6 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $11 i32.const 2 i32.eq if @@ -3800,14 +3840,14 @@ local.get $5 i32.add local.get $1 - local.get $6 + local.get $8 i32.const 1 i32.shl i32.add i32.load16_u i32.store16 else - local.get $9 + local.get $11 i32.const 4 i32.eq if @@ -3815,7 +3855,7 @@ local.get $5 i32.add local.get $1 - local.get $6 + local.get $8 i32.const 1 i32.shl i32.add @@ -3826,16 +3866,16 @@ local.get $5 i32.add local.get $1 - local.get $6 + local.get $8 i32.const 1 i32.shl i32.add - local.get $9 + local.get $11 call $~lib/memory/memory.copy end end local.get $5 - local.get $9 + local.get $11 i32.add local.set $5 local.get $4 @@ -3845,282 +3885,231 @@ br $while-break|0 end end - local.get $4 - i32.const 2 - i32.add - local.get $2 + local.get $9 + i32.const 55296 i32.ge_u - if (result i32) - i32.const 1 - else - local.get $7 - i32.const 37 - i32.ne + if + local.get $9 + i32.const 56320 + i32.ge_u + if (result i32) + local.get $9 + i32.const 57343 + i32.le_u + else + i32.const 0 + end + if + i32.const 560 + i32.const 608 + i32.const 90 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 56319 + i32.le_u + if + local.get $4 + local.get $2 + i32.ge_u + if + i32.const 560 + i32.const 608 + i32.const 94 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $4 + i32.const 1 + i32.add + local.tee $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.set $10 + local.get $10 + i32.const 56320 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $10 + i32.const 57343 + i32.gt_u + end + if + i32.const 560 + i32.const 608 + i32.const 98 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $9 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + local.get $10 + i32.const 1023 + i32.and + i32.or + i32.const 65536 + i32.add + local.set $9 + end end + local.get $5 + local.get $9 + i32.const 128 + i32.lt_u if (result i32) i32.const 1 + i32.const 6 + i32.mul else - local.get $1 - local.get $4 - i32.const 1 - i32.add - i32.const 1 - i32.shl - call $~lib/util/uri/loadHex - local.tee $7 - i32.const -1 - i32.eq + i32.const 4 + i32.const 6 + i32.mul end + i32.add + local.set $11 + local.get $11 + local.get $6 + i32.gt_u if - i32.const 464 - i32.const 512 - i32.const 206 - i32.const 7 - call $~lib/builtins/abort - unreachable + local.get $2 + i32.const 1 + i32.gt_u + if (result i32) + local.get $11 + i32.const 1 + i32.shl + else + local.get $11 + end + local.set $6 + local.get $0 + local.get $6 + call $~lib/rt/itcms/__renew + local.set $0 end - local.get $4 - i32.const 3 - i32.add - local.set $4 - local.get $7 + local.get $9 i32.const 128 i32.lt_u if - local.get $3 - i32.eqz - if (result i32) - block $~lib/util/uri/isReserved|inlined.0 (result i32) - local.get $7 - local.set $9 - local.get $9 - i32.const 35 - i32.sub - i32.const 0 - i32.shr_u - i32.const 30 - i32.lt_u - if - global.get $~lib/util/uri/URI_RESERVED - local.get $9 - i32.const 35 - i32.sub - i32.add - i32.load16_u - br $~lib/util/uri/isReserved|inlined.0 - end - i32.const 0 - end - else - i32.const 0 - end - if - i32.const 37 - local.set $7 - local.get $4 - i32.const 2 - i32.sub - local.set $4 - end + local.get $0 + local.get $5 + local.get $9 + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 else - i32.const 0 - local.set $9 - i32.const 1 - local.set $10 - local.get $7 - i32.const 192 - i32.ge_u - if (result i32) - local.get $7 - i32.const 223 - i32.le_u - else - i32.const 0 - end + local.get $9 + i32.const 2048 + i32.lt_u if - i32.const 1 - local.set $9 - i32.const 128 - local.set $10 - local.get $7 - i32.const 31 - i32.and - local.set $7 + local.get $0 + local.get $5 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 192 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 else - local.get $7 - i32.const 224 - i32.ge_u - if (result i32) - local.get $7 - i32.const 239 - i32.le_u - else - i32.const 0 - end + local.get $9 + i32.const 65536 + i32.lt_u if - i32.const 2 - local.set $9 - i32.const 2048 - local.set $10 - local.get $7 - i32.const 15 - i32.and - local.set $7 + local.get $0 + local.get $5 + local.get $9 + i32.const 12 + i32.shr_u + i32.const 224 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 else - local.get $7 + local.get $0 + local.get $5 + local.get $9 + i32.const 18 + i32.shr_u i32.const 240 - i32.ge_u - if (result i32) - local.get $7 - i32.const 247 - i32.le_u - else - i32.const 0 - end - if - i32.const 3 - local.set $9 - i32.const 65536 - local.set $10 - local.get $7 - i32.const 7 - i32.and - local.set $7 - else - i32.const 0 - local.set $7 - end - end - end - i32.const 0 - local.set $11 - block $while-break|2 - loop $while-continue|2 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 + local.get $0 + local.get $5 local.get $9 - local.tee $12 - i32.const 1 - i32.sub - local.set $9 - local.get $12 - i32.const 0 - i32.gt_s - local.set $12 - local.get $12 - if - local.get $4 - i32.const 2 - i32.add - local.get $2 - i32.ge_u - if (result i32) - i32.const 1 - else - local.get $1 - local.get $4 - i32.const 1 - i32.shl - i32.add - i32.load16_u - i32.const 37 - i32.ne - end - if (result i32) - i32.const 1 - else - local.get $1 - local.get $4 - i32.const 1 - i32.add - i32.const 1 - i32.shl - call $~lib/util/uri/loadHex - local.tee $11 - i32.const -1 - i32.eq - end - if - i32.const 464 - i32.const 512 - i32.const 240 - i32.const 11 - call $~lib/builtins/abort - unreachable - end - local.get $4 - i32.const 3 - i32.add - local.set $4 - local.get $11 - i32.const 192 - i32.and - i32.const 128 - i32.ne - if - i32.const 0 - local.set $7 - br $while-break|2 - end - local.get $7 - i32.const 6 - i32.shl - local.get $11 - i32.const 63 - i32.and - i32.or - local.set $7 - br $while-continue|2 - end - end - end - local.get $7 - local.get $10 - i32.lt_u - if (result i32) - i32.const 1 - else - local.get $7 - i32.const 1114111 - i32.gt_u - end - if (result i32) - i32.const 1 - else - local.get $7 - i32.const 55296 - i32.ge_u - if (result i32) - local.get $7 - i32.const 57344 - i32.lt_u - else - i32.const 0 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 end + local.get $0 + local.get $5 + local.get $9 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 end - if - i32.const 464 - i32.const 512 - i32.const 251 - i32.const 9 - call $~lib/builtins/abort - unreachable - end + local.get $0 + local.get $5 + local.get $9 + i32.const 63 + i32.and + i32.const 128 + i32.or + call $~lib/util/uri/storeHex + local.get $5 + i32.const 6 + i32.add + local.set $5 end - local.get $0 - local.get $5 - i32.add - local.get $7 - i32.store16 - local.get $5 - i32.const 2 + local.get $4 + i32.const 1 i32.add - local.set $5 + local.set $4 br $while-continue|0 end end end - local.get $2 - i32.const 1 - i32.shl + local.get $6 local.get $5 i32.gt_u if @@ -4130,355 +4119,1718 @@ local.set $0 end local.get $0 - ) - (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) + ) + (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + global.get $~lib/util/uri/URL_UNSAFE + call $~lib/util/uri/encode + local.set $2 + local.get $2 + ) + (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $5 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $6 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $4 + i32.const 4 + i32.ge_u + if (result i32) + local.get $5 + i32.const 7 + i32.and + local.get $6 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-continue|0 + local.get $5 + i64.load + local.get $6 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $5 + i32.const 8 + i32.add + local.set $5 + local.get $6 + i32.const 8 + i32.add + local.set $6 + local.get $4 + i32.const 4 + i32.sub + local.set $4 + local.get $4 + i32.const 4 + i32.ge_u + local.set $7 + local.get $7 + br_if $do-continue|0 + end + end + end + loop $while-continue|1 + local.get $4 + local.tee $7 + i32.const 1 + i32.sub + local.set $4 + local.get $7 + local.set $7 + local.get $7 + if + local.get $5 + i32.load16_u + local.set $8 + local.get $6 + i32.load16_u + local.set $9 + local.get $8 + local.get $9 + i32.ne + if + local.get $8 + local.get $9 + i32.sub + return + end + local.get $5 + i32.const 2 + i32.add + local.set $5 + local.get $6 + i32.const 2 + i32.add + local.set $6 + br $while-continue|1 + end + end + i32.const 0 + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + local.get $0 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + return + end + local.get $0 + call $~lib/string/String#get:length + local.set $2 + local.get $2 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $2 + call $~lib/util/string/compareImpl + i32.eqz + ) + (func $~lib/uri/encodeURI (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + global.get $~lib/util/uri/URI_UNSAFE + call $~lib/util/uri/encode + local.set $2 + local.get $2 + ) + (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + local.get $0 + local.get $1 + i32.add + i32.load16_u + local.set $2 + local.get $0 + local.get $1 + i32.add + i32.load16_u offset=2 + local.set $3 + local.get $2 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + local.set $2 + local.get $3 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + local.set $3 + local.get $2 + i32.const 16 + i32.lt_u + if (result i32) + local.get $3 + i32.const 16 + i32.lt_u + else + i32.const 0 + end + if (result i32) + local.get $2 + i32.const 4 + i32.shl + local.get $3 + i32.or + else + i32.const -1 + end + ) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + i32.const 0 + local.set $4 + i32.const 0 + local.set $5 + i32.const 0 + local.set $7 + block $while-break|0 + loop $while-continue|0 + local.get $4 + local.get $2 + i32.lt_u + local.set $8 + local.get $8 + if + local.get $4 + local.set $6 + loop $while-continue|1 + local.get $4 + local.get $2 + i32.lt_u + if (result i32) + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + local.tee $7 + i32.const 37 + i32.ne + else + i32.const 0 + end + local.set $9 + local.get $9 + if + local.get $4 + i32.const 1 + i32.add + local.set $4 + br $while-continue|1 + end + end + local.get $7 + i32.const 37 + i32.ne + if (result i32) + local.get $4 + local.get $6 + i32.gt_u + else + i32.const 0 + end + if + local.get $4 + local.get $6 + i32.sub + i32.const 1 + i32.shl + local.set $9 + local.get $9 + i32.const 2 + i32.eq + if + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $6 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.store16 + else + local.get $9 + i32.const 4 + i32.eq + if + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $6 + i32.const 1 + i32.shl + i32.add + i32.load + i32.store + else + local.get $0 + local.get $5 + i32.add + local.get $1 + local.get $6 + i32.const 1 + i32.shl + i32.add + local.get $9 + call $~lib/memory/memory.copy + end + end + local.get $5 + local.get $9 + i32.add + local.set $5 + local.get $4 + local.get $2 + i32.ge_u + if + br $while-break|0 + end + end + local.get $4 + i32.const 2 + i32.add + local.get $2 + i32.ge_u + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 37 + i32.ne + end + if (result i32) + i32.const 1 + else + local.get $1 + local.get $4 + i32.const 1 + i32.add + i32.const 1 + i32.shl + call $~lib/util/uri/loadHex + local.tee $7 + i32.const -1 + i32.eq + end + if + i32.const 560 + i32.const 608 + i32.const 206 + i32.const 7 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 3 + i32.add + local.set $4 + local.get $7 + i32.const 128 + i32.lt_u + if + local.get $3 + i32.eqz + if (result i32) + block $~lib/util/uri/isReserved|inlined.0 (result i32) + local.get $7 + local.set $9 + local.get $9 + i32.const 35 + i32.sub + i32.const 0 + i32.shr_u + i32.const 30 + i32.lt_u + if + global.get $~lib/util/uri/URI_RESERVED + local.get $9 + i32.const 35 + i32.sub + i32.add + i32.load16_u + br $~lib/util/uri/isReserved|inlined.0 + end + i32.const 0 + end + else + i32.const 0 + end + if + i32.const 37 + local.set $7 + local.get $4 + i32.const 2 + i32.sub + local.set $4 + end + else + i32.const 0 + local.set $9 + i32.const 1 + local.set $10 + local.get $7 + i32.const 192 + i32.ge_u + if (result i32) + local.get $7 + i32.const 223 + i32.le_u + else + i32.const 0 + end + if + i32.const 1 + local.set $9 + i32.const 128 + local.set $10 + local.get $7 + i32.const 31 + i32.and + local.set $7 + else + local.get $7 + i32.const 224 + i32.ge_u + if (result i32) + local.get $7 + i32.const 239 + i32.le_u + else + i32.const 0 + end + if + i32.const 2 + local.set $9 + i32.const 2048 + local.set $10 + local.get $7 + i32.const 15 + i32.and + local.set $7 + else + local.get $7 + i32.const 240 + i32.ge_u + if (result i32) + local.get $7 + i32.const 247 + i32.le_u + else + i32.const 0 + end + if + i32.const 3 + local.set $9 + i32.const 65536 + local.set $10 + local.get $7 + i32.const 7 + i32.and + local.set $7 + else + i32.const 0 + local.set $7 + end + end + end + i32.const 0 + local.set $11 + block $while-break|2 + loop $while-continue|2 + local.get $9 + local.tee $12 + i32.const 1 + i32.sub + local.set $9 + local.get $12 + i32.const 0 + i32.gt_s + local.set $12 + local.get $12 + if + local.get $4 + i32.const 2 + i32.add + local.get $2 + i32.ge_u + if (result i32) + i32.const 1 + else + local.get $1 + local.get $4 + i32.const 1 + i32.shl + i32.add + i32.load16_u + i32.const 37 + i32.ne + end + if (result i32) + i32.const 1 + else + local.get $1 + local.get $4 + i32.const 1 + i32.add + i32.const 1 + i32.shl + call $~lib/util/uri/loadHex + local.tee $11 + i32.const -1 + i32.eq + end + if + i32.const 560 + i32.const 608 + i32.const 240 + i32.const 11 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 3 + i32.add + local.set $4 + local.get $11 + i32.const 192 + i32.and + i32.const 128 + i32.ne + if + i32.const 0 + local.set $7 + br $while-break|2 + end + local.get $7 + i32.const 6 + i32.shl + local.get $11 + i32.const 63 + i32.and + i32.or + local.set $7 + br $while-continue|2 + end + end + end + local.get $7 + local.get $10 + i32.lt_u + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 1114111 + i32.gt_u + end + if (result i32) + i32.const 1 + else + local.get $7 + i32.const 55296 + i32.ge_u + if (result i32) + local.get $7 + i32.const 57344 + i32.lt_u + else + i32.const 0 + end + end + if + i32.const 560 + i32.const 608 + i32.const 251 + i32.const 9 + call $~lib/builtins/abort + unreachable + end + end + local.get $0 + local.get $5 + i32.add + local.get $7 + i32.store16 + local.get $5 + i32.const 2 + i32.add + local.set $5 + br $while-continue|0 + end + end + end + local.get $2 + i32.const 1 + i32.shl + local.get $5 + i32.gt_u + if + local.get $0 + local.get $5 + call $~lib/rt/itcms/__renew + local.set $0 + end + local.get $0 + ) + (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + i32.const 1 + call $~lib/util/uri/decode + local.set $2 + local.get $2 + ) + (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/uri/decode + local.set $2 + local.get $2 + ) + (func $~lib/rt/itcms/__collect + (local $0 i32) + i32.const 0 + drop + global.get $~lib/rt/itcms/state + i32.const 0 + i32.gt_s + if + loop $while-continue|0 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + local.set $0 + local.get $0 + if + call $~lib/rt/itcms/step + drop + br $while-continue|0 + end + end + end + call $~lib/rt/itcms/step + drop + loop $while-continue|1 + global.get $~lib/rt/itcms/state + i32.const 0 + i32.ne + local.set $0 + local.get $0 + if + call $~lib/rt/itcms/step + drop + br $while-continue|1 + end + end + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + i32.const 0 + if (result i32) + i32.const 1 + else + i32.const 0 + end + drop + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + i32.const 256 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 64 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 560 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + i32.load + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + unreachable + ) + (func $~start + call $start:std/uri + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 19440 + i32.const 19488 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $start:std/uri + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 176 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 208 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 352 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 7 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 768 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 768 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 8 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 800 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 800 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 9 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 10 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 928 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 960 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 17 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 992 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1024 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 18 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1056 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $~lib/uri/encodeURIComponent + i32.const 1088 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 19 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1136 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $~lib/uri/encodeURIComponent + i32.const 1168 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 20 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1216 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1248 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 21 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1280 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1312 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1360 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1392 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 23 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1488 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1520 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 24 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1632 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1664 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 25 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1744 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 26 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1792 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1824 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 27 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1904 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1936 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 29 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2000 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2048 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 31 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2240 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 33 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 46 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq i32.eqz if - local.get $0 - return + i32.const 0 + i32.const 688 + i32.const 47 + i32.const 1 + call $~lib/builtins/abort + unreachable end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 + i32.const 2480 + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - local.get $1 - i32.const 1 - call $~lib/util/uri/decode - local.set $2 - local.get $2 - ) - (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) + i32.store offset=8 local.get $0 - local.get $1 - i32.const 1 - i32.shl - i32.add - local.set $5 - local.get $2 - local.get $3 - i32.const 1 - i32.shl - i32.add - local.set $6 - i32.const 0 - i32.const 2 - i32.lt_s - drop - local.get $4 - i32.const 4 - i32.ge_u - if (result i32) - local.get $5 - i32.const 7 - i32.and - local.get $6 - i32.const 7 - i32.and - i32.or - i32.eqz - else + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2480 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 + i32.const 688 + i32.const 48 + i32.const 1 + call $~lib/builtins/abort + unreachable end + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 832 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if - block $do-break|0 - loop $do-continue|0 - local.get $5 - i64.load - local.get $6 - i64.load - i64.ne - if - br $do-break|0 - end - local.get $5 - i32.const 8 - i32.add - local.set $5 - local.get $6 - i32.const 8 - i32.add - local.set $6 - local.get $4 - i32.const 4 - i32.sub - local.set $4 - local.get $4 - i32.const 4 - i32.ge_u - local.set $7 - local.get $7 - br_if $do-continue|0 - end - end - end - loop $while-continue|1 - local.get $4 - local.tee $7 + i32.const 0 + i32.const 688 + i32.const 49 i32.const 1 - i32.sub - local.set $4 - local.get $7 - local.set $7 - local.get $7 - if - local.get $5 - i32.load16_u - local.set $8 - local.get $6 - i32.load16_u - local.set $9 - local.get $8 - local.get $9 - i32.ne - if - local.get $8 - local.get $9 - i32.sub - return - end - local.get $5 - i32.const 2 - i32.add - local.set $5 - local.get $6 - i32.const 2 - i32.add - local.set $6 - br $while-continue|1 - end + call $~lib/builtins/abort + unreachable end - i32.const 0 - ) - (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + i32.const 2528 + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - local.get $1 - i32.eq + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2560 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if + i32.const 0 + i32.const 688 + i32.const 56 i32.const 1 - return + call $~lib/builtins/abort + unreachable end + i32.const 1632 + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - i32.const 0 - i32.eq - if (result i32) - i32.const 1 - else - local.get $1 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1664 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if i32.const 0 - i32.eq + i32.const 688 + i32.const 57 + i32.const 1 + call $~lib/builtins/abort + unreachable end + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1744 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if i32.const 0 - return + i32.const 688 + i32.const 58 + i32.const 1 + call $~lib/builtins/abort + unreachable end + i32.const 1904 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - call $~lib/string/String#get:length - local.set $2 - local.get $2 - local.get $1 - call $~lib/string/String#get:length - i32.ne + i32.store + local.get $0 + i32.const 1936 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if i32.const 0 - return + i32.const 688 + i32.const 60 + i32.const 1 + call $~lib/builtins/abort + unreachable end + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - i32.const 0 - local.get $1 - i32.const 0 - local.get $2 - call $~lib/util/string/compareImpl - i32.eqz - ) - (func $~lib/uri/decodeURI (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) + i32.store offset=8 local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 + call $~lib/uri/encodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq i32.eqz if - local.get $0 - return + i32.const 0 + i32.const 688 + i32.const 61 + i32.const 1 + call $~lib/builtins/abort + unreachable end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - local.get $1 - i32.const 0 - call $~lib/util/uri/decode - local.set $2 - local.get $2 - ) - (func $~lib/rt/itcms/__collect - (local $0 i32) - i32.const 0 - drop - global.get $~lib/rt/itcms/state - i32.const 0 - i32.gt_s + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if - loop $while-continue|0 - global.get $~lib/rt/itcms/state - i32.const 0 - i32.ne - local.set $0 - local.get $0 - if - call $~lib/rt/itcms/step - drop - br $while-continue|0 - end - end - end - call $~lib/rt/itcms/step - drop - loop $while-continue|1 - global.get $~lib/rt/itcms/state i32.const 0 - i32.ne - local.set $0 - local.get $0 - if - call $~lib/rt/itcms/step - drop - br $while-continue|1 - end - end - global.get $~lib/rt/itcms/total - i64.extend_i32_u - i64.const 200 - i64.mul - i64.const 100 - i64.div_u - i32.wrap_i64 - i32.const 1024 - i32.add - global.set $~lib/rt/itcms/threshold - i32.const 0 - drop - i32.const 0 - if (result i32) + i32.const 688 + i32.const 71 i32.const 1 - else - i32.const 0 + call $~lib/builtins/abort + unreachable end - drop - ) - (func $~lib/rt/__visit_globals (param $0 i32) - (local $1 i32) - i32.const 256 + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - call $~lib/rt/itcms/__visit - i32.const 64 + i32.store offset=8 local.get $0 - call $~lib/rt/itcms/__visit - i32.const 464 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer local.get $0 - call $~lib/rt/itcms/__visit - ) - (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) - (local $2 i32) + i32.store local.get $0 - i32.load - local.tee $2 - if - local.get $2 - local.get $1 - call $~lib/rt/itcms/__visit - end - ) - (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) - block $invalid - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $invalid - end - return - end - return - end - local.get $0 - local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit - return - end - unreachable - ) - (func $~start - call $start:std/uri - ) - (func $~stack_check + i32.const 736 + local.set $0 global.get $~lib/memory/__stack_pointer - global.get $~lib/memory/__data_end - i32.lt_s + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if - i32.const 17168 - i32.const 17216 - i32.const 1 + i32.const 0 + i32.const 688 + i32.const 72 i32.const 1 call $~lib/builtins/abort unreachable end - ) - (func $start:std/uri - (local $0 i32) + i32.const 2624 + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 12 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + local.get $0 + i32.store + local.get $0 + i32.const 2656 + local.set $0 global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store offset=8 - memory.size - i32.const 16 - i32.shl - global.get $~lib/memory/__heap_base - i32.sub - i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 176 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/pinSpace - i32.const 208 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace - i32.const 352 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/fromSpace - i32.const 32 + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 73 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2688 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4490,7 +5842,7 @@ local.get $0 i32.store local.get $0 - i32.const 32 + i32.const 2768 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4500,13 +5852,13 @@ i32.eqz if i32.const 0 - i32.const 608 - i32.const 67 + i32.const 688 + i32.const 74 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 656 + i32.const 2816 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4518,7 +5870,7 @@ local.get $0 i32.store local.get $0 - i32.const 656 + i32.const 2768 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4528,13 +5880,13 @@ i32.eqz if i32.const 0 - i32.const 608 - i32.const 68 + i32.const 688 + i32.const 75 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 688 + i32.const 2896 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4546,7 +5898,7 @@ local.get $0 i32.store local.get $0 - i32.const 720 + i32.const 2128 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4556,8 +5908,8 @@ i32.eqz if i32.const 0 - i32.const 608 - i32.const 70 + i32.const 688 + i32.const 76 i32.const 1 call $~lib/builtins/abort unreachable @@ -4584,13 +5936,13 @@ i32.eqz if i32.const 0 - i32.const 608 - i32.const 74 + i32.const 688 + i32.const 83 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 656 + i32.const 736 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4602,7 +5954,7 @@ local.get $0 i32.store local.get $0 - i32.const 656 + i32.const 736 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4612,13 +5964,13 @@ i32.eqz if i32.const 0 - i32.const 608 - i32.const 75 + i32.const 688 + i32.const 84 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 688 + i32.const 2624 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4630,7 +5982,7 @@ local.get $0 i32.store local.get $0 - i32.const 688 + i32.const 2624 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -4640,8 +5992,8 @@ i32.eqz if i32.const 0 - i32.const 608 - i32.const 76 + i32.const 688 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable From 54fa6ddbf979a57dc86ffc7f5cdb827708588607 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 01:42:17 +0200 Subject: [PATCH 52/87] fix --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 5 ----- tests/compiler/std/uri.ts | 2 +- tests/compiler/std/uri.untouched.wat | 13 +++---------- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 8a6957be44..18b97af3c0 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -181,7 +181,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal org = i; while (i < len && (ch = load(src + (i << 1))) != CharCode.PERCENT) i++; - if (ch != CharCode.PERCENT && i > org) { + if (i > org) { let size = i - org << 1; if (size == 2) { store(dst + offset, load(src + (org << 1))); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 72033145d6..38d343e348 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2641,11 +2641,6 @@ local.get $4 local.get $5 i32.gt_u - i32.const 0 - local.get $7 - i32.const 37 - i32.ne - select if local.get $4 local.get $5 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 8f69749760..6ee318baf0 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -76,7 +76,7 @@ assert(decodeURIComponent("%3B%2F%3F%3A%40%3D%2B%24%2C%23") == ";/?:@=+$,#"); assert( decodeURIComponent("http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description") == "http://en.wikipedia.org/wiki/UTF-8#Description" -); // fail +); // decodeURI diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index c31a13b0c8..1d0a4f36c8 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4428,16 +4428,9 @@ br $while-continue|1 end end - local.get $7 - i32.const 37 - i32.ne - if (result i32) - local.get $4 - local.get $6 - i32.gt_u - else - i32.const 0 - end + local.get $4 + local.get $6 + i32.gt_u if local.get $4 local.get $6 From f6a9c89863ff7109a591ebfcf71e1128130dc972 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 02:18:07 +0200 Subject: [PATCH 53/87] wip --- std/assembly/util/uri.ts | 6 +-- tests/compiler/std/uri.optimized.wat | 49 +++++++++++++++++++++++-- tests/compiler/std/uri.ts | 8 +++- tests/compiler/std/uri.untouched.wat | 55 ++++++++++++++++++++++++++-- 4 files changed, 107 insertions(+), 11 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 18b97af3c0..292c43182f 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -147,9 +147,9 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize } // @ts-ignore: decorator -@inline function isHex(ch: u32): bool { - return ch - CharCode._0 < 10 || (ch | 32) - CharCode.a < 6; -} +// @inline function isHex(ch: u32): bool { +// return ch - CharCode._0 < 10 || (ch | 32) - CharCode.a < 6; +// } // @ts-ignore: decorator @inline function fromHex(ch: u32): u32 { diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 38d343e348..570b386234 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -7,8 +7,10 @@ (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01") @@ -3874,6 +3876,47 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=4 + i32.const 2416 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=8 + i32.const 2416 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2384 + i32.store offset=4 + local.get $0 + i32.const 2384 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 81 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer i32.const 1056 i32.store offset=8 i32.const 1056 @@ -3892,7 +3935,7 @@ if i32.const 0 i32.const 1712 - i32.const 83 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable @@ -3916,7 +3959,7 @@ if i32.const 0 i32.const 1712 - i32.const 84 + i32.const 86 i32.const 1 call $~lib/builtins/abort unreachable @@ -3940,7 +3983,7 @@ if i32.const 0 i32.const 1712 - i32.const 85 + i32.const 87 i32.const 1 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 6ee318baf0..9cde57ab60 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -67,7 +67,7 @@ assert( // assert(encodeURI("\uDFFF")); // malformed URI sequence // decodeURIComponent - +/* assert(decodeURIComponent("") == ""); assert(decodeURIComponent("a") == "a"); assert(decodeURIComponent("%26") == "&"); @@ -76,13 +76,17 @@ assert(decodeURIComponent("%3B%2F%3F%3A%40%3D%2B%24%2C%23") == ";/?:@=+$,#"); assert( decodeURIComponent("http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description") == "http://en.wikipedia.org/wiki/UTF-8#Description" -); +);*/ + +assert(decodeURIComponent("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); // fail // decodeURI +/* assert(decodeURI("") == ""); assert(decodeURI("a") == "a"); assert(decodeURI("%26") == "%26"); +*/ __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 1d0a4f36c8..15e0a4b643 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -7,10 +7,12 @@ (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") @@ -5907,6 +5909,53 @@ call $~lib/builtins/abort unreachable end + i32.const 1392 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + i32.const 1392 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1360 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 81 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 32 local.set $0 global.get $~lib/memory/__stack_pointer @@ -5930,7 +5979,7 @@ if i32.const 0 i32.const 688 - i32.const 83 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable @@ -5958,7 +6007,7 @@ if i32.const 0 i32.const 688 - i32.const 84 + i32.const 86 i32.const 1 call $~lib/builtins/abort unreachable @@ -5986,7 +6035,7 @@ if i32.const 0 i32.const 688 - i32.const 85 + i32.const 87 i32.const 1 call $~lib/builtins/abort unreachable From 8204e0e8adb1f033d8a2a6a837966d44793667c7 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 13:27:54 +0200 Subject: [PATCH 54/87] refactor --- std/assembly/util/uri.ts | 103 ++--- tests/compiler/std/uri.optimized.wat | 598 +++++++-------------------- tests/compiler/std/uri.untouched.wat | 333 +-------------- 3 files changed, 211 insertions(+), 823 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 292c43182f..6c543d8c85 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -37,20 +37,6 @@ import { CharCode } from "./string"; 1, /* skip 191 always set to '0' tail slots */ ]); -function storeHex(dst: usize, offset: usize, ch: u32): void { - // @ts-ignore: decorator - const HEX_CHARS = memory.data([ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 - ]); - - let hex = - load(HEX_CHARS + (ch >> 4 & 0x0F)) | - load(HEX_CHARS + (ch & 0x0F)) << 16; - - store(dst + offset, CharCode.PERCENT, 0); // % - store(dst + offset, hex, 2); // XX -} export function encode(dst: usize, src: usize, len: usize, table: usize): usize { var i: usize = 0, offset: usize = 0, outSize = len << 1; @@ -138,42 +124,6 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize return dst; } -// @ts-ignore: decorator -@inline function isReserved(ch: u32): bool { - if (((ch - 35) >>> 0) < 30) { - return load(URI_RESERVED + (ch - 35)); - } - return false; -} - -// @ts-ignore: decorator -// @inline function isHex(ch: u32): bool { -// return ch - CharCode._0 < 10 || (ch | 32) - CharCode.a < 6; -// } - -// @ts-ignore: decorator -@inline function fromHex(ch: u32): u32 { - return (ch | 32) % 39 - 9; -} - -function loadHex(src: usize, offset: usize): u32 { - let c0 = load(src + offset, 0); - let c1 = load(src + offset, 2); - - // trace("c0", 1, c0); - // trace("c1", 1, c1); - - // if (!isHex(c0) || !isHex(c1)) return -1; - // return fromHex(c0) << 4 | fromHex(c1); - - c0 = fromHex(c0); - c1 = fromHex(c1); - - return c0 < 16 && c1 < 16 - ? c0 << 4 | c1 - : -1; -} - export function decode(dst: usize, src: usize, len: usize, component: bool = false): usize { var i: usize = 0, offset: usize = 0, org: usize, ch: u32 = 0; @@ -261,3 +211,56 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal return dst; } + + +// @ts-ignore: decorator +@inline function isReserved(ch: u32): bool { + if (((ch - 35) >>> 0) < 30) { + return load(URI_RESERVED + (ch - 35)); + } + return false; +} + +// @ts-ignore: decorator +// @inline function isHex(ch: u32): bool { +// return ch - CharCode._0 < 10 || (ch | 32) - CharCode.a < 6; +// } + +// @ts-ignore: decorator +@inline function fromHex(ch: u32): u32 { + return (ch | 32) % 39 - 9; +} + +function storeHex(dst: usize, offset: usize, ch: u32): void { + // @ts-ignore: decorator + const HEX_CHARS = memory.data([ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 + ]); + + let hex = + load(HEX_CHARS + (ch >> 4 & 0x0F)) | + load(HEX_CHARS + (ch & 0x0F)) << 16; + + store(dst + offset, CharCode.PERCENT, 0); // % + store(dst + offset, hex, 2); // XX +} + + +function loadHex(src: usize, offset: usize): u32 { + let c0 = load(src + offset, 0); + let c1 = load(src + offset, 2); + + // trace("c0", 1, c0); + // trace("c1", 1, c1); + + // if (!isHex(c0) || !isHex(c1)) return -1; + // return fromHex(c0) << 4 | fromHex(c1); + + c0 = fromHex(c0); + c1 = fromHex(c1); + + return c0 < 16 && c1 < 16 + ? c0 << 4 | c1 + : -1; +} diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 570b386234..ed5ac94bab 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,16 +1,14 @@ (module (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_=>_none (func (param i32 i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01") @@ -111,19 +109,7 @@ (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") (data (i32.const 3596) "\01\01\00\01\00\00\00\00\01\01\00\00\01") (data (i32.const 3619) "\01\01\00\01\00\01\01") - (data (i32.const 3628) "\1c") - (data (i32.const 3640) "\01\00\00\00\06\00\00\00%\002\006") - (data (i32.const 3660) "\1c") - (data (i32.const 3672) "\01\00\00\00\02\00\00\00&") - (data (i32.const 3692) "L") - (data (i32.const 3704) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") - (data (i32.const 3772) ",") - (data (i32.const 3784) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") - (data (i32.const 3820) "L") - (data (i32.const 3832) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") - (data (i32.const 3900) "|") - (data (i32.const 3912) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 4032) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3632) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -134,7 +120,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20444)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20044)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -265,7 +251,7 @@ if i32.const 0 local.get $0 - i32.const 20444 + i32.const 20044 i32.lt_u local.get $0 i32.load offset=8 @@ -311,7 +297,7 @@ i32.const 1 else local.get $1 - i32.const 4032 + i32.const 3632 i32.load i32.gt_u if @@ -325,7 +311,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4036 + i32.const 3636 i32.add i32.load i32.const 32 @@ -930,10 +916,10 @@ if unreachable end - i32.const 20448 + i32.const 20048 i32.const 0 i32.store - i32.const 22016 + i32.const 21616 i32.const 0 i32.store loop $for-loop|0 @@ -944,7 +930,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20448 + i32.const 20048 i32.add i32.const 0 i32.store offset=4 @@ -962,7 +948,7 @@ i32.add i32.const 2 i32.shl - i32.const 20448 + i32.const 20048 i32.add i32.const 0 i32.store offset=96 @@ -980,13 +966,13 @@ br $for-loop|0 end end - i32.const 20448 - i32.const 22020 + i32.const 20048 + i32.const 21620 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20448 + i32.const 20048 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1065,7 +1051,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20444 + i32.const 20044 i32.lt_u if local.get $0 @@ -1155,7 +1141,7 @@ unreachable end local.get $0 - i32.const 20444 + i32.const 20044 i32.lt_u if local.get $0 @@ -1178,7 +1164,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20444 + i32.const 20044 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2207,7 +2193,7 @@ if i32.const 1584 i32.const 1632 - i32.const 90 + i32.const 76 i32.const 9 call $~lib/builtins/abort unreachable @@ -2222,7 +2208,7 @@ if i32.const 1584 i32.const 1632 - i32.const 94 + i32.const 80 i32.const 11 call $~lib/builtins/abort unreachable @@ -2247,7 +2233,7 @@ if i32.const 1584 i32.const 1632 - i32.const 98 + i32.const 84 i32.const 11 call $~lib/builtins/abort unreachable @@ -2562,29 +2548,29 @@ i32.const 3388 call $~lib/util/uri/encode ) - (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) + (func $~lib/util/uri/loadHex (param $0 i32) (result i32) + (local $1 i32) local.get $0 - local.get $1 + i32.const 2416 i32.add - local.tee $1 - i32.load16_u + local.tee $0 + i32.load16_u offset=2 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.set $0 - local.get $1 - i32.load16_u offset=2 + local.tee $1 + local.get $0 + i32.load16_u i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.tee $1 - local.get $0 + local.tee $0 i32.const 4 i32.shl i32.or @@ -2599,113 +2585,113 @@ select select ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) - (local $9 i32) - (local $10 i32) loop $while-continue|0 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.gt_u if block $while-break|0 - local.get $4 - local.set $5 + local.get $3 + local.set $2 loop $while-continue|1 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.gt_u if (result i32) - local.get $1 - local.get $4 + local.get $3 i32.const 1 i32.shl + i32.const 2416 i32.add i32.load16_u - local.tee $7 + local.tee $5 i32.const 37 i32.ne else i32.const 0 end if - local.get $4 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 br $while-continue|1 end end - local.get $4 - local.get $5 - i32.gt_u + local.get $2 + local.get $3 + i32.lt_u if - local.get $4 - local.get $5 + local.get $3 + local.get $2 i32.sub i32.const 1 i32.shl - local.tee $6 + local.tee $4 i32.const 2 i32.eq if local.get $0 - local.get $8 + local.get $6 i32.add - local.get $1 - local.get $5 + local.get $2 i32.const 1 i32.shl + i32.const 2416 i32.add i32.load16_u i32.store16 else - local.get $6 + local.get $4 i32.const 4 i32.eq if local.get $0 - local.get $8 + local.get $6 i32.add - local.get $1 - local.get $5 + local.get $2 i32.const 1 i32.shl + i32.const 2416 i32.add i32.load i32.store else local.get $0 - local.get $8 + local.get $6 i32.add - local.get $1 - local.get $5 + local.get $2 i32.const 1 i32.shl + i32.const 2416 i32.add - local.get $6 + local.get $4 call $~lib/memory/memory.copy end end + local.get $4 local.get $6 - local.get $8 i32.add - local.set $8 - local.get $2 - local.get $4 + local.set $6 + local.get $1 + local.get $3 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $7 + local.get $5 i32.const 37 i32.ne - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.const 2 i32.add i32.le_u @@ -2713,114 +2699,84 @@ if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $3 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $7 + local.tee $5 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 206 + i32.const 156 i32.const 7 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 - local.get $7 + local.set $3 + local.get $5 i32.const 128 - i32.lt_u + i32.ge_u if - local.get $3 - if (result i32) - i32.const 0 - else - block $~lib/util/uri/isReserved|inlined.0 (result i32) - local.get $7 - i32.const 35 - i32.sub - i32.const 30 - i32.lt_u - if - local.get $7 - i32.const 3561 - i32.add - i32.load16_u - br $~lib/util/uri/isReserved|inlined.0 - end - i32.const 0 - end - end - if - i32.const 37 - local.set $7 - local.get $4 - i32.const 2 - i32.sub - local.set $4 - end - else i32.const 0 - local.set $5 + local.set $2 i32.const 1 - local.set $9 - local.get $7 + local.set $7 + local.get $5 i32.const 223 i32.le_u i32.const 0 - local.get $7 + local.get $5 i32.const 192 i32.ge_u select if (result i32) i32.const 1 - local.set $5 + local.set $2 i32.const 128 - local.set $9 - local.get $7 + local.set $7 + local.get $5 i32.const 31 i32.and else - local.get $7 + local.get $5 i32.const 239 i32.le_u i32.const 0 - local.get $7 + local.get $5 i32.const 224 i32.ge_u select if (result i32) i32.const 2 - local.set $5 + local.set $2 i32.const 2048 - local.set $9 - local.get $7 + local.set $7 + local.get $5 i32.const 15 i32.and else - local.get $7 - i32.const 247 + local.get $5 + i32.const 244 i32.le_u i32.const 0 - local.get $7 + local.get $5 i32.const 240 i32.ge_u select if (result i32) i32.const 3 - local.set $5 + local.set $2 i32.const 65536 - local.set $9 - local.get $7 + local.set $7 + local.get $5 i32.const 7 i32.and else @@ -2828,32 +2784,32 @@ end end end - local.set $7 + local.set $5 i32.const 0 - local.set $10 + local.set $8 loop $while-continue|2 - local.get $5 - local.tee $6 + local.get $2 + local.tee $4 i32.const 1 i32.sub - local.set $5 - local.get $6 + local.set $2 + local.get $4 i32.const 0 i32.gt_s if block $while-break|2 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.const 2 i32.add i32.le_u if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $3 i32.const 1 i32.shl + i32.const 2416 i32.add i32.load16_u i32.const 37 @@ -2862,152 +2818,103 @@ if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $3 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $10 + local.tee $8 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 240 + i32.const 190 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 - local.get $10 + local.set $3 + local.get $8 i32.const 192 i32.and i32.const 128 i32.ne if i32.const 0 - local.set $7 + local.set $5 br $while-break|2 end - local.get $10 + local.get $8 i32.const 63 i32.and - local.get $7 + local.get $5 i32.const 6 i32.shl i32.or - local.set $7 + local.set $5 br $while-continue|2 end end end i32.const 1 - local.get $7 + local.get $5 i32.const 57344 i32.lt_u i32.const 0 - local.get $7 + local.get $5 i32.const 55296 i32.ge_u select i32.const 1 - local.get $7 + local.get $5 i32.const 1114111 i32.gt_u + local.get $5 local.get $7 - local.get $9 i32.lt_u select select if i32.const 1584 i32.const 1632 - i32.const 251 + i32.const 201 i32.const 9 call $~lib/builtins/abort unreachable end end local.get $0 - local.get $8 + local.get $6 i32.add - local.get $7 + local.get $5 i32.store16 - local.get $8 + local.get $6 i32.const 2 i32.add - local.set $8 + local.set $6 br $while-continue|0 end end end - local.get $8 - local.get $2 + local.get $6 + local.get $1 i32.const 1 i32.shl i32.lt_u if (result i32) local.get $0 - local.get $8 + local.get $6 call $~lib/rt/itcms/__renew else local.get $0 end ) - (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 - i32.const 1 - call $~lib/util/uri/decode - ) - (func $~lib/uri/decodeURI (param $0 i32) (result i32) - (local $1 i32) - local.get $0 - i32.const 20 - i32.sub - i32.load offset=16 - i32.const 1 - i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 - i32.const 0 - call $~lib/util/uri/decode - ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid block $~lib/arraybuffer/ArrayBufferView @@ -3044,11 +2951,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 4060 + i32.const 3660 i32.lt_s if - i32.const 20464 - i32.const 20512 + i32.const 20064 + i32.const 20112 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3063,7 +2970,7 @@ memory.size i32.const 16 i32.shl - i32.const 20444 + i32.const 20044 i32.sub i32.const 1 i32.shr_u @@ -3732,171 +3639,26 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=8 - i32.const 1056 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=4 - local.get $0 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 71 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=8 - i32.const 1760 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=4 - local.get $0 - i32.const 1760 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 72 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3648 - i32.store offset=8 - i32.const 3648 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3680 - i32.store offset=4 - local.get $0 - i32.const 3680 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 73 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3712 + i32.const 2416 i32.store offset=8 - i32.const 3712 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3792 - i32.store offset=4 - local.get $0 - i32.const 3792 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 74 + block $__inlined_func$~lib/uri/decodeURIComponent (result i32) + i32.const 2416 + i32.const 2412 + i32.load i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3840 - i32.store offset=8 - i32.const 3840 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3792 - i32.store offset=4 - local.get $0 - i32.const 3792 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 75 + i32.shr_u + local.tee $0 + i32.eqz + br_if $__inlined_func$~lib/uri/decodeURIComponent + drop + local.get $0 i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3920 - i32.store offset=8 - i32.const 3920 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3152 - i32.store offset=4 - local.get $0 - i32.const 3152 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 76 + i32.shl i32.const 1 - call $~lib/builtins/abort - unreachable + call $~lib/rt/itcms/__new + local.get $0 + call $~lib/util/uri/decode end - global.get $~lib/memory/__stack_pointer - i32.const 2416 - i32.store offset=4 - i32.const 2416 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - global.get $~lib/memory/__stack_pointer - i32.const 2416 - i32.store offset=8 - i32.const 2416 - call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -3916,79 +3678,7 @@ call $~lib/builtins/abort unreachable end - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=8 - i32.const 1056 - call $~lib/uri/decodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1056 - i32.store offset=4 - local.get $0 - i32.const 1056 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 85 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=8 - i32.const 1760 - call $~lib/uri/decodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 1760 - i32.store offset=4 - local.get $0 - i32.const 1760 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 86 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i32.const 3648 - i32.store offset=8 - i32.const 3648 - call $~lib/uri/decodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 3648 - i32.store offset=4 - local.get $0 - i32.const 3648 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 1712 - i32.const 87 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 20444 + i32.const 20044 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 15e0a4b643..9832ca8bee 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -7,12 +7,10 @@ (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") @@ -65,13 +63,7 @@ (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") (data (i32.const 2572) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") - (data (i32.const 2604) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") - (data (i32.const 2636) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2668) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") - (data (i32.const 2748) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") - (data (i32.const 2796) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") - (data (i32.const 2876) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") - (data (i32.const 3008) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2608) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -88,10 +80,10 @@ (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) - (global $~lib/rt/__rtti_base i32 (i32.const 3008)) - (global $~lib/memory/__data_end i32 (i32.const 3036)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19420)) - (global $~lib/memory/__heap_base i32 (i32.const 19420)) + (global $~lib/rt/__rtti_base i32 (i32.const 2608)) + (global $~lib/memory/__data_end i32 (i32.const 2636)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19020)) + (global $~lib/memory/__heap_base i32 (i32.const 19020)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3904,7 +3896,7 @@ if i32.const 560 i32.const 608 - i32.const 90 + i32.const 76 i32.const 9 call $~lib/builtins/abort unreachable @@ -3919,7 +3911,7 @@ if i32.const 560 i32.const 608 - i32.const 94 + i32.const 80 i32.const 11 call $~lib/builtins/abort unreachable @@ -3947,7 +3939,7 @@ if i32.const 560 i32.const 608 - i32.const 98 + i32.const 84 i32.const 11 call $~lib/builtins/abort unreachable @@ -4522,7 +4514,7 @@ if i32.const 560 i32.const 608 - i32.const 206 + i32.const 156 i32.const 7 call $~lib/builtins/abort unreachable @@ -4620,7 +4612,7 @@ i32.ge_u if (result i32) local.get $7 - i32.const 247 + i32.const 244 i32.le_u else i32.const 0 @@ -4689,7 +4681,7 @@ if i32.const 560 i32.const 608 - i32.const 240 + i32.const 190 i32.const 11 call $~lib/builtins/abort unreachable @@ -4747,7 +4739,7 @@ if i32.const 560 i32.const 608 - i32.const 251 + i32.const 201 i32.const 9 call $~lib/builtins/abort unreachable @@ -4805,32 +4797,6 @@ local.set $2 local.get $2 ) - (func $~lib/uri/decodeURI (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 - local.get $0 - local.get $1 - i32.const 0 - call $~lib/util/uri/decode - local.set $2 - local.get $2 - ) (func $~lib/rt/itcms/__collect (local $0 i32) i32.const 0 @@ -4939,8 +4905,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19440 - i32.const 19488 + i32.const 19040 + i32.const 19088 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5741,193 +5707,6 @@ call $~lib/builtins/abort unreachable end - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 71 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 72 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2624 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2656 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 73 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2688 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2768 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 74 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2816 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2768 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 75 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2896 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2128 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 76 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1392 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/uri/decodeURIComponent - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace i32.const 1392 local.set $0 global.get $~lib/memory/__stack_pointer @@ -5956,90 +5735,6 @@ call $~lib/builtins/abort unreachable end - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 32 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 85 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 736 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 86 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 2624 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=8 - local.get $0 - call $~lib/uri/decodeURI - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 2624 - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - call $~lib/string/String.__eq - i32.eqz - if - i32.const 0 - i32.const 688 - i32.const 87 - i32.const 1 - call $~lib/builtins/abort - unreachable - end global.get $~lib/memory/__heap_base global.set $~lib/memory/__stack_pointer call $~lib/rt/itcms/__collect From 62d0fef472dab466f9c2159233ce2dfdc167a0c5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 16:56:49 +0200 Subject: [PATCH 55/87] fix --- std/assembly/util/uri.ts | 8 +- tests/compiler/std/uri.optimized.wat | 157 +++++++++++++++++---------- tests/compiler/std/uri.untouched.wat | 40 ++++++- 3 files changed, 142 insertions(+), 63 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 6c543d8c85..26f7798c15 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -201,14 +201,18 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal throw new URIError(E_URI_MALFORMED); } } + if (ch >= 0x10000) { + ch -= 0x10000; + store(dst + offset, (ch >> 10) + 0xD800); + offset += 2; + ch = (ch & 0x3FF) + 0xDC00; + } store(dst + offset, ch); offset += 2; } if ((len << 1) > offset) { dst = __renew(dst, offset); } - // trace(changetype(dst)); - return dst; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index ed5ac94bab..639cf666f5 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -6,9 +6,11 @@ (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01") @@ -2595,54 +2597,54 @@ (local $8 i32) loop $while-continue|0 local.get $1 - local.get $3 + local.get $4 i32.gt_u if block $while-break|0 - local.get $3 - local.set $2 + local.get $4 + local.set $3 loop $while-continue|1 local.get $1 - local.get $3 + local.get $4 i32.gt_u if (result i32) - local.get $3 + local.get $4 i32.const 1 i32.shl i32.const 2416 i32.add i32.load16_u - local.tee $5 + local.tee $2 i32.const 37 i32.ne else i32.const 0 end if - local.get $3 + local.get $4 i32.const 1 i32.add - local.set $3 + local.set $4 br $while-continue|1 end end - local.get $2 local.get $3 + local.get $4 i32.lt_u if + local.get $4 local.get $3 - local.get $2 i32.sub i32.const 1 i32.shl - local.tee $4 + local.tee $5 i32.const 2 i32.eq if local.get $0 local.get $6 i32.add - local.get $2 + local.get $3 i32.const 1 i32.shl i32.const 2416 @@ -2650,14 +2652,14 @@ i32.load16_u i32.store16 else - local.get $4 + local.get $5 i32.const 4 i32.eq if local.get $0 local.get $6 i32.add - local.get $2 + local.get $3 i32.const 1 i32.shl i32.const 2416 @@ -2668,30 +2670,30 @@ local.get $0 local.get $6 i32.add - local.get $2 + local.get $3 i32.const 1 i32.shl i32.const 2416 i32.add - local.get $4 + local.get $5 call $~lib/memory/memory.copy end end - local.get $4 + local.get $5 local.get $6 i32.add local.set $6 local.get $1 - local.get $3 + local.get $4 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $5 + local.get $2 i32.const 37 i32.ne local.get $1 - local.get $3 + local.get $4 i32.const 2 i32.add i32.le_u @@ -2699,13 +2701,13 @@ if (result i32) i32.const 1 else - local.get $3 + local.get $4 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $5 + local.tee $2 i32.const -1 i32.eq end @@ -2717,66 +2719,66 @@ call $~lib/builtins/abort unreachable end - local.get $3 + local.get $4 i32.const 3 i32.add - local.set $3 - local.get $5 + local.set $4 + local.get $2 i32.const 128 i32.ge_u if i32.const 0 - local.set $2 + local.set $3 i32.const 1 local.set $7 - local.get $5 + local.get $2 i32.const 223 i32.le_u i32.const 0 - local.get $5 + local.get $2 i32.const 192 i32.ge_u select if (result i32) i32.const 1 - local.set $2 + local.set $3 i32.const 128 local.set $7 - local.get $5 + local.get $2 i32.const 31 i32.and else - local.get $5 + local.get $2 i32.const 239 i32.le_u i32.const 0 - local.get $5 + local.get $2 i32.const 224 i32.ge_u select if (result i32) i32.const 2 - local.set $2 + local.set $3 i32.const 2048 local.set $7 - local.get $5 + local.get $2 i32.const 15 i32.and else - local.get $5 - i32.const 244 + local.get $2 + i32.const 247 i32.le_u i32.const 0 - local.get $5 + local.get $2 i32.const 240 i32.ge_u select if (result i32) i32.const 3 - local.set $2 + local.set $3 i32.const 65536 local.set $7 - local.get $5 + local.get $2 i32.const 7 i32.and else @@ -2784,29 +2786,29 @@ end end end - local.set $5 + local.set $2 i32.const 0 local.set $8 loop $while-continue|2 - local.get $2 - local.tee $4 + local.get $3 + local.tee $5 i32.const 1 i32.sub - local.set $2 - local.get $4 + local.set $3 + local.get $5 i32.const 0 i32.gt_s if block $while-break|2 local.get $1 - local.get $3 + local.get $4 i32.const 2 i32.add i32.le_u if (result i32) i32.const 1 else - local.get $3 + local.get $4 i32.const 1 i32.shl i32.const 2416 @@ -2818,7 +2820,7 @@ if (result i32) i32.const 1 else - local.get $3 + local.get $4 i32.const 1 i32.add i32.const 1 @@ -2836,10 +2838,10 @@ call $~lib/builtins/abort unreachable end - local.get $3 + local.get $4 i32.const 3 i32.add - local.set $3 + local.set $4 local.get $8 i32.const 192 i32.and @@ -2847,35 +2849,35 @@ i32.ne if i32.const 0 - local.set $5 + local.set $2 br $while-break|2 end local.get $8 i32.const 63 i32.and - local.get $5 + local.get $2 i32.const 6 i32.shl i32.or - local.set $5 + local.set $2 br $while-continue|2 end end end i32.const 1 - local.get $5 + local.get $2 i32.const 57344 i32.lt_u i32.const 0 - local.get $5 + local.get $2 i32.const 55296 i32.ge_u select i32.const 1 - local.get $5 + local.get $2 i32.const 1114111 i32.gt_u - local.get $5 + local.get $2 local.get $7 i32.lt_u select @@ -2889,10 +2891,37 @@ unreachable end end + local.get $2 + i32.const 65536 + i32.ge_u + if + local.get $0 + local.get $6 + i32.add + local.get $2 + i32.const 65536 + i32.sub + local.tee $2 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.add + i32.store16 + local.get $6 + i32.const 2 + i32.add + local.set $6 + local.get $2 + i32.const 1023 + i32.and + i32.const 56320 + i32.add + local.set $2 + end local.get $0 local.get $6 i32.add - local.get $5 + local.get $2 i32.store16 local.get $6 i32.const 2 @@ -2907,13 +2936,21 @@ i32.const 1 i32.shl i32.lt_u - if (result i32) + if local.get $0 local.get $6 call $~lib/rt/itcms/__renew - else - local.get $0 + local.set $0 end + local.get $0 + i32.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + local.get $0 ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 9832ca8bee..6a6c5fc555 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -7,10 +7,12 @@ (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) + (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") @@ -4612,7 +4614,7 @@ i32.ge_u if (result i32) local.get $7 - i32.const 244 + i32.const 247 i32.le_u else i32.const 0 @@ -4745,6 +4747,34 @@ unreachable end end + local.get $7 + i32.const 65536 + i32.ge_u + if + local.get $7 + i32.const 65536 + i32.sub + local.set $7 + local.get $0 + local.get $5 + i32.add + local.get $7 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.add + i32.store16 + local.get $5 + i32.const 2 + i32.add + local.set $5 + local.get $7 + i32.const 1023 + i32.and + i32.const 56320 + i32.add + local.set $7 + end local.get $0 local.get $5 i32.add @@ -4770,6 +4800,14 @@ local.set $0 end local.get $0 + i32.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + f64.const 0 + call $~lib/builtins/trace + local.get $0 ) (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) (local $1 i32) From c94869e7e439489f4948d5b828294d00f8d7063b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 16:58:20 +0200 Subject: [PATCH 56/87] add assert --- std/assembly/util/uri.ts | 2 ++ tests/compiler/std/uri.optimized.wat | 29 +++++++++++++++------------- tests/compiler/std/uri.untouched.wat | 24 +++++++++++++---------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 26f7798c15..53d9e6693c 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -210,6 +210,8 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal store(dst + offset, ch); offset += 2; } + + assert(offset <= (len << 1)); if ((len << 1) > offset) { dst = __renew(dst, offset); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 639cf666f5..dd54b59d1d 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -6,11 +6,9 @@ (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01") @@ -2935,22 +2933,27 @@ local.get $1 i32.const 1 i32.shl - i32.lt_u + i32.gt_u if + i32.const 0 + i32.const 1632 + i32.const 214 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $6 + local.get $1 + i32.const 1 + i32.shl + i32.lt_u + if (result i32) local.get $0 local.get $6 call $~lib/rt/itcms/__renew - local.set $0 + else + local.get $0 end - local.get $0 - i32.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - local.get $0 ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 6a6c5fc555..8e26899b3f 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -7,12 +7,10 @@ (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) - (type $i32_i32_f64_f64_f64_f64_f64_=>_none (func (param i32 i32 f64 f64 f64 f64 f64))) (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (import "env" "trace" (func $~lib/builtins/trace (param i32 i32 f64 f64 f64 f64 f64))) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") @@ -4788,6 +4786,20 @@ end end end + local.get $5 + local.get $2 + i32.const 1 + i32.shl + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 608 + i32.const 214 + i32.const 3 + call $~lib/builtins/abort + unreachable + end local.get $2 i32.const 1 i32.shl @@ -4800,14 +4812,6 @@ local.set $0 end local.get $0 - i32.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - f64.const 0 - call $~lib/builtins/trace - local.get $0 ) (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) (local $1 i32) From 4efd0522162fba0b889f937fa8b48a334ae4bac6 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:01:50 +0200 Subject: [PATCH 57/87] opt --- std/assembly/util/uri.ts | 14 ++- tests/compiler/std/uri.optimized.wat | 158 ++++++++++++++------------- tests/compiler/std/uri.untouched.wat | 47 ++++---- 3 files changed, 115 insertions(+), 104 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 53d9e6693c..fa59d63716 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -201,14 +201,16 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal throw new URIError(E_URI_MALFORMED); } } - if (ch >= 0x10000) { - ch -= 0x10000; - store(dst + offset, (ch >> 10) + 0xD800); + if (ch < 0x10000) { + store(dst + offset, ch); offset += 2; - ch = (ch & 0x3FF) + 0xDC00; + } else { + ch -= 0x10000; + let lo = ch >> 10 | 0xD800; + let hi = (ch & 0x03FF) | 0xDC00; + store(dst + offset, lo | (hi << 16)); + offset += 4; } - store(dst + offset, ch); - offset += 2; } assert(offset <= (len << 1)); diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index dd54b59d1d..4578a73244 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2595,54 +2595,54 @@ (local $8 i32) loop $while-continue|0 local.get $1 - local.get $4 + local.get $3 i32.gt_u if block $while-break|0 - local.get $4 - local.set $3 + local.get $3 + local.set $2 loop $while-continue|1 local.get $1 - local.get $4 + local.get $3 i32.gt_u if (result i32) - local.get $4 + local.get $3 i32.const 1 i32.shl i32.const 2416 i32.add i32.load16_u - local.tee $2 + local.tee $5 i32.const 37 i32.ne else i32.const 0 end if - local.get $4 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 br $while-continue|1 end end + local.get $2 local.get $3 - local.get $4 i32.lt_u if - local.get $4 local.get $3 + local.get $2 i32.sub i32.const 1 i32.shl - local.tee $5 + local.tee $4 i32.const 2 i32.eq if local.get $0 local.get $6 i32.add - local.get $3 + local.get $2 i32.const 1 i32.shl i32.const 2416 @@ -2650,14 +2650,14 @@ i32.load16_u i32.store16 else - local.get $5 + local.get $4 i32.const 4 i32.eq if local.get $0 local.get $6 i32.add - local.get $3 + local.get $2 i32.const 1 i32.shl i32.const 2416 @@ -2668,30 +2668,30 @@ local.get $0 local.get $6 i32.add - local.get $3 + local.get $2 i32.const 1 i32.shl i32.const 2416 i32.add - local.get $5 + local.get $4 call $~lib/memory/memory.copy end end - local.get $5 + local.get $4 local.get $6 i32.add local.set $6 local.get $1 - local.get $4 + local.get $3 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $2 + local.get $5 i32.const 37 i32.ne local.get $1 - local.get $4 + local.get $3 i32.const 2 i32.add i32.le_u @@ -2699,13 +2699,13 @@ if (result i32) i32.const 1 else - local.get $4 + local.get $3 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $2 + local.tee $5 i32.const -1 i32.eq end @@ -2717,66 +2717,66 @@ call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 - local.get $2 + local.set $3 + local.get $5 i32.const 128 i32.ge_u if i32.const 0 - local.set $3 + local.set $2 i32.const 1 local.set $7 - local.get $2 + local.get $5 i32.const 223 i32.le_u i32.const 0 - local.get $2 + local.get $5 i32.const 192 i32.ge_u select if (result i32) i32.const 1 - local.set $3 + local.set $2 i32.const 128 local.set $7 - local.get $2 + local.get $5 i32.const 31 i32.and else - local.get $2 + local.get $5 i32.const 239 i32.le_u i32.const 0 - local.get $2 + local.get $5 i32.const 224 i32.ge_u select if (result i32) i32.const 2 - local.set $3 + local.set $2 i32.const 2048 local.set $7 - local.get $2 + local.get $5 i32.const 15 i32.and else - local.get $2 + local.get $5 i32.const 247 i32.le_u i32.const 0 - local.get $2 + local.get $5 i32.const 240 i32.ge_u select if (result i32) i32.const 3 - local.set $3 + local.set $2 i32.const 65536 local.set $7 - local.get $2 + local.get $5 i32.const 7 i32.and else @@ -2784,29 +2784,29 @@ end end end - local.set $2 + local.set $5 i32.const 0 local.set $8 loop $while-continue|2 - local.get $3 - local.tee $5 + local.get $2 + local.tee $4 i32.const 1 i32.sub - local.set $3 - local.get $5 + local.set $2 + local.get $4 i32.const 0 i32.gt_s if block $while-break|2 local.get $1 - local.get $4 + local.get $3 i32.const 2 i32.add i32.le_u if (result i32) i32.const 1 else - local.get $4 + local.get $3 i32.const 1 i32.shl i32.const 2416 @@ -2818,7 +2818,7 @@ if (result i32) i32.const 1 else - local.get $4 + local.get $3 i32.const 1 i32.add i32.const 1 @@ -2836,10 +2836,10 @@ call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 + local.set $3 local.get $8 i32.const 192 i32.and @@ -2847,35 +2847,35 @@ i32.ne if i32.const 0 - local.set $2 + local.set $5 br $while-break|2 end local.get $8 i32.const 63 i32.and - local.get $2 + local.get $5 i32.const 6 i32.shl i32.or - local.set $2 + local.set $5 br $while-continue|2 end end end i32.const 1 - local.get $2 + local.get $5 i32.const 57344 i32.lt_u i32.const 0 - local.get $2 + local.get $5 i32.const 55296 i32.ge_u select i32.const 1 - local.get $2 + local.get $5 i32.const 1114111 i32.gt_u - local.get $2 + local.get $5 local.get $7 i32.lt_u select @@ -2889,41 +2889,43 @@ unreachable end end - local.get $2 + local.get $5 i32.const 65536 - i32.ge_u - if + i32.lt_u + if (result i32) local.get $0 local.get $6 i32.add - local.get $2 - i32.const 65536 - i32.sub - local.tee $2 - i32.const 10 - i32.shr_u - i32.const 55296 - i32.add + local.get $5 i32.store16 local.get $6 i32.const 2 i32.add - local.set $6 - local.get $2 + else + local.get $0 + local.get $6 + i32.add + local.get $5 + i32.const 65536 + i32.sub + local.tee $5 i32.const 1023 i32.and i32.const 56320 + i32.or + i32.const 16 + i32.shl + local.get $5 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.or + i32.or + i32.store + local.get $6 + i32.const 4 i32.add - local.set $2 end - local.get $0 - local.get $6 - i32.add - local.get $2 - i32.store16 - local.get $6 - i32.const 2 - i32.add local.set $6 br $while-continue|0 end @@ -2937,7 +2939,7 @@ if i32.const 0 i32.const 1632 - i32.const 214 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 8e26899b3f..68e5ed0ad2 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4747,41 +4747,48 @@ end local.get $7 i32.const 65536 - i32.ge_u + i32.lt_u if - local.get $7 - i32.const 65536 - i32.sub - local.set $7 local.get $0 local.get $5 i32.add local.get $7 - i32.const 10 - i32.shr_u - i32.const 55296 - i32.add i32.store16 local.get $5 i32.const 2 i32.add local.set $5 + else + local.get $7 + i32.const 65536 + i32.sub + local.set $7 + local.get $7 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.or + local.set $11 local.get $7 i32.const 1023 i32.and i32.const 56320 + i32.or + local.set $10 + local.get $0 + local.get $5 i32.add - local.set $7 + local.get $11 + local.get $10 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $5 + i32.const 4 + i32.add + local.set $5 end - local.get $0 - local.get $5 - i32.add - local.get $7 - i32.store16 - local.get $5 - i32.const 2 - i32.add - local.set $5 br $while-continue|0 end end @@ -4795,7 +4802,7 @@ if i32.const 0 i32.const 608 - i32.const 214 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable From 96d413eccf081c4908e9b3661927abbf1a29d802 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:12:18 +0200 Subject: [PATCH 58/87] refactoring --- std/assembly/uri.ts | 8 ++++---- std/assembly/util/uri.ts | 12 ++++-------- tests/compiler/std/uri.untouched.wat | 28 ++++++++++++---------------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index 6eb0ebdcf4..f9eeb0e2d3 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -8,19 +8,19 @@ export function encodeURI(str: string): string { return changetype(result); } -export function encodeURIComponent(str: string): string { +export function decodeURI(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = encode(result, changetype(str), len, URL_UNSAFE); + result = decode(result, changetype(str), len, false); return changetype(result); } -export function decodeURI(str: string): string { +export function encodeURIComponent(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = decode(result, changetype(str), len); + result = encode(result, changetype(str), len, URL_UNSAFE); return changetype(result); } diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index fa59d63716..5bb7fc258f 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -124,7 +124,7 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize return dst; } -export function decode(dst: usize, src: usize, len: usize, component: bool = false): usize { +export function decode(dst: usize, src: usize, len: usize, component: bool): usize { var i: usize = 0, offset: usize = 0, org: usize, ch: u32 = 0; while (i < len) { @@ -223,10 +223,9 @@ export function decode(dst: usize, src: usize, len: usize, component: bool = fal // @ts-ignore: decorator @inline function isReserved(ch: u32): bool { - if (((ch - 35) >>> 0) < 30) { - return load(URI_RESERVED + (ch - 35)); - } - return false; + return (ch - 35) < 30 + ? load(URI_RESERVED + (ch - 35)) + : false; } // @ts-ignore: decorator @@ -259,9 +258,6 @@ function loadHex(src: usize, offset: usize): u32 { let c0 = load(src + offset, 0); let c1 = load(src + offset, 2); - // trace("c0", 1, c0); - // trace("c1", 1, c1); - // if (!isHex(c0) || !isHex(c1)) return -1; // return fromHex(c0) << 4 | fromHex(c1); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 68e5ed0ad2..3476fbc85b 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4530,25 +4530,21 @@ local.get $3 i32.eqz if (result i32) - block $~lib/util/uri/isReserved|inlined.0 (result i32) - local.get $7 - local.set $9 + local.get $7 + local.set $9 + local.get $9 + i32.const 35 + i32.sub + i32.const 30 + i32.lt_u + if (result i32) + global.get $~lib/util/uri/URI_RESERVED local.get $9 i32.const 35 i32.sub - i32.const 0 - i32.shr_u - i32.const 30 - i32.lt_u - if - global.get $~lib/util/uri/URI_RESERVED - local.get $9 - i32.const 35 - i32.sub - i32.add - i32.load16_u - br $~lib/util/uri/isReserved|inlined.0 - end + i32.add + i32.load16_u + else i32.const 0 end else From 8050ce7ba850f4f8de64a56d56d2e8427a4b84d5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:15:35 +0200 Subject: [PATCH 59/87] more --- std/assembly/uri.ts | 12 ++++-------- tests/compiler/std/uri.untouched.wat | 6 ------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index f9eeb0e2d3..5e4a2c0d57 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -4,30 +4,26 @@ export function encodeURI(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = encode(result, changetype(str), len, URI_UNSAFE); - return changetype(result); + return changetype(encode(result, changetype(str), len, URI_UNSAFE)); } export function decodeURI(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = decode(result, changetype(str), len, false); - return changetype(result); + return changetype(decode(result, changetype(str), len, false)); } export function encodeURIComponent(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = encode(result, changetype(str), len, URL_UNSAFE); - return changetype(result); + return changetype(encode(result, changetype(str), len, URL_UNSAFE)); } export function decodeURIComponent(str: string): string { var len = str.length; if (!len) return str; var result = __new(len << 1, idof()); - result = decode(result, changetype(str), len, true); - return changetype(result); + return changetype(decode(result, changetype(str), len, true)); } diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 3476fbc85b..f664a632b5 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4137,8 +4137,6 @@ local.get $1 global.get $~lib/util/uri/URL_UNSAFE call $~lib/util/uri/encode - local.set $2 - local.get $2 ) (func $~lib/util/string/compareImpl (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) (local $5 i32) @@ -4312,8 +4310,6 @@ local.get $1 global.get $~lib/util/uri/URI_UNSAFE call $~lib/util/uri/encode - local.set $2 - local.get $2 ) (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) (local $2 i32) @@ -4839,8 +4835,6 @@ local.get $1 i32.const 1 call $~lib/util/uri/decode - local.set $2 - local.get $2 ) (func $~lib/rt/itcms/__collect (local $0 i32) From 4b4fdc8fa7edf3d419576112485b2e678ad86c59 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:35:59 +0200 Subject: [PATCH 60/87] optimize utf8 byte count --- std/assembly/util/uri.ts | 48 ++++++-- tests/compiler/std/uri.optimized.wat | 175 +++++++++++++-------------- tests/compiler/std/uri.untouched.wat | 100 +++++++-------- 3 files changed, 167 insertions(+), 156 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 5bb7fc258f..d55b8d2f05 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -37,6 +37,26 @@ import { CharCode } from "./string"; 1, /* skip 191 always set to '0' tail slots */ ]); +// @ts-ignore: decorator +@lazy export const UTF8_BYTE_LEN = memory.data([ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]); + export function encode(dst: usize, src: usize, len: usize, table: usize): usize { var i: usize = 0, offset: usize = 0, outSize = len << 1; @@ -163,17 +183,15 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } } else { // decode UTF-8 sequence - let n = 0, lo: u32 = 1; - if (ch >= 0xC0 && ch <= 0xDF) { - n = 1; + let n = utf8LenFromByte(ch); + let lo: u32 = 1; + if (n == 2) { lo = 0x80; ch &= 0x1F; - } else if (ch >= 0xE0 && ch <= 0xEF) { - n = 2; + } else if (n == 3) { lo = 0x800; ch &= 0x0F; - } else if (ch >= 0xF0 && ch <= 0xF7) { - n = 3; + } else if (n == 4) { lo = 0x10000; ch &= 0x07; } else { @@ -181,7 +199,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } let c1: u32 = 0; - while (n-- > 0) { + while (--n > 0) { // decode hex if ( i + 2 >= len || @@ -220,6 +238,20 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi return dst; } +// @ts-ignore: decorator +@inline function utf8LenFromByte(c0: u32): i32 { + if (ASC_SHRINK_LEVEL > 1) { + if (c0 < 0x80) return 1; + if (c0 >= 0xC0 && c0 <= 0xDF) return 2; + if (c0 >= 0xE0 && c0 <= 0xEF) return 3; + if (c0 >= 0xF0 && c0 <= 0xF7) return 4; + return 0; + } else { + return c0 <= 0xFF + ? load(UTF8_BYTE_LEN + c0) + : 0; + } +} // @ts-ignore: decorator @inline function isReserved(ch: u32): bool { diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 4578a73244..0fd0b10424 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -109,7 +109,9 @@ (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") (data (i32.const 3596) "\01\01\00\01\00\00\00\00\01\01\00\00\01") (data (i32.const 3619) "\01\01\00\01\00\01\01") - (data (i32.const 3632) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3626) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01") + (data (i32.const 3818) "\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04") + (data (i32.const 3888) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -120,7 +122,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20044)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20300)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -251,7 +253,7 @@ if i32.const 0 local.get $0 - i32.const 20044 + i32.const 20300 i32.lt_u local.get $0 i32.load offset=8 @@ -297,7 +299,7 @@ i32.const 1 else local.get $1 - i32.const 3632 + i32.const 3888 i32.load i32.gt_u if @@ -311,7 +313,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 3636 + i32.const 3892 i32.add i32.load i32.const 32 @@ -916,10 +918,10 @@ if unreachable end - i32.const 20048 + i32.const 20304 i32.const 0 i32.store - i32.const 21616 + i32.const 21872 i32.const 0 i32.store loop $for-loop|0 @@ -930,7 +932,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20048 + i32.const 20304 i32.add i32.const 0 i32.store offset=4 @@ -948,7 +950,7 @@ i32.add i32.const 2 i32.shl - i32.const 20048 + i32.const 20304 i32.add i32.const 0 i32.store offset=96 @@ -966,13 +968,13 @@ br $for-loop|0 end end - i32.const 20048 - i32.const 21620 + i32.const 20304 + i32.const 21876 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20048 + i32.const 20304 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1051,7 +1053,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20044 + i32.const 20300 i32.lt_u if local.get $0 @@ -1141,7 +1143,7 @@ unreachable end local.get $0 - i32.const 20044 + i32.const 20300 i32.lt_u if local.get $0 @@ -1164,7 +1166,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20044 + i32.const 20300 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2193,7 +2195,7 @@ if i32.const 1584 i32.const 1632 - i32.const 76 + i32.const 96 i32.const 9 call $~lib/builtins/abort unreachable @@ -2208,7 +2210,7 @@ if i32.const 1584 i32.const 1632 - i32.const 80 + i32.const 100 i32.const 11 call $~lib/builtins/abort unreachable @@ -2233,7 +2235,7 @@ if i32.const 1584 i32.const 1632 - i32.const 84 + i32.const 104 i32.const 11 call $~lib/builtins/abort unreachable @@ -2592,7 +2594,6 @@ (local $5 i32) (local $6 i32) (local $7 i32) - (local $8 i32) loop $while-continue|0 local.get $1 local.get $3 @@ -2612,7 +2613,7 @@ i32.const 2416 i32.add i32.load16_u - local.tee $5 + local.tee $7 i32.const 37 i32.ne else @@ -2635,7 +2636,7 @@ i32.sub i32.const 1 i32.shl - local.tee $4 + local.tee $5 i32.const 2 i32.eq if @@ -2650,7 +2651,7 @@ i32.load16_u i32.store16 else - local.get $4 + local.get $5 i32.const 4 i32.eq if @@ -2673,11 +2674,11 @@ i32.shl i32.const 2416 i32.add - local.get $4 + local.get $5 call $~lib/memory/memory.copy end end - local.get $4 + local.get $5 local.get $6 i32.add local.set $6 @@ -2687,7 +2688,7 @@ br_if $while-break|0 end i32.const 1 - local.get $5 + local.get $7 i32.const 37 i32.ne local.get $1 @@ -2705,14 +2706,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $5 + local.tee $7 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 156 + i32.const 176 i32.const 7 call $~lib/builtins/abort unreachable @@ -2721,62 +2722,50 @@ i32.const 3 i32.add local.set $3 - local.get $5 + local.get $7 i32.const 128 i32.ge_u if - i32.const 0 - local.set $2 i32.const 1 - local.set $7 - local.get $5 - i32.const 223 + local.set $5 + local.get $7 + i32.const 255 i32.le_u - i32.const 0 - local.get $5 - i32.const 192 - i32.ge_u - select if (result i32) - i32.const 1 - local.set $2 + local.get $7 + i32.const 3626 + i32.add + i32.load8_u + else + i32.const 0 + end + local.tee $2 + i32.const 2 + i32.eq + if (result i32) i32.const 128 - local.set $7 - local.get $5 + local.set $5 + local.get $7 i32.const 31 i32.and else - local.get $5 - i32.const 239 - i32.le_u - i32.const 0 - local.get $5 - i32.const 224 - i32.ge_u - select + local.get $2 + i32.const 3 + i32.eq if (result i32) - i32.const 2 - local.set $2 i32.const 2048 - local.set $7 - local.get $5 + local.set $5 + local.get $7 i32.const 15 i32.and else - local.get $5 - i32.const 247 - i32.le_u - i32.const 0 - local.get $5 - i32.const 240 - i32.ge_u - select + local.get $2 + i32.const 4 + i32.eq if (result i32) - i32.const 3 - local.set $2 i32.const 65536 - local.set $7 - local.get $5 + local.set $5 + local.get $7 i32.const 7 i32.and else @@ -2784,16 +2773,14 @@ end end end - local.set $5 + local.set $7 i32.const 0 - local.set $8 + local.set $4 loop $while-continue|2 local.get $2 - local.tee $4 i32.const 1 i32.sub - local.set $2 - local.get $4 + local.tee $2 i32.const 0 i32.gt_s if @@ -2824,14 +2811,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $8 + local.tee $4 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 190 + i32.const 208 i32.const 11 call $~lib/builtins/abort unreachable @@ -2840,63 +2827,63 @@ i32.const 3 i32.add local.set $3 - local.get $8 + local.get $4 i32.const 192 i32.and i32.const 128 i32.ne if i32.const 0 - local.set $5 + local.set $7 br $while-break|2 end - local.get $8 + local.get $4 i32.const 63 i32.and - local.get $5 + local.get $7 i32.const 6 i32.shl i32.or - local.set $5 + local.set $7 br $while-continue|2 end end end i32.const 1 - local.get $5 + local.get $7 i32.const 57344 i32.lt_u i32.const 0 - local.get $5 + local.get $7 i32.const 55296 i32.ge_u select i32.const 1 - local.get $5 + local.get $7 i32.const 1114111 i32.gt_u local.get $5 local.get $7 - i32.lt_u + i32.gt_u select select if i32.const 1584 i32.const 1632 - i32.const 201 + i32.const 219 i32.const 9 call $~lib/builtins/abort unreachable end end - local.get $5 + local.get $7 i32.const 65536 i32.lt_u if (result i32) local.get $0 local.get $6 i32.add - local.get $5 + local.get $7 i32.store16 local.get $6 i32.const 2 @@ -2905,17 +2892,17 @@ local.get $0 local.get $6 i32.add - local.get $5 + local.get $7 i32.const 65536 i32.sub - local.tee $5 + local.tee $7 i32.const 1023 i32.and i32.const 56320 i32.or i32.const 16 i32.shl - local.get $5 + local.get $7 i32.const 10 i32.shr_u i32.const 55296 @@ -2939,7 +2926,7 @@ if i32.const 0 i32.const 1632 - i32.const 216 + i32.const 234 i32.const 3 call $~lib/builtins/abort unreachable @@ -2993,11 +2980,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3660 + i32.const 3916 i32.lt_s if - i32.const 20064 - i32.const 20112 + i32.const 20320 + i32.const 20368 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3012,7 +2999,7 @@ memory.size i32.const 16 i32.shl - i32.const 20044 + i32.const 20300 i32.sub i32.const 1 i32.shr_u @@ -3720,7 +3707,7 @@ call $~lib/builtins/abort unreachable end - i32.const 20044 + i32.const 20300 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index f664a632b5..4f94062fe7 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -63,7 +63,8 @@ (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") (data (i32.const 2572) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") - (data (i32.const 2608) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2602) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2864) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -80,10 +81,11 @@ (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) - (global $~lib/rt/__rtti_base i32 (i32.const 2608)) - (global $~lib/memory/__data_end i32 (i32.const 2636)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19020)) - (global $~lib/memory/__heap_base i32 (i32.const 19020)) + (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) + (global $~lib/rt/__rtti_base i32 (i32.const 2864)) + (global $~lib/memory/__data_end i32 (i32.const 2892)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19276)) + (global $~lib/memory/__heap_base i32 (i32.const 19276)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3896,7 +3898,7 @@ if i32.const 560 i32.const 608 - i32.const 76 + i32.const 96 i32.const 9 call $~lib/builtins/abort unreachable @@ -3911,7 +3913,7 @@ if i32.const 560 i32.const 608 - i32.const 80 + i32.const 100 i32.const 11 call $~lib/builtins/abort unreachable @@ -3939,7 +3941,7 @@ if i32.const 560 i32.const 608 - i32.const 84 + i32.const 104 i32.const 11 call $~lib/builtins/abort unreachable @@ -4510,7 +4512,7 @@ if i32.const 560 i32.const 608 - i32.const 156 + i32.const 176 i32.const 7 call $~lib/builtins/abort unreachable @@ -4555,23 +4557,33 @@ local.set $4 end else - i32.const 0 - local.set $9 - i32.const 1 - local.set $10 - local.get $7 - i32.const 192 - i32.ge_u - if (result i32) + block $~lib/util/uri/utf8LenFromByte|inlined.0 (result i32) local.get $7 - i32.const 223 - i32.le_u - else + local.set $9 i32.const 0 + i32.const 1 + i32.gt_s + drop + local.get $9 + i32.const 255 + i32.le_u + if (result i32) + global.get $~lib/util/uri/UTF8_BYTE_LEN + local.get $9 + i32.add + i32.load8_u + else + i32.const 0 + end + br $~lib/util/uri/utf8LenFromByte|inlined.0 end + local.set $9 + i32.const 1 + local.set $10 + local.get $9 + i32.const 2 + i32.eq if - i32.const 1 - local.set $9 i32.const 128 local.set $10 local.get $7 @@ -4579,19 +4591,10 @@ i32.and local.set $7 else - local.get $7 - i32.const 224 - i32.ge_u - if (result i32) - local.get $7 - i32.const 239 - i32.le_u - else - i32.const 0 - end + local.get $9 + i32.const 3 + i32.eq if - i32.const 2 - local.set $9 i32.const 2048 local.set $10 local.get $7 @@ -4599,19 +4602,10 @@ i32.and local.set $7 else - local.get $7 - i32.const 240 - i32.ge_u - if (result i32) - local.get $7 - i32.const 247 - i32.le_u - else - i32.const 0 - end + local.get $9 + i32.const 4 + i32.eq if - i32.const 3 - local.set $9 i32.const 65536 local.set $10 local.get $7 @@ -4629,11 +4623,9 @@ block $while-break|2 loop $while-continue|2 local.get $9 - local.tee $12 i32.const 1 i32.sub - local.set $9 - local.get $12 + local.tee $9 i32.const 0 i32.gt_s local.set $12 @@ -4673,7 +4665,7 @@ if i32.const 560 i32.const 608 - i32.const 190 + i32.const 208 i32.const 11 call $~lib/builtins/abort unreachable @@ -4731,7 +4723,7 @@ if i32.const 560 i32.const 608 - i32.const 201 + i32.const 219 i32.const 9 call $~lib/builtins/abort unreachable @@ -4794,7 +4786,7 @@ if i32.const 0 i32.const 608 - i32.const 216 + i32.const 234 i32.const 3 call $~lib/builtins/abort unreachable @@ -4944,8 +4936,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19040 - i32.const 19088 + i32.const 19296 + i32.const 19344 i32.const 1 i32.const 1 call $~lib/builtins/abort From 69a45b9a8d9e93ffce4b4362dcea19f543532fa3 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:42:39 +0200 Subject: [PATCH 61/87] opt utf8_len table --- std/assembly/util/uri.ts | 17 ++------ tests/compiler/std/uri.optimized.wat | 63 ++++++++++++++-------------- tests/compiler/std/uri.untouched.wat | 40 ++++++++++-------- 3 files changed, 58 insertions(+), 62 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index d55b8d2f05..2d2c5a661d 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -39,14 +39,6 @@ import { CharCode } from "./string"; // @ts-ignore: decorator @lazy export const UTF8_BYTE_LEN = memory.data([ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -183,7 +175,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } } else { // decode UTF-8 sequence - let n = utf8LenFromByte(ch); + let n = utf8LenFromUpperByte(ch); let lo: u32 = 1; if (n == 2) { lo = 0x80; @@ -239,16 +231,15 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } // @ts-ignore: decorator -@inline function utf8LenFromByte(c0: u32): i32 { +@inline function utf8LenFromUpperByte(c0: u32): i32 { if (ASC_SHRINK_LEVEL > 1) { - if (c0 < 0x80) return 1; if (c0 >= 0xC0 && c0 <= 0xDF) return 2; if (c0 >= 0xE0 && c0 <= 0xEF) return 3; if (c0 >= 0xF0 && c0 <= 0xF7) return 4; return 0; } else { - return c0 <= 0xFF - ? load(UTF8_BYTE_LEN + c0) + return c0 - 128 <= 128 + ? load(UTF8_BYTE_LEN + (c0 - 128)) : 0; } } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 0fd0b10424..c7ef3923af 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -109,9 +109,8 @@ (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") (data (i32.const 3596) "\01\01\00\01\00\00\00\00\01\01\00\00\01") (data (i32.const 3619) "\01\01\00\01\00\01\01") - (data (i32.const 3626) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01") - (data (i32.const 3818) "\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04") - (data (i32.const 3888) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3690) "\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04") + (data (i32.const 3760) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -122,7 +121,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20300)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20172)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -253,7 +252,7 @@ if i32.const 0 local.get $0 - i32.const 20300 + i32.const 20172 i32.lt_u local.get $0 i32.load offset=8 @@ -299,7 +298,7 @@ i32.const 1 else local.get $1 - i32.const 3888 + i32.const 3760 i32.load i32.gt_u if @@ -313,7 +312,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 3892 + i32.const 3764 i32.add i32.load i32.const 32 @@ -918,10 +917,10 @@ if unreachable end - i32.const 20304 + i32.const 20176 i32.const 0 i32.store - i32.const 21872 + i32.const 21744 i32.const 0 i32.store loop $for-loop|0 @@ -932,7 +931,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20304 + i32.const 20176 i32.add i32.const 0 i32.store offset=4 @@ -950,7 +949,7 @@ i32.add i32.const 2 i32.shl - i32.const 20304 + i32.const 20176 i32.add i32.const 0 i32.store offset=96 @@ -968,13 +967,13 @@ br $for-loop|0 end end - i32.const 20304 - i32.const 21876 + i32.const 20176 + i32.const 21748 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20304 + i32.const 20176 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1053,7 +1052,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20300 + i32.const 20172 i32.lt_u if local.get $0 @@ -1143,7 +1142,7 @@ unreachable end local.get $0 - i32.const 20300 + i32.const 20172 i32.lt_u if local.get $0 @@ -1166,7 +1165,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20300 + i32.const 20172 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2195,7 +2194,7 @@ if i32.const 1584 i32.const 1632 - i32.const 96 + i32.const 88 i32.const 9 call $~lib/builtins/abort unreachable @@ -2210,7 +2209,7 @@ if i32.const 1584 i32.const 1632 - i32.const 100 + i32.const 92 i32.const 11 call $~lib/builtins/abort unreachable @@ -2235,7 +2234,7 @@ if i32.const 1584 i32.const 1632 - i32.const 104 + i32.const 96 i32.const 11 call $~lib/builtins/abort unreachable @@ -2713,7 +2712,7 @@ if i32.const 1584 i32.const 1632 - i32.const 176 + i32.const 168 i32.const 7 call $~lib/builtins/abort unreachable @@ -2729,11 +2728,13 @@ i32.const 1 local.set $5 local.get $7 - i32.const 255 + i32.const 128 + i32.sub + i32.const 128 i32.le_u if (result i32) local.get $7 - i32.const 3626 + i32.const 3498 i32.add i32.load8_u else @@ -2818,7 +2819,7 @@ if i32.const 1584 i32.const 1632 - i32.const 208 + i32.const 200 i32.const 11 call $~lib/builtins/abort unreachable @@ -2870,7 +2871,7 @@ if i32.const 1584 i32.const 1632 - i32.const 219 + i32.const 211 i32.const 9 call $~lib/builtins/abort unreachable @@ -2926,7 +2927,7 @@ if i32.const 0 i32.const 1632 - i32.const 234 + i32.const 226 i32.const 3 call $~lib/builtins/abort unreachable @@ -2980,11 +2981,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3916 + i32.const 3788 i32.lt_s if - i32.const 20320 - i32.const 20368 + i32.const 20192 + i32.const 20240 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2999,7 +3000,7 @@ memory.size i32.const 16 i32.shl - i32.const 20300 + i32.const 20172 i32.sub i32.const 1 i32.shr_u @@ -3707,7 +3708,7 @@ call $~lib/builtins/abort unreachable end - i32.const 20300 + i32.const 20172 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 4f94062fe7..8476cad580 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -63,8 +63,8 @@ (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") (data (i32.const 2572) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") - (data (i32.const 2602) "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2864) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2602) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2736) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -82,10 +82,10 @@ (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) - (global $~lib/rt/__rtti_base i32 (i32.const 2864)) - (global $~lib/memory/__data_end i32 (i32.const 2892)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19276)) - (global $~lib/memory/__heap_base i32 (i32.const 19276)) + (global $~lib/rt/__rtti_base i32 (i32.const 2736)) + (global $~lib/memory/__data_end i32 (i32.const 2764)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19148)) + (global $~lib/memory/__heap_base i32 (i32.const 19148)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3898,7 +3898,7 @@ if i32.const 560 i32.const 608 - i32.const 96 + i32.const 88 i32.const 9 call $~lib/builtins/abort unreachable @@ -3913,7 +3913,7 @@ if i32.const 560 i32.const 608 - i32.const 100 + i32.const 92 i32.const 11 call $~lib/builtins/abort unreachable @@ -3941,7 +3941,7 @@ if i32.const 560 i32.const 608 - i32.const 104 + i32.const 96 i32.const 11 call $~lib/builtins/abort unreachable @@ -4512,7 +4512,7 @@ if i32.const 560 i32.const 608 - i32.const 176 + i32.const 168 i32.const 7 call $~lib/builtins/abort unreachable @@ -4557,7 +4557,7 @@ local.set $4 end else - block $~lib/util/uri/utf8LenFromByte|inlined.0 (result i32) + block $~lib/util/uri/utf8LenFromUpperByte|inlined.0 (result i32) local.get $7 local.set $9 i32.const 0 @@ -4565,17 +4565,21 @@ i32.gt_s drop local.get $9 - i32.const 255 + i32.const 128 + i32.sub + i32.const 128 i32.le_u if (result i32) global.get $~lib/util/uri/UTF8_BYTE_LEN local.get $9 + i32.const 128 + i32.sub i32.add i32.load8_u else i32.const 0 end - br $~lib/util/uri/utf8LenFromByte|inlined.0 + br $~lib/util/uri/utf8LenFromUpperByte|inlined.0 end local.set $9 i32.const 1 @@ -4665,7 +4669,7 @@ if i32.const 560 i32.const 608 - i32.const 208 + i32.const 200 i32.const 11 call $~lib/builtins/abort unreachable @@ -4723,7 +4727,7 @@ if i32.const 560 i32.const 608 - i32.const 219 + i32.const 211 i32.const 9 call $~lib/builtins/abort unreachable @@ -4786,7 +4790,7 @@ if i32.const 0 i32.const 608 - i32.const 234 + i32.const 226 i32.const 3 call $~lib/builtins/abort unreachable @@ -4936,8 +4940,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19296 - i32.const 19344 + i32.const 19168 + i32.const 19216 i32.const 1 i32.const 1 call $~lib/builtins/abort From 29ed2a8dc3f9132d343134efd29314525310ea7c Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:44:09 +0200 Subject: [PATCH 62/87] refactor --- std/assembly/util/uri.ts | 11 +++++------ tests/compiler/std/uri.optimized.wat | 6 +++--- tests/compiler/std/uri.untouched.wat | 6 +++--- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 2d2c5a661d..aa379e32ad 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -175,23 +175,22 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } } else { // decode UTF-8 sequence - let n = utf8LenFromUpperByte(ch); + let bytes = utf8LenFromUpperByte(ch); let lo: u32 = 1; - if (n == 2) { + if (bytes == 2) { lo = 0x80; ch &= 0x1F; - } else if (n == 3) { + } else if (bytes == 3) { lo = 0x800; ch &= 0x0F; - } else if (n == 4) { + } else if (bytes == 4) { lo = 0x10000; ch &= 0x07; } else { ch = 0; } - let c1: u32 = 0; - while (--n > 0) { + while (--bytes > 0) { // decode hex if ( i + 2 >= len || diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index c7ef3923af..193c162ddc 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2819,7 +2819,7 @@ if i32.const 1584 i32.const 1632 - i32.const 200 + i32.const 199 i32.const 11 call $~lib/builtins/abort unreachable @@ -2871,7 +2871,7 @@ if i32.const 1584 i32.const 1632 - i32.const 211 + i32.const 210 i32.const 9 call $~lib/builtins/abort unreachable @@ -2927,7 +2927,7 @@ if i32.const 0 i32.const 1632 - i32.const 226 + i32.const 225 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 8476cad580..d0f124d91a 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4669,7 +4669,7 @@ if i32.const 560 i32.const 608 - i32.const 200 + i32.const 199 i32.const 11 call $~lib/builtins/abort unreachable @@ -4727,7 +4727,7 @@ if i32.const 560 i32.const 608 - i32.const 211 + i32.const 210 i32.const 9 call $~lib/builtins/abort unreachable @@ -4790,7 +4790,7 @@ if i32.const 0 i32.const 608 - i32.const 226 + i32.const 225 i32.const 3 call $~lib/builtins/abort unreachable From f599d383c4ee4a796dddd89d5f3103cc46850f08 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 17:45:31 +0200 Subject: [PATCH 63/87] comment --- std/assembly/util/uri.ts | 1 + tests/compiler/std/uri.optimized.wat | 14 +++++++------- tests/compiler/std/uri.untouched.wat | 14 +++++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index aa379e32ad..96ed5d5ca3 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -39,6 +39,7 @@ import { CharCode } from "./string"; // @ts-ignore: decorator @lazy export const UTF8_BYTE_LEN = memory.data([ + /* skip 128 always set to '1' head slots */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 193c162ddc..69b135f2dd 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2194,7 +2194,7 @@ if i32.const 1584 i32.const 1632 - i32.const 88 + i32.const 89 i32.const 9 call $~lib/builtins/abort unreachable @@ -2209,7 +2209,7 @@ if i32.const 1584 i32.const 1632 - i32.const 92 + i32.const 93 i32.const 11 call $~lib/builtins/abort unreachable @@ -2234,7 +2234,7 @@ if i32.const 1584 i32.const 1632 - i32.const 96 + i32.const 97 i32.const 11 call $~lib/builtins/abort unreachable @@ -2712,7 +2712,7 @@ if i32.const 1584 i32.const 1632 - i32.const 168 + i32.const 169 i32.const 7 call $~lib/builtins/abort unreachable @@ -2819,7 +2819,7 @@ if i32.const 1584 i32.const 1632 - i32.const 199 + i32.const 200 i32.const 11 call $~lib/builtins/abort unreachable @@ -2871,7 +2871,7 @@ if i32.const 1584 i32.const 1632 - i32.const 210 + i32.const 211 i32.const 9 call $~lib/builtins/abort unreachable @@ -2927,7 +2927,7 @@ if i32.const 0 i32.const 1632 - i32.const 225 + i32.const 226 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index d0f124d91a..a54c913623 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3898,7 +3898,7 @@ if i32.const 560 i32.const 608 - i32.const 88 + i32.const 89 i32.const 9 call $~lib/builtins/abort unreachable @@ -3913,7 +3913,7 @@ if i32.const 560 i32.const 608 - i32.const 92 + i32.const 93 i32.const 11 call $~lib/builtins/abort unreachable @@ -3941,7 +3941,7 @@ if i32.const 560 i32.const 608 - i32.const 96 + i32.const 97 i32.const 11 call $~lib/builtins/abort unreachable @@ -4512,7 +4512,7 @@ if i32.const 560 i32.const 608 - i32.const 168 + i32.const 169 i32.const 7 call $~lib/builtins/abort unreachable @@ -4669,7 +4669,7 @@ if i32.const 560 i32.const 608 - i32.const 199 + i32.const 200 i32.const 11 call $~lib/builtins/abort unreachable @@ -4727,7 +4727,7 @@ if i32.const 560 i32.const 608 - i32.const 210 + i32.const 211 i32.const 9 call $~lib/builtins/abort unreachable @@ -4790,7 +4790,7 @@ if i32.const 0 i32.const 608 - i32.const 225 + i32.const 226 i32.const 3 call $~lib/builtins/abort unreachable From ed445628b0f27c52cee263e04e292febe7f7bb53 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 18:00:56 +0200 Subject: [PATCH 64/87] more tests --- tests/compiler/std/uri.optimized.wat | 689 +++++++++++++++++++++------ tests/compiler/std/uri.ts | 16 +- tests/compiler/std/uri.untouched.wat | 438 ++++++++++++++++- 3 files changed, 991 insertions(+), 152 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 69b135f2dd..823c0e3447 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1,13 +1,13 @@ (module (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_i32_=>_none (func (param i32 i32))) + (type $i32_=>_i32 (func (param i32) (result i32))) (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) - (type $i32_=>_i32 (func (param i32) (result i32))) (type $i32_=>_none (func (param i32))) + (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") @@ -110,7 +110,19 @@ (data (i32.const 3596) "\01\01\00\01\00\00\00\00\01\01\00\00\01") (data (i32.const 3619) "\01\01\00\01\00\01\01") (data (i32.const 3690) "\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04") - (data (i32.const 3760) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3756) "\1c") + (data (i32.const 3768) "\01\00\00\00\06\00\00\00%\002\006") + (data (i32.const 3788) "\1c") + (data (i32.const 3800) "\01\00\00\00\02\00\00\00&") + (data (i32.const 3820) "L") + (data (i32.const 3832) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") + (data (i32.const 3900) ",") + (data (i32.const 3912) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") + (data (i32.const 3948) "L") + (data (i32.const 3960) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") + (data (i32.const 4028) "|") + (data (i32.const 4040) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 4160) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -121,7 +133,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20172)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20572)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -252,7 +264,7 @@ if i32.const 0 local.get $0 - i32.const 20172 + i32.const 20572 i32.lt_u local.get $0 i32.load offset=8 @@ -298,7 +310,7 @@ i32.const 1 else local.get $1 - i32.const 3760 + i32.const 4160 i32.load i32.gt_u if @@ -312,7 +324,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 3764 + i32.const 4164 i32.add i32.load i32.const 32 @@ -917,10 +929,10 @@ if unreachable end - i32.const 20176 + i32.const 20576 i32.const 0 i32.store - i32.const 21744 + i32.const 22144 i32.const 0 i32.store loop $for-loop|0 @@ -931,7 +943,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20176 + i32.const 20576 i32.add i32.const 0 i32.store offset=4 @@ -949,7 +961,7 @@ i32.add i32.const 2 i32.shl - i32.const 20176 + i32.const 20576 i32.add i32.const 0 i32.store offset=96 @@ -967,13 +979,13 @@ br $for-loop|0 end end - i32.const 20176 - i32.const 21748 + i32.const 20576 + i32.const 22148 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20176 + i32.const 20576 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1052,7 +1064,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20172 + i32.const 20572 i32.lt_u if local.get $0 @@ -1142,7 +1154,7 @@ unreachable end local.get $0 - i32.const 20172 + i32.const 20572 i32.lt_u if local.get $0 @@ -1165,7 +1177,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20172 + i32.const 20572 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2549,29 +2561,29 @@ i32.const 3388 call $~lib/util/uri/encode ) - (func $~lib/util/uri/loadHex (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/util/uri/loadHex (param $0 i32) (param $1 i32) (result i32) local.get $0 - i32.const 2416 + local.get $1 i32.add - local.tee $0 - i32.load16_u offset=2 + local.tee $1 + i32.load16_u i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.tee $1 - local.get $0 - i32.load16_u + local.set $0 + local.get $1 + i32.load16_u offset=2 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.tee $0 + local.tee $1 + local.get $0 i32.const 4 i32.shl i32.or @@ -2586,112 +2598,112 @@ select select ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) + (local $8 i32) + (local $9 i32) loop $while-continue|0 - local.get $1 - local.get $3 + local.get $2 + local.get $6 i32.gt_u if block $while-break|0 - local.get $3 - local.set $2 + local.get $6 + local.set $5 loop $while-continue|1 - local.get $1 - local.get $3 + local.get $2 + local.get $6 i32.gt_u if (result i32) - local.get $3 + local.get $1 + local.get $6 i32.const 1 i32.shl - i32.const 2416 i32.add i32.load16_u - local.tee $7 + local.tee $4 i32.const 37 i32.ne else i32.const 0 end if - local.get $3 + local.get $6 i32.const 1 i32.add - local.set $3 + local.set $6 br $while-continue|1 end end - local.get $2 - local.get $3 + local.get $5 + local.get $6 i32.lt_u if - local.get $3 - local.get $2 + local.get $6 + local.get $5 i32.sub i32.const 1 i32.shl - local.tee $5 + local.tee $8 i32.const 2 i32.eq if local.get $0 - local.get $6 + local.get $7 i32.add - local.get $2 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 2416 i32.add i32.load16_u i32.store16 else - local.get $5 + local.get $8 i32.const 4 i32.eq if local.get $0 - local.get $6 + local.get $7 i32.add - local.get $2 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 2416 i32.add i32.load i32.store else local.get $0 - local.get $6 + local.get $7 i32.add - local.get $2 + local.get $1 + local.get $5 i32.const 1 i32.shl - i32.const 2416 i32.add - local.get $5 + local.get $8 call $~lib/memory/memory.copy end end - local.get $5 - local.get $6 + local.get $7 + local.get $8 i32.add - local.set $6 - local.get $1 - local.get $3 + local.set $7 + local.get $2 + local.get $6 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $7 + local.get $4 i32.const 37 i32.ne - local.get $1 - local.get $3 + local.get $2 + local.get $6 i32.const 2 i32.add i32.le_u @@ -2699,13 +2711,14 @@ if (result i32) i32.const 1 else - local.get $3 + local.get $1 + local.get $6 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $7 + local.tee $4 i32.const -1 i32.eq end @@ -2717,56 +2730,85 @@ call $~lib/builtins/abort unreachable end - local.get $3 + local.get $6 i32.const 3 i32.add - local.set $3 - local.get $7 + local.set $6 + local.get $4 i32.const 128 - i32.ge_u + i32.lt_u if + local.get $3 + if (result i32) + i32.const 0 + else + local.get $4 + i32.const 35 + i32.sub + i32.const 30 + i32.lt_u + if (result i32) + local.get $4 + i32.const 3561 + i32.add + i32.load16_u + else + i32.const 0 + end + end + if + local.get $6 + i32.const 2 + i32.sub + local.set $6 + i32.const 37 + local.set $4 + end + else i32.const 1 + local.set $8 + local.get $4 local.set $5 - local.get $7 + local.get $4 i32.const 128 i32.sub i32.const 128 i32.le_u if (result i32) - local.get $7 + local.get $5 i32.const 3498 i32.add i32.load8_u else i32.const 0 end - local.tee $2 + local.tee $5 i32.const 2 i32.eq if (result i32) i32.const 128 - local.set $5 - local.get $7 + local.set $8 + local.get $4 i32.const 31 i32.and else - local.get $2 + local.get $5 i32.const 3 i32.eq if (result i32) i32.const 2048 - local.set $5 - local.get $7 + local.set $8 + local.get $4 i32.const 15 i32.and else - local.get $2 + local.get $5 i32.const 4 i32.eq if (result i32) i32.const 65536 - local.set $5 - local.get $7 + local.set $8 + local.get $4 i32.const 7 i32.and else @@ -2774,30 +2816,30 @@ end end end - local.set $7 - i32.const 0 local.set $4 + i32.const 0 + local.set $9 loop $while-continue|2 - local.get $2 + local.get $5 i32.const 1 i32.sub - local.tee $2 + local.tee $5 i32.const 0 i32.gt_s if block $while-break|2 - local.get $1 - local.get $3 + local.get $2 + local.get $6 i32.const 2 i32.add i32.le_u if (result i32) i32.const 1 else - local.get $3 + local.get $1 + local.get $6 i32.const 1 i32.shl - i32.const 2416 i32.add i32.load16_u i32.const 37 @@ -2806,13 +2848,14 @@ if (result i32) i32.const 1 else - local.get $3 + local.get $1 + local.get $6 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $4 + local.tee $9 i32.const -1 i32.eq end @@ -2824,48 +2867,48 @@ call $~lib/builtins/abort unreachable end - local.get $3 + local.get $6 i32.const 3 i32.add - local.set $3 - local.get $4 + local.set $6 + local.get $9 i32.const 192 i32.and i32.const 128 i32.ne if i32.const 0 - local.set $7 + local.set $4 br $while-break|2 end - local.get $4 + local.get $9 i32.const 63 i32.and - local.get $7 + local.get $4 i32.const 6 i32.shl i32.or - local.set $7 + local.set $4 br $while-continue|2 end end end i32.const 1 - local.get $7 + local.get $4 i32.const 57344 i32.lt_u i32.const 0 - local.get $7 + local.get $4 i32.const 55296 i32.ge_u select i32.const 1 - local.get $7 + local.get $4 i32.const 1114111 i32.gt_u - local.get $5 - local.get $7 - i32.gt_u + local.get $4 + local.get $8 + i32.lt_u select select if @@ -2877,50 +2920,50 @@ unreachable end end - local.get $7 + local.get $4 i32.const 65536 i32.lt_u if (result i32) local.get $0 - local.get $6 - i32.add local.get $7 + i32.add + local.get $4 i32.store16 - local.get $6 + local.get $7 i32.const 2 i32.add else local.get $0 - local.get $6 - i32.add local.get $7 + i32.add + local.get $4 i32.const 65536 i32.sub - local.tee $7 + local.tee $4 i32.const 1023 i32.and i32.const 56320 i32.or i32.const 16 i32.shl - local.get $7 + local.get $4 i32.const 10 i32.shr_u i32.const 55296 i32.or i32.or i32.store - local.get $6 + local.get $7 i32.const 4 i32.add end - local.set $6 + local.set $7 br $while-continue|0 end end end - local.get $6 - local.get $1 + local.get $7 + local.get $2 i32.const 1 i32.shl i32.gt_u @@ -2932,19 +2975,67 @@ call $~lib/builtins/abort unreachable end - local.get $6 - local.get $1 + local.get $7 + local.get $2 i32.const 1 i32.shl i32.lt_u if (result i32) local.get $0 - local.get $6 + local.get $7 call $~lib/rt/itcms/__renew else local.get $0 end ) + (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + i32.const 1 + call $~lib/util/uri/decode + ) + (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (local $1 i32) + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.tee $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/uri/decode + ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid block $~lib/arraybuffer/ArrayBufferView @@ -2981,11 +3072,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3788 + i32.const 4188 i32.lt_s if - i32.const 20192 - i32.const 20240 + i32.const 20592 + i32.const 20640 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3000,7 +3091,7 @@ memory.size i32.const 16 i32.shl - i32.const 20172 + i32.const 20572 i32.sub i32.const 1 i32.shr_u @@ -3669,26 +3760,322 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 71 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=8 + i32.const 1760 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=4 + local.get $0 + i32.const 1760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 72 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3776 + i32.store offset=8 + i32.const 3776 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3808 + i32.store offset=4 + local.get $0 + i32.const 3808 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 73 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=8 + i32.const 2736 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=4 + local.get $0 + i32.const 2736 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 74 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=8 + i32.const 3840 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3920 + i32.store offset=4 + local.get $0 + i32.const 3920 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 75 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3968 + i32.store offset=8 + i32.const 3968 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3920 + i32.store offset=4 + local.get $0 + i32.const 3920 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 76 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4048 + i32.store offset=8 + i32.const 4048 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3152 + i32.store offset=4 + local.get $0 + i32.const 3152 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 77 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer i32.const 2416 i32.store offset=8 - block $__inlined_func$~lib/uri/decodeURIComponent (result i32) - i32.const 2416 - i32.const 2412 - i32.load + i32.const 2416 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2384 + i32.store offset=4 + local.get $0 + i32.const 2384 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 82 i32.const 1 - i32.shr_u - local.tee $0 - i32.eqz - br_if $__inlined_func$~lib/uri/decodeURIComponent - drop - local.get $0 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=8 + i32.const 1056 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1056 + i32.store offset=4 + local.get $0 + i32.const 1056 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 86 i32.const 1 - i32.shl + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=8 + i32.const 1760 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1760 + i32.store offset=4 + local.get $0 + i32.const 1760 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 87 i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - call $~lib/util/uri/decode + call $~lib/builtins/abort + unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 3776 + i32.store offset=8 + i32.const 3776 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3776 + i32.store offset=4 + local.get $0 + i32.const 3776 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 88 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=8 + i32.const 2736 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 2736 + i32.store offset=4 + local.get $0 + i32.const 2736 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 89 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=8 + i32.const 3840 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=4 + local.get $0 + i32.const 3840 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 90 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 2416 + i32.store offset=8 + i32.const 2416 + call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -3703,12 +4090,36 @@ if i32.const 0 i32.const 1712 - i32.const 81 + i32.const 91 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4048 + i32.store offset=8 + i32.const 4048 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4048 + i32.store offset=4 + local.get $0 + i32.const 4048 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 92 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 20172 + i32.const 20572 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 9cde57ab60..11fe23ecaa 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -67,26 +67,32 @@ assert( // assert(encodeURI("\uDFFF")); // malformed URI sequence // decodeURIComponent -/* + assert(decodeURIComponent("") == ""); assert(decodeURIComponent("a") == "a"); assert(decodeURIComponent("%26") == "&"); +assert(decodeURIComponent("\uD800\uDFFF") == "𐏿"); assert(decodeURIComponent("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == ";/?:@=+$,#"); assert(decodeURIComponent("%3B%2F%3F%3A%40%3D%2B%24%2C%23") == ";/?:@=+$,#"); assert( decodeURIComponent("http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description") == "http://en.wikipedia.org/wiki/UTF-8#Description" -);*/ +); -assert(decodeURIComponent("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); // fail +assert(decodeURIComponent("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); // decodeURI -/* assert(decodeURI("") == ""); assert(decodeURI("a") == "a"); assert(decodeURI("%26") == "%26"); -*/ +assert(decodeURI("\uD800\uDFFF") == "𐏿"); +assert(decodeURI("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == "%3b%2f%3f%3a%40%3d%2b%24%2c%23"); +assert(decodeURI("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); +assert( + decodeURI("http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description") == + "http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description" +); __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index a54c913623..bfde30bb17 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -64,7 +64,13 @@ (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") (data (i32.const 2572) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") (data (i32.const 2602) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2736) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2732) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") + (data (i32.const 2764) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2796) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") + (data (i32.const 2876) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") + (data (i32.const 2924) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") + (data (i32.const 3004) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") + (data (i32.const 3136) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -82,10 +88,10 @@ (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) - (global $~lib/rt/__rtti_base i32 (i32.const 2736)) - (global $~lib/memory/__data_end i32 (i32.const 2764)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19148)) - (global $~lib/memory/__heap_base i32 (i32.const 19148)) + (global $~lib/rt/__rtti_base i32 (i32.const 3136)) + (global $~lib/memory/__data_end i32 (i32.const 3164)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19548)) + (global $~lib/memory/__heap_base i32 (i32.const 19548)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -4832,6 +4838,30 @@ i32.const 1 call $~lib/util/uri/decode ) + (func $~lib/uri/decodeURI (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + local.get $0 + call $~lib/string/String#get:length + local.set $1 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + local.get $0 + local.get $1 + i32.const 0 + call $~lib/util/uri/decode + ) (func $~lib/rt/itcms/__collect (local $0 i32) i32.const 0 @@ -4940,8 +4970,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19168 - i32.const 19216 + i32.const 19568 + i32.const 19616 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5742,6 +5772,202 @@ call $~lib/builtins/abort unreachable end + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 71 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 72 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2752 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2784 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 73 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 74 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2896 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 75 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2944 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2896 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 76 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3024 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 77 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 1392 local.set $0 global.get $~lib/memory/__stack_pointer @@ -5765,7 +5991,203 @@ if i32.const 0 i32.const 688 - i32.const 81 + i32.const 82 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 32 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 86 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 736 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 87 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2752 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2752 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 88 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1712 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 89 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 90 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1392 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1360 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 91 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3024 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 3024 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 92 i32.const 1 call $~lib/builtins/abort unreachable From 00561ee3f783a5919c0176a8605afc702c92960f Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 18:28:14 +0200 Subject: [PATCH 65/87] opt --- std/assembly/util/uri.ts | 27 ++++--- tests/compiler/std/uri.optimized.wat | 94 ++++++++++++----------- tests/compiler/std/uri.ts | 4 +- tests/compiler/std/uri.untouched.wat | 108 +++++++++++++++------------ 4 files changed, 125 insertions(+), 108 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 96ed5d5ca3..ba7896d57f 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -1,7 +1,3 @@ -// References: -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_e.c -// https://github.com/brianmario/escape_utils/blob/master/ext/escape_utils/houdini_uri_u.c - import { E_URI_MALFORMED } from "./error"; import { CharCode } from "./string"; @@ -174,6 +170,8 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi ch = CharCode.PERCENT; i -= 2; } + store(dst + offset, ch); + offset += 2; } else { // decode UTF-8 sequence let bytes = utf8LenFromUpperByte(ch); @@ -210,16 +208,17 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi if (ch < lo || ch > 0x10FFFF || (ch >= 0xD800 && ch < 0xE000)) { throw new URIError(E_URI_MALFORMED); } - } - if (ch < 0x10000) { - store(dst + offset, ch); - offset += 2; - } else { - ch -= 0x10000; - let lo = ch >> 10 | 0xD800; - let hi = (ch & 0x03FF) | 0xDC00; - store(dst + offset, lo | (hi << 16)); - offset += 4; + + if (ch < 0x10000) { + store(dst + offset, ch); + offset += 2; + } else { + ch -= 0x10000; + let lo = ch >> 10 | 0xD800; + let hi = (ch & 0x03FF) | 0xDC00; + store(dst + offset, lo | (hi << 16)); + offset += 4; + } } } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 823c0e3447..0b0cf898ef 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2206,7 +2206,7 @@ if i32.const 1584 i32.const 1632 - i32.const 89 + i32.const 85 i32.const 9 call $~lib/builtins/abort unreachable @@ -2221,7 +2221,7 @@ if i32.const 1584 i32.const 1632 - i32.const 93 + i32.const 89 i32.const 11 call $~lib/builtins/abort unreachable @@ -2246,7 +2246,7 @@ if i32.const 1584 i32.const 1632 - i32.const 97 + i32.const 93 i32.const 11 call $~lib/builtins/abort unreachable @@ -2725,7 +2725,7 @@ if i32.const 1584 i32.const 1632 - i32.const 169 + i32.const 165 i32.const 7 call $~lib/builtins/abort unreachable @@ -2737,7 +2737,10 @@ local.get $4 i32.const 128 i32.lt_u - if + if (result i32) + local.get $0 + local.get $7 + i32.add local.get $3 if (result i32) i32.const 0 @@ -2764,6 +2767,11 @@ i32.const 37 local.set $4 end + local.get $4 + i32.store16 + local.get $7 + i32.const 2 + i32.add else i32.const 1 local.set $8 @@ -2862,7 +2870,7 @@ if i32.const 1584 i32.const 1632 - i32.const 200 + i32.const 198 i32.const 11 call $~lib/builtins/abort unreachable @@ -2914,48 +2922,48 @@ if i32.const 1584 i32.const 1632 - i32.const 211 + i32.const 209 i32.const 9 call $~lib/builtins/abort unreachable end - end - local.get $4 - i32.const 65536 - i32.lt_u - if (result i32) - local.get $0 - local.get $7 - i32.add - local.get $4 - i32.store16 - local.get $7 - i32.const 2 - i32.add - else - local.get $0 - local.get $7 - i32.add local.get $4 i32.const 65536 - i32.sub - local.tee $4 - i32.const 1023 - i32.and - i32.const 56320 - i32.or - i32.const 16 - i32.shl - local.get $4 - i32.const 10 - i32.shr_u - i32.const 55296 - i32.or - i32.or - i32.store - local.get $7 - i32.const 4 - i32.add + i32.lt_u + if (result i32) + local.get $0 + local.get $7 + i32.add + local.get $4 + i32.store16 + local.get $7 + i32.const 2 + i32.add + else + local.get $0 + local.get $7 + i32.add + local.get $4 + i32.const 65536 + i32.sub + local.tee $4 + i32.const 1023 + i32.and + i32.const 56320 + i32.or + i32.const 16 + i32.shl + local.get $4 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.or + i32.or + i32.store + local.get $7 + i32.const 4 + i32.add + end end local.set $7 br $while-continue|0 @@ -2970,7 +2978,7 @@ if i32.const 0 i32.const 1632 - i32.const 226 + i32.const 225 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 11fe23ecaa..cf0f7e09cf 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -71,7 +71,7 @@ assert( assert(decodeURIComponent("") == ""); assert(decodeURIComponent("a") == "a"); assert(decodeURIComponent("%26") == "&"); -assert(decodeURIComponent("\uD800\uDFFF") == "𐏿"); +assert(decodeURIComponent("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURIComponent("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == ";/?:@=+$,#"); assert(decodeURIComponent("%3B%2F%3F%3A%40%3D%2B%24%2C%23") == ";/?:@=+$,#"); assert( @@ -86,7 +86,7 @@ assert(decodeURIComponent("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺 assert(decodeURI("") == ""); assert(decodeURI("a") == "a"); assert(decodeURI("%26") == "%26"); -assert(decodeURI("\uD800\uDFFF") == "𐏿"); +assert(decodeURI("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURI("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == "%3b%2f%3f%3a%40%3d%2b%24%2c%23"); assert(decodeURI("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); assert( diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index bfde30bb17..fd6707a0a9 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3904,7 +3904,7 @@ if i32.const 560 i32.const 608 - i32.const 89 + i32.const 85 i32.const 9 call $~lib/builtins/abort unreachable @@ -3919,7 +3919,7 @@ if i32.const 560 i32.const 608 - i32.const 93 + i32.const 89 i32.const 11 call $~lib/builtins/abort unreachable @@ -3947,7 +3947,7 @@ if i32.const 560 i32.const 608 - i32.const 97 + i32.const 93 i32.const 11 call $~lib/builtins/abort unreachable @@ -4383,6 +4383,7 @@ (local $10 i32) (local $11 i32) (local $12 i32) + (local $13 i32) i32.const 0 local.set $4 i32.const 0 @@ -4518,7 +4519,7 @@ if i32.const 560 i32.const 608 - i32.const 169 + i32.const 165 i32.const 7 call $~lib/builtins/abort unreachable @@ -4562,6 +4563,15 @@ i32.sub local.set $4 end + local.get $0 + local.get $5 + i32.add + local.get $7 + i32.store16 + local.get $5 + i32.const 2 + i32.add + local.set $5 else block $~lib/util/uri/utf8LenFromUpperByte|inlined.0 (result i32) local.get $7 @@ -4675,7 +4685,7 @@ if i32.const 560 i32.const 608 - i32.const 200 + i32.const 198 i32.const 11 call $~lib/builtins/abort unreachable @@ -4733,55 +4743,55 @@ if i32.const 560 i32.const 608 - i32.const 211 + i32.const 209 i32.const 9 call $~lib/builtins/abort unreachable end - end - local.get $7 - i32.const 65536 - i32.lt_u - if - local.get $0 - local.get $5 - i32.add - local.get $7 - i32.store16 - local.get $5 - i32.const 2 - i32.add - local.set $5 - else local.get $7 i32.const 65536 - i32.sub - local.set $7 - local.get $7 - i32.const 10 - i32.shr_u - i32.const 55296 - i32.or - local.set $11 - local.get $7 - i32.const 1023 - i32.and - i32.const 56320 - i32.or - local.set $10 - local.get $0 - local.get $5 - i32.add - local.get $11 - local.get $10 - i32.const 16 - i32.shl - i32.or - i32.store - local.get $5 - i32.const 4 - i32.add - local.set $5 + i32.lt_u + if + local.get $0 + local.get $5 + i32.add + local.get $7 + i32.store16 + local.get $5 + i32.const 2 + i32.add + local.set $5 + else + local.get $7 + i32.const 65536 + i32.sub + local.set $7 + local.get $7 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.or + local.set $12 + local.get $7 + i32.const 1023 + i32.and + i32.const 56320 + i32.or + local.set $13 + local.get $0 + local.get $5 + i32.add + local.get $12 + local.get $13 + i32.const 16 + i32.shl + i32.or + i32.store + local.get $5 + i32.const 4 + i32.add + local.set $5 + end end br $while-continue|0 end @@ -4796,7 +4806,7 @@ if i32.const 0 i32.const 608 - i32.const 226 + i32.const 225 i32.const 3 call $~lib/builtins/abort unreachable From 9475f6b99e6772ccc384682d24413917b3c2f183 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 19:13:45 +0200 Subject: [PATCH 66/87] opt more --- std/assembly/util/uri.ts | 23 +++------ tests/compiler/std/uri.optimized.wat | 70 ++++++++++---------------- tests/compiler/std/uri.untouched.wat | 75 +++++++++++----------------- 3 files changed, 62 insertions(+), 106 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index ba7896d57f..5058bd7936 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -175,20 +175,11 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } else { // decode UTF-8 sequence let bytes = utf8LenFromUpperByte(ch); - let lo: u32 = 1; - if (bytes == 2) { - lo = 0x80; - ch &= 0x1F; - } else if (bytes == 3) { - lo = 0x800; - ch &= 0x0F; - } else if (bytes == 4) { - lo = 0x10000; - ch &= 0x07; - } else { - ch = 0; - } + let c1: u32 = 0; + let lo: u32 = (17 * bytes >> 2) - 1; + ch &= (0x80 >> bytes) - 1; + while (--bytes > 0) { // decode hex if ( @@ -205,7 +196,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi ch = (ch << 6) | (c1 & 0x3F); } - if (ch < lo || ch > 0x10FFFF || (ch >= 0xD800 && ch < 0xE000)) { + if (ch < lo || lo == -1 || ch > 0x10FFFF || (ch >= 0xD800 && ch < 0xE000)) { throw new URIError(E_URI_MALFORMED); } @@ -230,7 +221,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } // @ts-ignore: decorator -@inline function utf8LenFromUpperByte(c0: u32): i32 { +@inline function utf8LenFromUpperByte(c0: u32): u32 { if (ASC_SHRINK_LEVEL > 1) { if (c0 >= 0xC0 && c0 <= 0xDF) return 2; if (c0 >= 0xE0 && c0 <= 0xEF) return 3; @@ -238,7 +229,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi return 0; } else { return c0 - 128 <= 128 - ? load(UTF8_BYTE_LEN + (c0 - 128)) + ? load(UTF8_BYTE_LEN + (c0 - 128)) : 0; } } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 0b0cf898ef..9cf00f88a1 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2773,7 +2773,7 @@ i32.const 2 i32.add else - i32.const 1 + i32.const 0 local.set $8 local.get $4 local.set $5 @@ -2791,49 +2791,26 @@ i32.const 0 end local.tee $5 + i32.const 17 + i32.mul i32.const 2 - i32.eq - if (result i32) - i32.const 128 - local.set $8 - local.get $4 - i32.const 31 - i32.and - else - local.get $5 - i32.const 3 - i32.eq - if (result i32) - i32.const 2048 - local.set $8 - local.get $4 - i32.const 15 - i32.and - else - local.get $5 - i32.const 4 - i32.eq - if (result i32) - i32.const 65536 - local.set $8 - local.get $4 - i32.const 7 - i32.and - else - i32.const 0 - end - end - end - local.set $4 - i32.const 0 + i32.shr_u + i32.const 1 + i32.sub local.set $9 + local.get $4 + i32.const 128 + local.get $5 + i32.shr_u + i32.const 1 + i32.sub + i32.and + local.set $4 loop $while-continue|2 local.get $5 i32.const 1 i32.sub local.tee $5 - i32.const 0 - i32.gt_s if block $while-break|2 local.get $2 @@ -2863,14 +2840,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $9 + local.tee $8 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 198 + i32.const 189 i32.const 11 call $~lib/builtins/abort unreachable @@ -2879,7 +2856,7 @@ i32.const 3 i32.add local.set $6 - local.get $9 + local.get $8 i32.const 192 i32.and i32.const 128 @@ -2889,7 +2866,7 @@ local.set $4 br $while-break|2 end - local.get $9 + local.get $8 i32.const 63 i32.and local.get $4 @@ -2914,15 +2891,20 @@ local.get $4 i32.const 1114111 i32.gt_u + i32.const 1 + local.get $9 + i32.const -1 + i32.eq local.get $4 - local.get $8 + local.get $9 i32.lt_u select select + select if i32.const 1584 i32.const 1632 - i32.const 209 + i32.const 200 i32.const 9 call $~lib/builtins/abort unreachable @@ -2978,7 +2960,7 @@ if i32.const 0 i32.const 1632 - i32.const 225 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index fd6707a0a9..f7185679b3 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4598,48 +4598,24 @@ br $~lib/util/uri/utf8LenFromUpperByte|inlined.0 end local.set $9 - i32.const 1 + i32.const 0 local.set $10 + i32.const 17 local.get $9 + i32.mul i32.const 2 - i32.eq - if - i32.const 128 - local.set $10 - local.get $7 - i32.const 31 - i32.and - local.set $7 - else - local.get $9 - i32.const 3 - i32.eq - if - i32.const 2048 - local.set $10 - local.get $7 - i32.const 15 - i32.and - local.set $7 - else - local.get $9 - i32.const 4 - i32.eq - if - i32.const 65536 - local.set $10 - local.get $7 - i32.const 7 - i32.and - local.set $7 - else - i32.const 0 - local.set $7 - end - end - end - i32.const 0 + i32.shr_u + i32.const 1 + i32.sub local.set $11 + local.get $7 + i32.const 128 + local.get $9 + i32.shr_u + i32.const 1 + i32.sub + i32.and + local.set $7 block $while-break|2 loop $while-continue|2 local.get $9 @@ -4647,7 +4623,7 @@ i32.sub local.tee $9 i32.const 0 - i32.gt_s + i32.gt_u local.set $12 local.get $12 if @@ -4678,14 +4654,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $11 + local.tee $10 i32.const -1 i32.eq end if i32.const 560 i32.const 608 - i32.const 198 + i32.const 189 i32.const 11 call $~lib/builtins/abort unreachable @@ -4694,7 +4670,7 @@ i32.const 3 i32.add local.set $4 - local.get $11 + local.get $10 i32.const 192 i32.and i32.const 128 @@ -4707,7 +4683,7 @@ local.get $7 i32.const 6 i32.shl - local.get $11 + local.get $10 i32.const 63 i32.and i32.or @@ -4717,8 +4693,15 @@ end end local.get $7 - local.get $10 + local.get $11 i32.lt_u + if (result i32) + i32.const 1 + else + local.get $11 + i32.const -1 + i32.eq + end if (result i32) i32.const 1 else @@ -4743,7 +4726,7 @@ if i32.const 560 i32.const 608 - i32.const 209 + i32.const 200 i32.const 9 call $~lib/builtins/abort unreachable @@ -4806,7 +4789,7 @@ if i32.const 0 i32.const 608 - i32.const 225 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable From abec3f09d6efe4f57986eb3c172c795ec03b55b5 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 19:21:06 +0200 Subject: [PATCH 67/87] fix --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 3 +++ tests/compiler/std/uri.untouched.wat | 13 +++++++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 5058bd7936..ac2ccb4277 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -178,7 +178,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi let c1: u32 = 0; let lo: u32 = (17 * bytes >> 2) - 1; - ch &= (0x80 >> bytes) - 1; + ch &= bytes ? (0x80 >> bytes) - 1 : 0; while (--bytes > 0) { // decode hex diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 9cf00f88a1..7a2457469f 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2804,6 +2804,9 @@ i32.shr_u i32.const 1 i32.sub + i32.const 0 + local.get $5 + select i32.and local.set $4 loop $while-continue|2 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index f7185679b3..92d08acedf 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4609,11 +4609,16 @@ i32.sub local.set $11 local.get $7 - i32.const 128 local.get $9 - i32.shr_u - i32.const 1 - i32.sub + if (result i32) + i32.const 128 + local.get $9 + i32.shr_u + i32.const 1 + i32.sub + else + i32.const 0 + end i32.and local.set $7 block $while-break|2 From 3f3c1b84a409a8741f8026b782f9c63164518937 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 19:24:46 +0200 Subject: [PATCH 68/87] more --- std/assembly/util/uri.ts | 8 ++++---- tests/compiler/std/uri.untouched.wat | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index ac2ccb4277..cf8c697af2 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -174,13 +174,13 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi offset += 2; } else { // decode UTF-8 sequence - let bytes = utf8LenFromUpperByte(ch); + let nb = utf8LenFromUpperByte(ch); let c1: u32 = 0; - let lo: u32 = (17 * bytes >> 2) - 1; - ch &= bytes ? (0x80 >> bytes) - 1 : 0; + let lo: u32 = (17 * nb >> 2) - 1; + ch &= nb ? (0x80 >> nb) - 1 : 0; - while (--bytes > 0) { + while (--nb != 0) { // decode hex if ( i + 2 >= len || diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 92d08acedf..444d3e185d 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4628,7 +4628,7 @@ i32.sub local.tee $9 i32.const 0 - i32.gt_u + i32.ne local.set $12 local.get $12 if From 62e0ee273af3f8e33a7a6cb026357db8fb24d5d3 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 20:19:11 +0200 Subject: [PATCH 69/87] fix --- std/assembly/util/uri.ts | 4 ++-- tests/compiler/std/uri.optimized.wat | 2 ++ tests/compiler/std/uri.untouched.wat | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index cf8c697af2..c49e1de63e 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -177,8 +177,8 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi let nb = utf8LenFromUpperByte(ch); let c1: u32 = 0; - let lo: u32 = (17 * nb >> 2) - 1; - ch &= nb ? (0x80 >> nb) - 1 : 0; + let lo: u32 = 1 << (17 * nb >> 2) - 1; // 2 => 0x80, 3 => 0x800, 4 => 0x10000 + ch &= nb ? (0x80 >> nb) - 1 : 0; // 2 => 31, 3 => 15, 4 => 7 while (--nb != 0) { // decode hex diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 7a2457469f..79f28c6cc6 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2777,6 +2777,7 @@ local.set $8 local.get $4 local.set $5 + i32.const 1 local.get $4 i32.const 128 i32.sub @@ -2797,6 +2798,7 @@ i32.shr_u i32.const 1 i32.sub + i32.shl local.set $9 local.get $4 i32.const 128 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 444d3e185d..0e526c2952 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4600,6 +4600,7 @@ local.set $9 i32.const 0 local.set $10 + i32.const 1 i32.const 17 local.get $9 i32.mul @@ -4607,6 +4608,7 @@ i32.shr_u i32.const 1 i32.sub + i32.shl local.set $11 local.get $7 local.get $9 From b4da6ce580feca65258e05f93f2c0bebd6707bb2 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 20:21:51 +0200 Subject: [PATCH 70/87] better comments --- std/assembly/util/uri.ts | 6 ++++-- tests/compiler/std/uri.optimized.wat | 6 +++--- tests/compiler/std/uri.untouched.wat | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index c49e1de63e..040df905b4 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -177,8 +177,10 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi let nb = utf8LenFromUpperByte(ch); let c1: u32 = 0; - let lo: u32 = 1 << (17 * nb >> 2) - 1; // 2 => 0x80, 3 => 0x800, 4 => 0x10000 - ch &= nb ? (0x80 >> nb) - 1 : 0; // 2 => 31, 3 => 15, 4 => 7 + // lo = 2 => 0x80, 3 => 0x800, 4 => 0x10000, _ => -1 + let lo: u32 = 1 << (17 * nb >> 2) - 1; + // ch &= 2 => 31, 3 => 15, 4 => 7, _ => 0 + ch &= nb ? (0x80 >> nb) - 1 : 0; while (--nb != 0) { // decode hex diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 79f28c6cc6..9ae535d435 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2852,7 +2852,7 @@ if i32.const 1584 i32.const 1632 - i32.const 189 + i32.const 191 i32.const 11 call $~lib/builtins/abort unreachable @@ -2909,7 +2909,7 @@ if i32.const 1584 i32.const 1632 - i32.const 200 + i32.const 202 i32.const 9 call $~lib/builtins/abort unreachable @@ -2965,7 +2965,7 @@ if i32.const 0 i32.const 1632 - i32.const 216 + i32.const 218 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 0e526c2952..af24c363b0 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4668,7 +4668,7 @@ if i32.const 560 i32.const 608 - i32.const 189 + i32.const 191 i32.const 11 call $~lib/builtins/abort unreachable @@ -4733,7 +4733,7 @@ if i32.const 560 i32.const 608 - i32.const 200 + i32.const 202 i32.const 9 call $~lib/builtins/abort unreachable @@ -4796,7 +4796,7 @@ if i32.const 0 i32.const 608 - i32.const 216 + i32.const 218 i32.const 3 call $~lib/builtins/abort unreachable From 620e5d24ce418dbaf4d22d6b8373113698f63556 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 20:47:21 +0200 Subject: [PATCH 71/87] more opts --- std/assembly/util/uri.ts | 20 +- tests/compiler/std/uri.optimized.wat | 289 +++++++++++++++------------ tests/compiler/std/uri.ts | 14 +- tests/compiler/std/uri.untouched.wat | 250 +++++++++++++---------- 4 files changed, 326 insertions(+), 247 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 040df905b4..b2b7c47e74 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -49,6 +49,7 @@ import { CharCode } from "./string"; export function encode(dst: usize, src: usize, len: usize, table: usize): usize { var i: usize = 0, offset: usize = 0, outSize = len << 1; + while (i < len) { let org = i; let c: u32, c1: u32; @@ -170,19 +171,16 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi ch = CharCode.PERCENT; i -= 2; } - store(dst + offset, ch); - offset += 2; } else { // decode UTF-8 sequence let nb = utf8LenFromUpperByte(ch); - - let c1: u32 = 0; // lo = 2 => 0x80, 3 => 0x800, 4 => 0x10000, _ => -1 let lo: u32 = 1 << (17 * nb >> 2) - 1; // ch &= 2 => 31, 3 => 15, 4 => 7, _ => 0 ch &= nb ? (0x80 >> nb) - 1 : 0; while (--nb != 0) { + let c1: u32; // decode hex if ( i + 2 >= len || @@ -202,17 +200,17 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi throw new URIError(E_URI_MALFORMED); } - if (ch < 0x10000) { - store(dst + offset, ch); - offset += 2; - } else { + if (ch >= 0x10000) { ch -= 0x10000; let lo = ch >> 10 | 0xD800; let hi = (ch & 0x03FF) | 0xDC00; store(dst + offset, lo | (hi << 16)); offset += 4; + continue; } } + store(dst + offset, ch); + offset += 2; } assert(offset <= (len << 1)); @@ -225,9 +223,9 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi // @ts-ignore: decorator @inline function utf8LenFromUpperByte(c0: u32): u32 { if (ASC_SHRINK_LEVEL > 1) { - if (c0 >= 0xC0 && c0 <= 0xDF) return 2; - if (c0 >= 0xE0 && c0 <= 0xEF) return 3; - if (c0 >= 0xF0 && c0 <= 0xF7) return 4; + if (c0 - 0xC0 <= 0xDF - 0xC0) return 2; + if (c0 - 0xE0 <= 0xEF - 0xE0) return 3; + if (c0 - 0xF0 <= 0xF7 - 0xF0) return 4; return 0; } else { return c0 - 128 <= 128 diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 9ae535d435..75fe40b9bb 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -114,15 +114,17 @@ (data (i32.const 3768) "\01\00\00\00\06\00\00\00%\002\006") (data (i32.const 3788) "\1c") (data (i32.const 3800) "\01\00\00\00\02\00\00\00&") - (data (i32.const 3820) "L") - (data (i32.const 3832) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") - (data (i32.const 3900) ",") - (data (i32.const 3912) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") - (data (i32.const 3948) "L") - (data (i32.const 3960) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") - (data (i32.const 4028) "|") - (data (i32.const 4040) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 4160) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3820) "\1c") + (data (i32.const 3832) "\01\00\00\00\02\00\00\00\00\d8") + (data (i32.const 3852) "L") + (data (i32.const 3864) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") + (data (i32.const 3932) ",") + (data (i32.const 3944) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") + (data (i32.const 3980) "L") + (data (i32.const 3992) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") + (data (i32.const 4060) "|") + (data (i32.const 4072) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 4192) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -133,7 +135,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20572)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20604)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -264,7 +266,7 @@ if i32.const 0 local.get $0 - i32.const 20572 + i32.const 20604 i32.lt_u local.get $0 i32.load offset=8 @@ -310,7 +312,7 @@ i32.const 1 else local.get $1 - i32.const 4160 + i32.const 4192 i32.load i32.gt_u if @@ -324,7 +326,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4164 + i32.const 4196 i32.add i32.load i32.const 32 @@ -929,10 +931,10 @@ if unreachable end - i32.const 20576 + i32.const 20608 i32.const 0 i32.store - i32.const 22144 + i32.const 22176 i32.const 0 i32.store loop $for-loop|0 @@ -943,7 +945,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20576 + i32.const 20608 i32.add i32.const 0 i32.store offset=4 @@ -961,7 +963,7 @@ i32.add i32.const 2 i32.shl - i32.const 20576 + i32.const 20608 i32.add i32.const 0 i32.store offset=96 @@ -979,13 +981,13 @@ br $for-loop|0 end end - i32.const 20576 - i32.const 22148 + i32.const 20608 + i32.const 22180 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20576 + i32.const 20608 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1064,7 +1066,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20572 + i32.const 20604 i32.lt_u if local.get $0 @@ -1154,7 +1156,7 @@ unreachable end local.get $0 - i32.const 20572 + i32.const 20604 i32.lt_u if local.get $0 @@ -1177,7 +1179,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20572 + i32.const 20604 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2206,7 +2208,7 @@ if i32.const 1584 i32.const 1632 - i32.const 85 + i32.const 86 i32.const 9 call $~lib/builtins/abort unreachable @@ -2221,7 +2223,7 @@ if i32.const 1584 i32.const 1632 - i32.const 89 + i32.const 90 i32.const 11 call $~lib/builtins/abort unreachable @@ -2246,7 +2248,7 @@ if i32.const 1584 i32.const 1632 - i32.const 93 + i32.const 94 i32.const 11 call $~lib/builtins/abort unreachable @@ -2725,7 +2727,7 @@ if i32.const 1584 i32.const 1632 - i32.const 165 + i32.const 166 i32.const 7 call $~lib/builtins/abort unreachable @@ -2737,10 +2739,7 @@ local.get $4 i32.const 128 i32.lt_u - if (result i32) - local.get $0 - local.get $7 - i32.add + if local.get $3 if (result i32) i32.const 0 @@ -2767,14 +2766,7 @@ i32.const 37 local.set $4 end - local.get $4 - i32.store16 - local.get $7 - i32.const 2 - i32.add else - i32.const 0 - local.set $8 local.get $4 local.set $5 i32.const 1 @@ -2799,7 +2791,7 @@ i32.const 1 i32.sub i32.shl - local.set $9 + local.set $8 local.get $4 i32.const 128 local.get $5 @@ -2845,14 +2837,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $8 + local.tee $9 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 191 + i32.const 189 i32.const 11 call $~lib/builtins/abort unreachable @@ -2861,7 +2853,7 @@ i32.const 3 i32.add local.set $6 - local.get $8 + local.get $9 i32.const 192 i32.and i32.const 128 @@ -2871,7 +2863,7 @@ local.set $4 br $while-break|2 end - local.get $8 + local.get $9 i32.const 63 i32.and local.get $4 @@ -2897,11 +2889,11 @@ i32.const 1114111 i32.gt_u i32.const 1 - local.get $9 + local.get $8 i32.const -1 i32.eq local.get $4 - local.get $9 + local.get $8 i32.lt_u select select @@ -2909,24 +2901,15 @@ if i32.const 1584 i32.const 1632 - i32.const 202 + i32.const 200 i32.const 9 call $~lib/builtins/abort unreachable end local.get $4 i32.const 65536 - i32.lt_u - if (result i32) - local.get $0 - local.get $7 - i32.add - local.get $4 - i32.store16 - local.get $7 - i32.const 2 - i32.add - else + i32.ge_u + if local.get $0 local.get $7 i32.add @@ -2950,8 +2933,18 @@ local.get $7 i32.const 4 i32.add + local.set $7 + br $while-continue|0 end end + local.get $0 + local.get $7 + i32.add + local.get $4 + i32.store16 + local.get $7 + i32.const 2 + i32.add local.set $7 br $while-continue|0 end @@ -2965,7 +2958,7 @@ if i32.const 0 i32.const 1632 - i32.const 218 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable @@ -3067,11 +3060,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 4188 + i32.const 4220 i32.lt_s if - i32.const 20592 - i32.const 20640 + i32.const 20624 + i32.const 20672 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3086,7 +3079,7 @@ memory.size i32.const 16 i32.shl - i32.const 20572 + i32.const 20604 i32.sub i32.const 1 i32.shr_u @@ -3119,7 +3112,7 @@ if i32.const 0 i32.const 1712 - i32.const 6 + i32.const 4 i32.const 1 call $~lib/builtins/abort unreachable @@ -3143,7 +3136,7 @@ if i32.const 0 i32.const 1712 - i32.const 7 + i32.const 5 i32.const 1 call $~lib/builtins/abort unreachable @@ -3167,7 +3160,7 @@ if i32.const 0 i32.const 1712 - i32.const 8 + i32.const 6 i32.const 1 call $~lib/builtins/abort unreachable @@ -3191,7 +3184,7 @@ if i32.const 0 i32.const 1712 - i32.const 9 + i32.const 7 i32.const 1 call $~lib/builtins/abort unreachable @@ -3215,7 +3208,7 @@ if i32.const 0 i32.const 1712 - i32.const 10 + i32.const 8 i32.const 1 call $~lib/builtins/abort unreachable @@ -3239,7 +3232,7 @@ if i32.const 0 i32.const 1712 - i32.const 17 + i32.const 12 i32.const 1 call $~lib/builtins/abort unreachable @@ -3263,7 +3256,7 @@ if i32.const 0 i32.const 1712 - i32.const 18 + i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable @@ -3278,7 +3271,7 @@ if i32.const 0 i32.const 1712 - i32.const 19 + i32.const 14 i32.const 1 call $~lib/builtins/abort unreachable @@ -3293,7 +3286,7 @@ if i32.const 0 i32.const 1712 - i32.const 20 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable @@ -3317,7 +3310,7 @@ if i32.const 0 i32.const 1712 - i32.const 21 + i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable @@ -3341,7 +3334,7 @@ if i32.const 0 i32.const 1712 - i32.const 22 + i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable @@ -3365,7 +3358,7 @@ if i32.const 0 i32.const 1712 - i32.const 23 + i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable @@ -3389,7 +3382,7 @@ if i32.const 0 i32.const 1712 - i32.const 24 + i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable @@ -3413,7 +3406,7 @@ if i32.const 0 i32.const 1712 - i32.const 25 + i32.const 20 i32.const 1 call $~lib/builtins/abort unreachable @@ -3437,7 +3430,7 @@ if i32.const 0 i32.const 1712 - i32.const 26 + i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable @@ -3461,7 +3454,7 @@ if i32.const 0 i32.const 1712 - i32.const 27 + i32.const 22 i32.const 1 call $~lib/builtins/abort unreachable @@ -3485,7 +3478,7 @@ if i32.const 0 i32.const 1712 - i32.const 29 + i32.const 24 i32.const 1 call $~lib/builtins/abort unreachable @@ -3509,7 +3502,7 @@ if i32.const 0 i32.const 1712 - i32.const 31 + i32.const 26 i32.const 1 call $~lib/builtins/abort unreachable @@ -3533,7 +3526,7 @@ if i32.const 0 i32.const 1712 - i32.const 33 + i32.const 28 i32.const 1 call $~lib/builtins/abort unreachable @@ -3557,7 +3550,7 @@ if i32.const 0 i32.const 1712 - i32.const 46 + i32.const 39 i32.const 1 call $~lib/builtins/abort unreachable @@ -3581,7 +3574,7 @@ if i32.const 0 i32.const 1712 - i32.const 47 + i32.const 40 i32.const 1 call $~lib/builtins/abort unreachable @@ -3605,7 +3598,7 @@ if i32.const 0 i32.const 1712 - i32.const 48 + i32.const 41 i32.const 1 call $~lib/builtins/abort unreachable @@ -3629,7 +3622,7 @@ if i32.const 0 i32.const 1712 - i32.const 49 + i32.const 42 i32.const 1 call $~lib/builtins/abort unreachable @@ -3653,7 +3646,7 @@ if i32.const 0 i32.const 1712 - i32.const 56 + i32.const 46 i32.const 1 call $~lib/builtins/abort unreachable @@ -3677,7 +3670,7 @@ if i32.const 0 i32.const 1712 - i32.const 57 + i32.const 47 i32.const 1 call $~lib/builtins/abort unreachable @@ -3701,7 +3694,7 @@ if i32.const 0 i32.const 1712 - i32.const 58 + i32.const 48 i32.const 1 call $~lib/builtins/abort unreachable @@ -3725,7 +3718,7 @@ if i32.const 0 i32.const 1712 - i32.const 60 + i32.const 50 i32.const 1 call $~lib/builtins/abort unreachable @@ -3749,7 +3742,7 @@ if i32.const 0 i32.const 1712 - i32.const 61 + i32.const 51 i32.const 1 call $~lib/builtins/abort unreachable @@ -3773,7 +3766,7 @@ if i32.const 0 i32.const 1712 - i32.const 71 + i32.const 62 i32.const 1 call $~lib/builtins/abort unreachable @@ -3797,7 +3790,7 @@ if i32.const 0 i32.const 1712 - i32.const 72 + i32.const 63 i32.const 1 call $~lib/builtins/abort unreachable @@ -3821,7 +3814,31 @@ if i32.const 0 i32.const 1712 - i32.const 73 + i32.const 64 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=8 + i32.const 3840 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=4 + local.get $0 + i32.const 3840 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 65 i32.const 1 call $~lib/builtins/abort unreachable @@ -3845,63 +3862,63 @@ if i32.const 0 i32.const 1712 - i32.const 74 + i32.const 66 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3872 i32.store offset=8 - i32.const 3840 + i32.const 3872 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3920 + i32.const 3952 i32.store offset=4 local.get $0 - i32.const 3920 + i32.const 3952 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 75 + i32.const 67 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3968 + i32.const 4000 i32.store offset=8 - i32.const 3968 + i32.const 4000 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3920 + i32.const 3952 i32.store offset=4 local.get $0 - i32.const 3920 + i32.const 3952 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 76 + i32.const 68 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4048 + i32.const 4080 i32.store offset=8 - i32.const 4048 + i32.const 4080 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer @@ -3917,7 +3934,7 @@ if i32.const 0 i32.const 1712 - i32.const 77 + i32.const 69 i32.const 1 call $~lib/builtins/abort unreachable @@ -3941,7 +3958,7 @@ if i32.const 0 i32.const 1712 - i32.const 82 + i32.const 74 i32.const 1 call $~lib/builtins/abort unreachable @@ -3965,7 +3982,7 @@ if i32.const 0 i32.const 1712 - i32.const 86 + i32.const 79 i32.const 1 call $~lib/builtins/abort unreachable @@ -3989,7 +4006,7 @@ if i32.const 0 i32.const 1712 - i32.const 87 + i32.const 80 i32.const 1 call $~lib/builtins/abort unreachable @@ -4013,7 +4030,31 @@ if i32.const 0 i32.const 1712 - i32.const 88 + i32.const 81 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=8 + i32.const 3840 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3840 + i32.store offset=4 + local.get $0 + i32.const 3840 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 82 i32.const 1 call $~lib/builtins/abort unreachable @@ -4037,31 +4078,31 @@ if i32.const 0 i32.const 1712 - i32.const 89 + i32.const 83 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3872 i32.store offset=8 - i32.const 3840 + i32.const 3872 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3872 i32.store offset=4 local.get $0 - i32.const 3840 + i32.const 3872 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 90 + i32.const 84 i32.const 1 call $~lib/builtins/abort unreachable @@ -4085,36 +4126,36 @@ if i32.const 0 i32.const 1712 - i32.const 91 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4048 + i32.const 4080 i32.store offset=8 - i32.const 4048 + i32.const 4080 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4048 + i32.const 4080 i32.store offset=4 local.get $0 - i32.const 4048 + i32.const 4080 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 92 + i32.const 86 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 20572 + i32.const 20604 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index cf0f7e09cf..16e71600a0 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -1,8 +1,6 @@ // encodeURIComponent -// not escaped - assert(encodeURIComponent("") == ""); assert(encodeURIComponent("a") == "a"); assert(encodeURIComponent("a1") == "a1"); @@ -11,9 +9,6 @@ assert( encodeURIComponent("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == "ABCDXYZafgklmnwyz0123456789-_.!~*'()" ); - -// escaped - assert(encodeURIComponent("\0") == "%00"); assert(encodeURIComponent("+") == "%2B"); assert(encodeURIComponent("#0=") !== "%230%3D"); @@ -41,8 +36,6 @@ assert( // encodeURI -// not escaped - assert(encodeURI("") == ""); assert(encodeURI("a") == "a"); assert(encodeURI(";,/?:@&=+$#") == ";,/?:@&=+$#"); @@ -50,9 +43,6 @@ assert( encodeURI("ABCDXYZafgklmnwyz0123456789-_.!~*'()") == "ABCDXYZafgklmnwyz0123456789-_.!~*'()" ); - -// escaped - assert(encodeURI(" ") == "%20"); assert(encodeURI("\x7E\x7F\x80") == "~%7F%C2%80"); assert(encodeURI("\uD800\uDFFF") == "%F0%90%8F%BF"); @@ -66,11 +56,13 @@ assert( // assert(encodeURI("\uD800")); // malformed URI sequence // assert(encodeURI("\uDFFF")); // malformed URI sequence + // decodeURIComponent assert(decodeURIComponent("") == ""); assert(decodeURIComponent("a") == "a"); assert(decodeURIComponent("%26") == "&"); +assert(decodeURIComponent("\uD800") == "\uD800"); assert(decodeURIComponent("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURIComponent("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == ";/?:@=+$,#"); assert(decodeURIComponent("%3B%2F%3F%3A%40%3D%2B%24%2C%23") == ";/?:@=+$,#"); @@ -81,11 +73,13 @@ assert( assert(decodeURIComponent("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); + // decodeURI assert(decodeURI("") == ""); assert(decodeURI("a") == "a"); assert(decodeURI("%26") == "%26"); +assert(decodeURI("\uD800") == "\uD800"); assert(decodeURI("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURI("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == "%3b%2f%3f%3a%40%3d%2b%24%2c%23"); assert(decodeURI("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index af24c363b0..b2a3a50871 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -66,11 +66,12 @@ (data (i32.const 2602) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2732) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") (data (i32.const 2764) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2796) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") - (data (i32.const 2876) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") - (data (i32.const 2924) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") - (data (i32.const 3004) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") - (data (i32.const 3136) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2796) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\d8\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2828) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") + (data (i32.const 2908) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") + (data (i32.const 2956) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") + (data (i32.const 3036) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") + (data (i32.const 3168) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -88,10 +89,10 @@ (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) - (global $~lib/rt/__rtti_base i32 (i32.const 3136)) - (global $~lib/memory/__data_end i32 (i32.const 3164)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19548)) - (global $~lib/memory/__heap_base i32 (i32.const 19548)) + (global $~lib/rt/__rtti_base i32 (i32.const 3168)) + (global $~lib/memory/__data_end i32 (i32.const 3196)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19580)) + (global $~lib/memory/__heap_base i32 (i32.const 19580)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3904,7 +3905,7 @@ if i32.const 560 i32.const 608 - i32.const 85 + i32.const 86 i32.const 9 call $~lib/builtins/abort unreachable @@ -3919,7 +3920,7 @@ if i32.const 560 i32.const 608 - i32.const 89 + i32.const 90 i32.const 11 call $~lib/builtins/abort unreachable @@ -3947,7 +3948,7 @@ if i32.const 560 i32.const 608 - i32.const 93 + i32.const 94 i32.const 11 call $~lib/builtins/abort unreachable @@ -4519,7 +4520,7 @@ if i32.const 560 i32.const 608 - i32.const 165 + i32.const 166 i32.const 7 call $~lib/builtins/abort unreachable @@ -4563,15 +4564,6 @@ i32.sub local.set $4 end - local.get $0 - local.get $5 - i32.add - local.get $7 - i32.store16 - local.get $5 - i32.const 2 - i32.add - local.set $5 else block $~lib/util/uri/utf8LenFromUpperByte|inlined.0 (result i32) local.get $7 @@ -4598,8 +4590,6 @@ br $~lib/util/uri/utf8LenFromUpperByte|inlined.0 end local.set $9 - i32.const 0 - local.set $10 i32.const 1 i32.const 17 local.get $9 @@ -4609,7 +4599,7 @@ i32.const 1 i32.sub i32.shl - local.set $11 + local.set $10 local.get $7 local.get $9 if (result i32) @@ -4631,8 +4621,8 @@ local.tee $9 i32.const 0 i32.ne - local.set $12 - local.get $12 + local.set $11 + local.get $11 if local.get $4 i32.const 2 @@ -4661,14 +4651,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $10 + local.tee $12 i32.const -1 i32.eq end if i32.const 560 i32.const 608 - i32.const 191 + i32.const 189 i32.const 11 call $~lib/builtins/abort unreachable @@ -4677,7 +4667,7 @@ i32.const 3 i32.add local.set $4 - local.get $10 + local.get $12 i32.const 192 i32.and i32.const 128 @@ -4690,7 +4680,7 @@ local.get $7 i32.const 6 i32.shl - local.get $10 + local.get $12 i32.const 63 i32.and i32.or @@ -4700,12 +4690,12 @@ end end local.get $7 - local.get $11 + local.get $10 i32.lt_u if (result i32) i32.const 1 else - local.get $11 + local.get $10 i32.const -1 i32.eq end @@ -4733,25 +4723,15 @@ if i32.const 560 i32.const 608 - i32.const 202 + i32.const 200 i32.const 9 call $~lib/builtins/abort unreachable end local.get $7 i32.const 65536 - i32.lt_u + i32.ge_u if - local.get $0 - local.get $5 - i32.add - local.get $7 - i32.store16 - local.get $5 - i32.const 2 - i32.add - local.set $5 - else local.get $7 i32.const 65536 i32.sub @@ -4761,7 +4741,7 @@ i32.shr_u i32.const 55296 i32.or - local.set $12 + local.set $11 local.get $7 i32.const 1023 i32.and @@ -4771,7 +4751,7 @@ local.get $0 local.get $5 i32.add - local.get $12 + local.get $11 local.get $13 i32.const 16 i32.shl @@ -4781,8 +4761,18 @@ i32.const 4 i32.add local.set $5 + br $while-continue|0 end end + local.get $0 + local.get $5 + i32.add + local.get $7 + i32.store16 + local.get $5 + i32.const 2 + i32.add + local.set $5 br $while-continue|0 end end @@ -4796,7 +4786,7 @@ if i32.const 0 i32.const 608 - i32.const 218 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable @@ -4970,8 +4960,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19568 - i32.const 19616 + i32.const 19600 + i32.const 19648 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5031,7 +5021,7 @@ if i32.const 0 i32.const 688 - i32.const 6 + i32.const 4 i32.const 1 call $~lib/builtins/abort unreachable @@ -5059,7 +5049,7 @@ if i32.const 0 i32.const 688 - i32.const 7 + i32.const 5 i32.const 1 call $~lib/builtins/abort unreachable @@ -5087,7 +5077,7 @@ if i32.const 0 i32.const 688 - i32.const 8 + i32.const 6 i32.const 1 call $~lib/builtins/abort unreachable @@ -5115,7 +5105,7 @@ if i32.const 0 i32.const 688 - i32.const 9 + i32.const 7 i32.const 1 call $~lib/builtins/abort unreachable @@ -5143,7 +5133,7 @@ if i32.const 0 i32.const 688 - i32.const 10 + i32.const 8 i32.const 1 call $~lib/builtins/abort unreachable @@ -5171,7 +5161,7 @@ if i32.const 0 i32.const 688 - i32.const 17 + i32.const 12 i32.const 1 call $~lib/builtins/abort unreachable @@ -5199,7 +5189,7 @@ if i32.const 0 i32.const 688 - i32.const 18 + i32.const 13 i32.const 1 call $~lib/builtins/abort unreachable @@ -5217,7 +5207,7 @@ if i32.const 0 i32.const 688 - i32.const 19 + i32.const 14 i32.const 1 call $~lib/builtins/abort unreachable @@ -5235,7 +5225,7 @@ if i32.const 0 i32.const 688 - i32.const 20 + i32.const 15 i32.const 1 call $~lib/builtins/abort unreachable @@ -5263,7 +5253,7 @@ if i32.const 0 i32.const 688 - i32.const 21 + i32.const 16 i32.const 1 call $~lib/builtins/abort unreachable @@ -5291,7 +5281,7 @@ if i32.const 0 i32.const 688 - i32.const 22 + i32.const 17 i32.const 1 call $~lib/builtins/abort unreachable @@ -5319,7 +5309,7 @@ if i32.const 0 i32.const 688 - i32.const 23 + i32.const 18 i32.const 1 call $~lib/builtins/abort unreachable @@ -5347,7 +5337,7 @@ if i32.const 0 i32.const 688 - i32.const 24 + i32.const 19 i32.const 1 call $~lib/builtins/abort unreachable @@ -5375,7 +5365,7 @@ if i32.const 0 i32.const 688 - i32.const 25 + i32.const 20 i32.const 1 call $~lib/builtins/abort unreachable @@ -5403,7 +5393,7 @@ if i32.const 0 i32.const 688 - i32.const 26 + i32.const 21 i32.const 1 call $~lib/builtins/abort unreachable @@ -5431,7 +5421,7 @@ if i32.const 0 i32.const 688 - i32.const 27 + i32.const 22 i32.const 1 call $~lib/builtins/abort unreachable @@ -5459,7 +5449,7 @@ if i32.const 0 i32.const 688 - i32.const 29 + i32.const 24 i32.const 1 call $~lib/builtins/abort unreachable @@ -5487,7 +5477,7 @@ if i32.const 0 i32.const 688 - i32.const 31 + i32.const 26 i32.const 1 call $~lib/builtins/abort unreachable @@ -5515,7 +5505,7 @@ if i32.const 0 i32.const 688 - i32.const 33 + i32.const 28 i32.const 1 call $~lib/builtins/abort unreachable @@ -5543,7 +5533,7 @@ if i32.const 0 i32.const 688 - i32.const 46 + i32.const 39 i32.const 1 call $~lib/builtins/abort unreachable @@ -5571,7 +5561,7 @@ if i32.const 0 i32.const 688 - i32.const 47 + i32.const 40 i32.const 1 call $~lib/builtins/abort unreachable @@ -5599,7 +5589,7 @@ if i32.const 0 i32.const 688 - i32.const 48 + i32.const 41 i32.const 1 call $~lib/builtins/abort unreachable @@ -5627,7 +5617,7 @@ if i32.const 0 i32.const 688 - i32.const 49 + i32.const 42 i32.const 1 call $~lib/builtins/abort unreachable @@ -5655,7 +5645,7 @@ if i32.const 0 i32.const 688 - i32.const 56 + i32.const 46 i32.const 1 call $~lib/builtins/abort unreachable @@ -5683,7 +5673,7 @@ if i32.const 0 i32.const 688 - i32.const 57 + i32.const 47 i32.const 1 call $~lib/builtins/abort unreachable @@ -5711,7 +5701,7 @@ if i32.const 0 i32.const 688 - i32.const 58 + i32.const 48 i32.const 1 call $~lib/builtins/abort unreachable @@ -5739,7 +5729,7 @@ if i32.const 0 i32.const 688 - i32.const 60 + i32.const 50 i32.const 1 call $~lib/builtins/abort unreachable @@ -5767,7 +5757,7 @@ if i32.const 0 i32.const 688 - i32.const 61 + i32.const 51 i32.const 1 call $~lib/builtins/abort unreachable @@ -5795,7 +5785,7 @@ if i32.const 0 i32.const 688 - i32.const 71 + i32.const 62 i32.const 1 call $~lib/builtins/abort unreachable @@ -5823,7 +5813,7 @@ if i32.const 0 i32.const 688 - i32.const 72 + i32.const 63 i32.const 1 call $~lib/builtins/abort unreachable @@ -5851,7 +5841,35 @@ if i32.const 0 i32.const 688 - i32.const 73 + i32.const 64 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 65 i32.const 1 call $~lib/builtins/abort unreachable @@ -5879,12 +5897,12 @@ if i32.const 0 i32.const 688 - i32.const 74 + i32.const 66 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2816 + i32.const 2848 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5896,7 +5914,7 @@ local.get $0 i32.store local.get $0 - i32.const 2896 + i32.const 2928 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5907,12 +5925,12 @@ if i32.const 0 i32.const 688 - i32.const 75 + i32.const 67 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2944 + i32.const 2976 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5924,7 +5942,7 @@ local.get $0 i32.store local.get $0 - i32.const 2896 + i32.const 2928 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5935,12 +5953,12 @@ if i32.const 0 i32.const 688 - i32.const 76 + i32.const 68 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 3024 + i32.const 3056 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5963,7 +5981,7 @@ if i32.const 0 i32.const 688 - i32.const 77 + i32.const 69 i32.const 1 call $~lib/builtins/abort unreachable @@ -5991,7 +6009,7 @@ if i32.const 0 i32.const 688 - i32.const 82 + i32.const 74 i32.const 1 call $~lib/builtins/abort unreachable @@ -6019,7 +6037,7 @@ if i32.const 0 i32.const 688 - i32.const 86 + i32.const 79 i32.const 1 call $~lib/builtins/abort unreachable @@ -6047,7 +6065,7 @@ if i32.const 0 i32.const 688 - i32.const 87 + i32.const 80 i32.const 1 call $~lib/builtins/abort unreachable @@ -6075,7 +6093,35 @@ if i32.const 0 i32.const 688 - i32.const 88 + i32.const 81 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2816 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 82 i32.const 1 call $~lib/builtins/abort unreachable @@ -6103,12 +6149,12 @@ if i32.const 0 i32.const 688 - i32.const 89 + i32.const 83 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2816 + i32.const 2848 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6120,7 +6166,7 @@ local.get $0 i32.store local.get $0 - i32.const 2816 + i32.const 2848 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6131,7 +6177,7 @@ if i32.const 0 i32.const 688 - i32.const 90 + i32.const 84 i32.const 1 call $~lib/builtins/abort unreachable @@ -6159,12 +6205,12 @@ if i32.const 0 i32.const 688 - i32.const 91 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 3024 + i32.const 3056 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6176,7 +6222,7 @@ local.get $0 i32.store local.get $0 - i32.const 3024 + i32.const 3056 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6187,7 +6233,7 @@ if i32.const 0 i32.const 688 - i32.const 92 + i32.const 86 i32.const 1 call $~lib/builtins/abort unreachable From afa90fd48d1114f5797f285a9376e285cf2bc058 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 21:14:12 +0200 Subject: [PATCH 72/87] revert more precise hex char checks --- std/assembly/util/uri.ts | 68 ++++++++++++---------------- tests/compiler/std/uri.optimized.wat | 53 ++++++++++++++++------ tests/compiler/std/uri.ts | 3 ++ tests/compiler/std/uri.untouched.wat | 63 +++++++++++++++++--------- 4 files changed, 113 insertions(+), 74 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index b2b7c47e74..990ebed22a 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -220,6 +220,33 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi return dst; } +function storeHex(dst: usize, offset: usize, ch: u32): void { + // @ts-ignore: decorator + const HEX_CHARS = memory.data([ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 + ]); + + let hex = + load(HEX_CHARS + (ch >> 4 & 0x0F)) | + load(HEX_CHARS + (ch & 0x0F)) << 16; + + store(dst + offset, CharCode.PERCENT, 0); // % + store(dst + offset, hex, 2); // XX +} + +function loadHex(src: usize, offset: usize): u32 { + let c0 = load(src + offset, 0); + let c1 = load(src + offset, 2); + if (!(isHex(c0) && isHex(c1))) return -1; + return fromHex(c0) << 4 | fromHex(c1); +} + +// @ts-ignore: decorator +@inline function fromHex(ch: u32): u32 { + return (ch | 32) % 39 - 9; +} + // @ts-ignore: decorator @inline function utf8LenFromUpperByte(c0: u32): u32 { if (ASC_SHRINK_LEVEL > 1) { @@ -242,42 +269,7 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } // @ts-ignore: decorator -// @inline function isHex(ch: u32): bool { -// return ch - CharCode._0 < 10 || (ch | 32) - CharCode.a < 6; -// } - -// @ts-ignore: decorator -@inline function fromHex(ch: u32): u32 { - return (ch | 32) % 39 - 9; -} - -function storeHex(dst: usize, offset: usize, ch: u32): void { - // @ts-ignore: decorator - const HEX_CHARS = memory.data([ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 - ]); - - let hex = - load(HEX_CHARS + (ch >> 4 & 0x0F)) | - load(HEX_CHARS + (ch & 0x0F)) << 16; - - store(dst + offset, CharCode.PERCENT, 0); // % - store(dst + offset, hex, 2); // XX -} - - -function loadHex(src: usize, offset: usize): u32 { - let c0 = load(src + offset, 0); - let c1 = load(src + offset, 2); - - // if (!isHex(c0) || !isHex(c1)) return -1; - // return fromHex(c0) << 4 | fromHex(c1); - - c0 = fromHex(c0); - c1 = fromHex(c1); - - return c0 < 16 && c1 < 16 - ? c0 << 4 | c1 - : -1; +@inline function isHex(ch: u32): bool { + // @ts-ignore + return (ch - CharCode._0 < 10) | ((ch | 32) - CharCode.a < 6); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 75fe40b9bb..b4694ced9b 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2569,36 +2569,59 @@ i32.add local.tee $1 i32.load16_u + local.set $0 + local.get $1 + i32.load16_u offset=2 + local.tee $1 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + local.get $1 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + i32.or + i32.const 0 + local.get $0 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + local.get $0 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + i32.or + select + i32.eqz + if + i32.const -1 + return + end + local.get $1 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.set $0 - local.get $1 - i32.load16_u offset=2 + local.get $0 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.tee $1 - local.get $0 i32.const 4 i32.shl i32.or - i32.const -1 - local.get $1 - i32.const 16 - i32.lt_u - i32.const 0 - local.get $0 - i32.const 16 - i32.lt_u - select - select ) (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 16e71600a0..67ccb5adc9 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -88,5 +88,8 @@ assert( "http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description" ); +// assert(decodeURI("%\x10")); // malformed URI sequence +// assert(decodeURI("%\x10\x10")); // malformed URI sequence + __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index b2a3a50871..607d7fa5bb 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4337,13 +4337,53 @@ local.get $2 local.set $4 local.get $4 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + local.get $4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + i32.or + if (result i32) + local.get $3 + local.set $4 + local.get $4 + i32.const 48 + i32.sub + i32.const 10 + i32.lt_u + local.get $4 + i32.const 32 + i32.or + i32.const 97 + i32.sub + i32.const 6 + i32.lt_u + i32.or + else + i32.const 0 + end + i32.eqz + if + i32.const -1 + return + end + local.get $2 + local.set $4 + local.get $4 i32.const 32 i32.or i32.const 39 i32.rem_u i32.const 9 i32.sub - local.set $2 + i32.const 4 + i32.shl local.get $3 local.set $4 local.get $4 @@ -4353,26 +4393,7 @@ i32.rem_u i32.const 9 i32.sub - local.set $3 - local.get $2 - i32.const 16 - i32.lt_u - if (result i32) - local.get $3 - i32.const 16 - i32.lt_u - else - i32.const 0 - end - if (result i32) - local.get $2 - i32.const 4 - i32.shl - local.get $3 - i32.or - else - i32.const -1 - end + i32.or ) (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) From daa7296d49c23e983f633b05e3e3f6c4343ad73a Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 27 Mar 2021 21:15:52 +0200 Subject: [PATCH 73/87] refactor --- std/assembly/util/uri.ts | 5 +-- tests/compiler/std/uri.optimized.wat | 41 +++++++++++------------- tests/compiler/std/uri.untouched.wat | 47 ++++++++++++++-------------- 3 files changed, 45 insertions(+), 48 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 990ebed22a..767274e5b6 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -238,8 +238,9 @@ function storeHex(dst: usize, offset: usize, ch: u32): void { function loadHex(src: usize, offset: usize): u32 { let c0 = load(src + offset, 0); let c1 = load(src + offset, 2); - if (!(isHex(c0) && isHex(c1))) return -1; - return fromHex(c0) << 4 | fromHex(c1); + return isHex(c0) && isHex(c1) + ? fromHex(c0) << 4 | fromHex(c1) + : -1; } // @ts-ignore: decorator diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index b4694ced9b..69a31bc80d 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2573,6 +2573,24 @@ local.get $1 i32.load16_u offset=2 local.tee $1 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + local.get $0 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.const 4 + i32.shl + i32.or + i32.const -1 + local.get $1 i32.const 48 i32.sub i32.const 10 @@ -2600,28 +2618,7 @@ i32.lt_u i32.or select - i32.eqz - if - i32.const -1 - return - end - local.get $1 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - local.get $0 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - i32.const 4 - i32.shl - i32.or + select ) (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 607d7fa5bb..1dcaf888a2 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4368,32 +4368,31 @@ else i32.const 0 end - i32.eqz - if + if (result i32) + local.get $2 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.const 4 + i32.shl + local.get $3 + local.set $4 + local.get $4 + i32.const 32 + i32.or + i32.const 39 + i32.rem_u + i32.const 9 + i32.sub + i32.or + else i32.const -1 - return end - local.get $2 - local.set $4 - local.get $4 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - i32.const 4 - i32.shl - local.get $3 - local.set $4 - local.get $4 - i32.const 32 - i32.or - i32.const 39 - i32.rem_u - i32.const 9 - i32.sub - i32.or ) (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) From a42b0c8903e8a5b307bfc1062d96c1b796a05f89 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Mar 2021 00:38:42 +0200 Subject: [PATCH 74/87] more tests --- tests/compiler/std/uri.optimized.wat | 216 +++++++++++++++++++-------- tests/compiler/std/uri.ts | 22 ++- tests/compiler/std/uri.untouched.wat | 162 +++++++++++++++----- 3 files changed, 292 insertions(+), 108 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 69a31bc80d..f8bb274322 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -115,16 +115,28 @@ (data (i32.const 3788) "\1c") (data (i32.const 3800) "\01\00\00\00\02\00\00\00&") (data (i32.const 3820) "\1c") - (data (i32.const 3832) "\01\00\00\00\02\00\00\00\00\d8") - (data (i32.const 3852) "L") - (data (i32.const 3864) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") - (data (i32.const 3932) ",") - (data (i32.const 3944) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") - (data (i32.const 3980) "L") - (data (i32.const 3992) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") - (data (i32.const 4060) "|") - (data (i32.const 4072) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 4192) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3832) "\01\00\00\00\06\00\00\00%\005\00E") + (data (i32.const 3852) "\1c") + (data (i32.const 3864) "\01\00\00\00\02\00\00\00^") + (data (i32.const 3884) "\1c") + (data (i32.const 3896) "\01\00\00\00\02\00\00\00\00\d8") + (data (i32.const 3916) "L") + (data (i32.const 3928) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") + (data (i32.const 3996) ",") + (data (i32.const 4008) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") + (data (i32.const 4044) "L") + (data (i32.const 4056) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") + (data (i32.const 4124) "|") + (data (i32.const 4136) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 4252) "\1c") + (data (i32.const 4264) "\01\00\00\00\0c\00\00\00%\00D\00F\00%\008\000") + (data (i32.const 4284) "\1c") + (data (i32.const 4296) "\01\00\00\00\02\00\00\00\c0\07") + (data (i32.const 4316) "\1c") + (data (i32.const 4328) "\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F") + (data (i32.const 4348) "\1c") + (data (i32.const 4360) "\01\00\00\00\02\00\00\00\bf") + (data (i32.const 4384) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -135,7 +147,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20604)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20796)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -266,7 +278,7 @@ if i32.const 0 local.get $0 - i32.const 20604 + i32.const 20796 i32.lt_u local.get $0 i32.load offset=8 @@ -312,7 +324,7 @@ i32.const 1 else local.get $1 - i32.const 4192 + i32.const 4384 i32.load i32.gt_u if @@ -326,7 +338,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4196 + i32.const 4388 i32.add i32.load i32.const 32 @@ -931,10 +943,10 @@ if unreachable end - i32.const 20608 + i32.const 20800 i32.const 0 i32.store - i32.const 22176 + i32.const 22368 i32.const 0 i32.store loop $for-loop|0 @@ -945,7 +957,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20608 + i32.const 20800 i32.add i32.const 0 i32.store offset=4 @@ -963,7 +975,7 @@ i32.add i32.const 2 i32.shl - i32.const 20608 + i32.const 20800 i32.add i32.const 0 i32.store offset=96 @@ -981,13 +993,13 @@ br $for-loop|0 end end - i32.const 20608 - i32.const 22180 + i32.const 20800 + i32.const 22372 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20608 + i32.const 20800 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1066,7 +1078,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20604 + i32.const 20796 i32.lt_u if local.get $0 @@ -1156,7 +1168,7 @@ unreachable end local.get $0 - i32.const 20604 + i32.const 20796 i32.lt_u if local.get $0 @@ -1179,7 +1191,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20604 + i32.const 20796 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3080,11 +3092,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 4220 + i32.const 4412 i32.lt_s if - i32.const 20624 - i32.const 20672 + i32.const 20816 + i32.const 20864 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3099,7 +3111,7 @@ memory.size i32.const 16 i32.shl - i32.const 20604 + i32.const 20796 i32.sub i32.const 1 i32.shr_u @@ -3849,10 +3861,10 @@ local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3872 i32.store offset=4 local.get $0 - i32.const 3840 + i32.const 3872 call $~lib/string/String.__eq i32.eqz if @@ -3864,6 +3876,30 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 3904 + i32.store offset=8 + i32.const 3904 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3904 + i32.store offset=4 + local.get $0 + i32.const 3904 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 66 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer i32.const 2736 i32.store offset=8 i32.const 2736 @@ -3882,63 +3918,63 @@ if i32.const 0 i32.const 1712 - i32.const 66 + i32.const 67 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3872 + i32.const 3936 i32.store offset=8 - i32.const 3872 + i32.const 3936 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3952 + i32.const 4016 i32.store offset=4 local.get $0 - i32.const 3952 + i32.const 4016 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 67 + i32.const 68 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4000 + i32.const 4064 i32.store offset=8 - i32.const 4000 + i32.const 4064 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3952 + i32.const 4016 i32.store offset=4 local.get $0 - i32.const 3952 + i32.const 4016 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 68 + i32.const 69 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4080 + i32.const 4144 i32.store offset=8 - i32.const 4080 + i32.const 4144 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer @@ -3954,7 +3990,7 @@ if i32.const 0 i32.const 1712 - i32.const 69 + i32.const 70 i32.const 1 call $~lib/builtins/abort unreachable @@ -3978,7 +4014,7 @@ if i32.const 0 i32.const 1712 - i32.const 74 + i32.const 75 i32.const 1 call $~lib/builtins/abort unreachable @@ -4002,7 +4038,7 @@ if i32.const 0 i32.const 1712 - i32.const 79 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable @@ -4026,7 +4062,7 @@ if i32.const 0 i32.const 1712 - i32.const 80 + i32.const 86 i32.const 1 call $~lib/builtins/abort unreachable @@ -4050,31 +4086,79 @@ if i32.const 0 i32.const 1712 - i32.const 81 + i32.const 87 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 4272 i32.store offset=8 - i32.const 3840 + i32.const 4272 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 4304 i32.store offset=4 local.get $0 - i32.const 3840 + i32.const 4304 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 82 + i32.const 88 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4336 + i32.store offset=8 + i32.const 4336 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4368 + i32.store offset=4 + local.get $0 + i32.const 4368 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 89 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 3904 + i32.store offset=8 + i32.const 3904 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 3904 + i32.store offset=4 + local.get $0 + i32.const 3904 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 90 i32.const 1 call $~lib/builtins/abort unreachable @@ -4098,31 +4182,31 @@ if i32.const 0 i32.const 1712 - i32.const 83 + i32.const 91 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3872 + i32.const 3936 i32.store offset=8 - i32.const 3872 + i32.const 3936 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3872 + i32.const 3936 i32.store offset=4 local.get $0 - i32.const 3872 + i32.const 3936 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 84 + i32.const 92 i32.const 1 call $~lib/builtins/abort unreachable @@ -4146,36 +4230,36 @@ if i32.const 0 i32.const 1712 - i32.const 85 + i32.const 93 i32.const 1 call $~lib/builtins/abort unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4080 + i32.const 4144 i32.store offset=8 - i32.const 4080 + i32.const 4144 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4080 + i32.const 4144 i32.store offset=4 local.get $0 - i32.const 4080 + i32.const 4144 call $~lib/string/String.__eq i32.eqz if i32.const 0 i32.const 1712 - i32.const 86 + i32.const 94 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 20604 + i32.const 20796 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 67ccb5adc9..306fbaafa6 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -30,8 +30,8 @@ assert( "http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FUTF-8%23Description" ); -// assert(encodeURIComponent("\uD800")); // malformed URI sequence -// assert(encodeURIComponent("\uDFFF")); // malformed URI sequence +// assert(encodeURIComponent("\uD800")); // malformed URI sequence (ok) +// assert(encodeURIComponent("\uDFFF")); // malformed URI sequence (ok) // encodeURI @@ -53,8 +53,8 @@ assert( "http://en.wikipedia.org/wiki/UTF-8#Description" ); -// assert(encodeURI("\uD800")); // malformed URI sequence -// assert(encodeURI("\uDFFF")); // malformed URI sequence +// assert(encodeURI("\uD800")); // malformed URI sequence (ok) +// assert(encodeURI("\uDFFF")); // malformed URI sequence (ok) // decodeURIComponent @@ -62,6 +62,7 @@ assert( assert(decodeURIComponent("") == ""); assert(decodeURIComponent("a") == "a"); assert(decodeURIComponent("%26") == "&"); +assert(decodeURIComponent('%5E') == "^"); assert(decodeURIComponent("\uD800") == "\uD800"); assert(decodeURIComponent("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURIComponent("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == ";/?:@=+$,#"); @@ -73,12 +74,19 @@ assert( assert(decodeURIComponent("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); +// assert(decodeURIComponent("%1")); // malformed URI sequence (ok) +// assert(decodeURIComponent("%1/")); // malformed URI sequence (ok) +// assert(decodeURIComponent("%1`")); // malformed URI sequence (ok) +// assert(decodeURIComponent("%1g")); // malformed URI sequence (ok) +// assert(decodeURIComponent("%\uFFFF")); // malformed URI sequence (ok) // decodeURI assert(decodeURI("") == ""); assert(decodeURI("a") == "a"); assert(decodeURI("%26") == "%26"); +assert(decodeURI("%DF%80") == "߀"); +assert(decodeURI("%C2%BF") == "¿"); assert(decodeURI("\uD800") == "\uD800"); assert(decodeURI("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURI("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == "%3b%2f%3f%3a%40%3d%2b%24%2c%23"); @@ -88,8 +96,10 @@ assert( "http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description" ); -// assert(decodeURI("%\x10")); // malformed URI sequence -// assert(decodeURI("%\x10\x10")); // malformed URI sequence +// assert(decodeURI("%\x10")); // malformed URI sequence (ok) +// assert(decodeURI("%\x10\x10")); // malformed URI sequence (ok) +// assert(decodeURI("%C2%0x80")); // malformed URI sequence (ok) +// assert(decodeURI("%80%BF")); // malformed URI sequence (ok) __stack_pointer = __heap_base; __collect(); diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 1dcaf888a2..0675ed7d35 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -66,12 +66,18 @@ (data (i32.const 2602) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2732) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") (data (i32.const 2764) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2796) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\d8\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2828) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") - (data (i32.const 2908) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") - (data (i32.const 2956) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") - (data (i32.const 3036) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") - (data (i32.const 3168) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2796) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\005\00E\00\00\00\00\00\00\00") + (data (i32.const 2828) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00^\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2860) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\d8\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2892) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") + (data (i32.const 2972) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") + (data (i32.const 3020) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") + (data (i32.const 3100) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") + (data (i32.const 3228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00D\00F\00%\008\000\00") + (data (i32.const 3260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\c0\07\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F\00") + (data (i32.const 3324) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\bf\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3360) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -89,10 +95,10 @@ (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) - (global $~lib/rt/__rtti_base i32 (i32.const 3168)) - (global $~lib/memory/__data_end i32 (i32.const 3196)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19580)) - (global $~lib/memory/__heap_base i32 (i32.const 19580)) + (global $~lib/rt/__rtti_base i32 (i32.const 3360)) + (global $~lib/memory/__data_end i32 (i32.const 3388)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19772)) + (global $~lib/memory/__heap_base i32 (i32.const 19772)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -4980,8 +4986,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19600 - i32.const 19648 + i32.const 19792 + i32.const 19840 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5878,7 +5884,7 @@ local.get $0 i32.store local.get $0 - i32.const 2816 + i32.const 2848 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5894,7 +5900,7 @@ call $~lib/builtins/abort unreachable end - i32.const 1712 + i32.const 2880 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5906,7 +5912,7 @@ local.get $0 i32.store local.get $0 - i32.const 1712 + i32.const 2880 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5922,7 +5928,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2848 + i32.const 1712 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5934,7 +5940,7 @@ local.get $0 i32.store local.get $0 - i32.const 2928 + i32.const 1712 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5950,7 +5956,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2976 + i32.const 2912 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5962,7 +5968,7 @@ local.get $0 i32.store local.get $0 - i32.const 2928 + i32.const 2992 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5978,7 +5984,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3056 + i32.const 3040 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5990,7 +5996,7 @@ local.get $0 i32.store local.get $0 - i32.const 2128 + i32.const 2992 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6006,6 +6012,34 @@ call $~lib/builtins/abort unreachable end + i32.const 3120 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURIComponent + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2128 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 70 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 1392 local.set $0 global.get $~lib/memory/__stack_pointer @@ -6029,7 +6063,7 @@ if i32.const 0 i32.const 688 - i32.const 74 + i32.const 75 i32.const 1 call $~lib/builtins/abort unreachable @@ -6057,7 +6091,7 @@ if i32.const 0 i32.const 688 - i32.const 79 + i32.const 85 i32.const 1 call $~lib/builtins/abort unreachable @@ -6085,7 +6119,7 @@ if i32.const 0 i32.const 688 - i32.const 80 + i32.const 86 i32.const 1 call $~lib/builtins/abort unreachable @@ -6113,12 +6147,12 @@ if i32.const 0 i32.const 688 - i32.const 81 + i32.const 87 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2816 + i32.const 3248 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6130,7 +6164,63 @@ local.get $0 i32.store local.get $0 - i32.const 2816 + i32.const 3280 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 88 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3312 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 3344 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 89 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2880 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 2880 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6141,7 +6231,7 @@ if i32.const 0 i32.const 688 - i32.const 82 + i32.const 90 i32.const 1 call $~lib/builtins/abort unreachable @@ -6169,12 +6259,12 @@ if i32.const 0 i32.const 688 - i32.const 83 + i32.const 91 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 2848 + i32.const 2912 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6186,7 +6276,7 @@ local.get $0 i32.store local.get $0 - i32.const 2848 + i32.const 2912 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6197,7 +6287,7 @@ if i32.const 0 i32.const 688 - i32.const 84 + i32.const 92 i32.const 1 call $~lib/builtins/abort unreachable @@ -6225,12 +6315,12 @@ if i32.const 0 i32.const 688 - i32.const 85 + i32.const 93 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 3056 + i32.const 3120 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6242,7 +6332,7 @@ local.get $0 i32.store local.get $0 - i32.const 3056 + i32.const 3120 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6253,7 +6343,7 @@ if i32.const 0 i32.const 688 - i32.const 86 + i32.const 94 i32.const 1 call $~lib/builtins/abort unreachable From e00b7e461a6160eb3f03d17a902b3a2326469d8a Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Mar 2021 02:44:26 +0200 Subject: [PATCH 75/87] align shinked unicode range for 4 bytes range with table --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 94 +++++++++++++++++++++------- tests/compiler/std/uri.ts | 2 + tests/compiler/std/uri.untouched.wat | 74 +++++++++++++++++++--- 4 files changed, 142 insertions(+), 30 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 767274e5b6..8cad17d756 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -253,7 +253,7 @@ function loadHex(src: usize, offset: usize): u32 { if (ASC_SHRINK_LEVEL > 1) { if (c0 - 0xC0 <= 0xDF - 0xC0) return 2; if (c0 - 0xE0 <= 0xEF - 0xE0) return 3; - if (c0 - 0xF0 <= 0xF7 - 0xF0) return 4; + if (c0 - 0xF0 <= 0xF4 - 0xF0) return 4; return 0; } else { return c0 - 128 <= 128 diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index f8bb274322..ecebe7def3 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -136,7 +136,11 @@ (data (i32.const 4328) "\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F") (data (i32.const 4348) "\1c") (data (i32.const 4360) "\01\00\00\00\02\00\00\00\bf") - (data (i32.const 4384) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 4380) ",") + (data (i32.const 4392) "\01\00\00\00\0e\00\00\00\f7\00\b8\00W\00\ef\00\0f\00\f4\00V") + (data (i32.const 4428) "\1c") + (data (i32.const 4440) "\01\00\00\00\06\00\00\00\f4\00\b8\00\ef") + (data (i32.const 4464) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -147,7 +151,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20796)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20876)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -278,7 +282,7 @@ if i32.const 0 local.get $0 - i32.const 20796 + i32.const 20876 i32.lt_u local.get $0 i32.load offset=8 @@ -324,7 +328,7 @@ i32.const 1 else local.get $1 - i32.const 4384 + i32.const 4464 i32.load i32.gt_u if @@ -338,7 +342,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4388 + i32.const 4468 i32.add i32.load i32.const 32 @@ -943,10 +947,10 @@ if unreachable end - i32.const 20800 + i32.const 20880 i32.const 0 i32.store - i32.const 22368 + i32.const 22448 i32.const 0 i32.store loop $for-loop|0 @@ -957,7 +961,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20800 + i32.const 20880 i32.add i32.const 0 i32.store offset=4 @@ -975,7 +979,7 @@ i32.add i32.const 2 i32.shl - i32.const 20800 + i32.const 20880 i32.add i32.const 0 i32.store offset=96 @@ -993,13 +997,13 @@ br $for-loop|0 end end - i32.const 20800 - i32.const 22372 + i32.const 20880 + i32.const 22452 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20800 + i32.const 20880 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1078,7 +1082,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20796 + i32.const 20876 i32.lt_u if local.get $0 @@ -1168,7 +1172,7 @@ unreachable end local.get $0 - i32.const 20796 + i32.const 20876 i32.lt_u if local.get $0 @@ -1191,7 +1195,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20796 + i32.const 20876 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -3092,11 +3096,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 4412 + i32.const 4492 i32.lt_s if - i32.const 20816 - i32.const 20864 + i32.const 20896 + i32.const 20944 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3111,7 +3115,7 @@ memory.size i32.const 16 i32.shl - i32.const 20796 + i32.const 20876 i32.sub i32.const 1 i32.shr_u @@ -4236,6 +4240,54 @@ unreachable end global.get $~lib/memory/__stack_pointer + i32.const 4400 + i32.store offset=8 + i32.const 4400 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4400 + i32.store offset=4 + local.get $0 + i32.const 4400 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 94 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4448 + i32.store offset=8 + i32.const 4448 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4448 + i32.store offset=4 + local.get $0 + i32.const 4448 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1712 + i32.const 95 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer i32.const 4144 i32.store offset=8 i32.const 4144 @@ -4254,12 +4306,12 @@ if i32.const 0 i32.const 1712 - i32.const 94 + i32.const 96 i32.const 1 call $~lib/builtins/abort unreachable end - i32.const 20796 + i32.const 20876 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.ts b/tests/compiler/std/uri.ts index 306fbaafa6..df56861342 100644 --- a/tests/compiler/std/uri.ts +++ b/tests/compiler/std/uri.ts @@ -91,6 +91,8 @@ assert(decodeURI("\uD800") == "\uD800"); assert(decodeURI("\uD800\uDFFF") == "\uD800\uDFFF"); assert(decodeURI("%3b%2f%3f%3a%40%3d%2b%24%2c%23") == "%3b%2f%3f%3a%40%3d%2b%24%2c%23"); assert(decodeURI("%F0%9F%87%AD%F0%9F%87%BA%F0%9F%8D%8E") == "🇭🇺🍎"); +assert(decodeURI("\xf7\xb8W\xef\x0f\xf4V") == "÷¸WïôV"); +assert(decodeURI("\xF4\xB8\xEF") == "ô¸ï"); assert( decodeURI("http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description") == "http:%2F%2Fen.wikipedia.org/wiki/UTF-8%23Description" diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 0675ed7d35..b62b44433f 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -77,7 +77,9 @@ (data (i32.const 3260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\c0\07\00\00\00\00\00\00\00\00\00\00") (data (i32.const 3292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F\00") (data (i32.const 3324) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\bf\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 3360) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3356) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00\f7\00\b8\00W\00\ef\00\0f\00\f4\00V\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3404) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\f4\00\b8\00\ef\00\00\00\00\00\00\00") + (data (i32.const 3440) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -95,10 +97,10 @@ (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) - (global $~lib/rt/__rtti_base i32 (i32.const 3360)) - (global $~lib/memory/__data_end i32 (i32.const 3388)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19772)) - (global $~lib/memory/__heap_base i32 (i32.const 19772)) + (global $~lib/rt/__rtti_base i32 (i32.const 3440)) + (global $~lib/memory/__data_end i32 (i32.const 3468)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19852)) + (global $~lib/memory/__heap_base i32 (i32.const 19852)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -4986,8 +4988,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19792 - i32.const 19840 + i32.const 19872 + i32.const 19920 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -6320,6 +6322,62 @@ call $~lib/builtins/abort unreachable end + i32.const 3376 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 3376 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 94 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3424 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $~lib/uri/decodeURI + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 3424 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 688 + i32.const 95 + i32.const 1 + call $~lib/builtins/abort + unreachable + end i32.const 3120 local.set $0 global.get $~lib/memory/__stack_pointer @@ -6343,7 +6401,7 @@ if i32.const 0 i32.const 688 - i32.const 94 + i32.const 96 i32.const 1 call $~lib/builtins/abort unreachable From b3952b0da4466e04cebcd63299e03362a1e22a45 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Mar 2021 12:22:47 +0300 Subject: [PATCH 76/87] simplify utf8LenFromUpperByte --- std/assembly/util/uri.ts | 31 +-- tests/compiler/std/uri.optimized.wat | 345 +++++++++++++-------------- tests/compiler/std/uri.untouched.wat | 151 ++++++------ 3 files changed, 249 insertions(+), 278 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 8cad17d756..ad8e10c2d5 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -33,20 +33,6 @@ import { CharCode } from "./string"; 1, /* skip 191 always set to '0' tail slots */ ]); -// @ts-ignore: decorator -@lazy export const UTF8_BYTE_LEN = memory.data([ - /* skip 128 always set to '1' head slots */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -]); - - export function encode(dst: usize, src: usize, len: usize, table: usize): usize { var i: usize = 0, offset: usize = 0, outSize = len << 1; @@ -250,16 +236,13 @@ function loadHex(src: usize, offset: usize): u32 { // @ts-ignore: decorator @inline function utf8LenFromUpperByte(c0: u32): u32 { - if (ASC_SHRINK_LEVEL > 1) { - if (c0 - 0xC0 <= 0xDF - 0xC0) return 2; - if (c0 - 0xE0 <= 0xEF - 0xE0) return 3; - if (c0 - 0xF0 <= 0xF4 - 0xF0) return 4; - return 0; - } else { - return c0 - 128 <= 128 - ? load(UTF8_BYTE_LEN + (c0 - 128)) - : 0; - } + // if (c0 - 0xC0 <= 0xDF - 0xC0) return 2; + // if (c0 - 0xE0 <= 0xEF - 0xE0) return 3; + // if (c0 - 0xF0 <= 0xF7 - 0xF0) return 4; + // return 0; + return c0 - 0xC0 <= 55 + ? clz(~(c0 << 24)) + : 0; } // @ts-ignore: decorator diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index ecebe7def3..79c64b8107 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -109,38 +109,37 @@ (data (i32.const 3576) "\01\00\00\00\06\00\00\00%\002\000") (data (i32.const 3596) "\01\01\00\01\00\00\00\00\01\01\00\00\01") (data (i32.const 3619) "\01\01\00\01\00\01\01") - (data (i32.const 3690) "\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04") + (data (i32.const 3628) "\1c") + (data (i32.const 3640) "\01\00\00\00\06\00\00\00%\002\006") + (data (i32.const 3660) "\1c") + (data (i32.const 3672) "\01\00\00\00\02\00\00\00&") + (data (i32.const 3692) "\1c") + (data (i32.const 3704) "\01\00\00\00\06\00\00\00%\005\00E") + (data (i32.const 3724) "\1c") + (data (i32.const 3736) "\01\00\00\00\02\00\00\00^") (data (i32.const 3756) "\1c") - (data (i32.const 3768) "\01\00\00\00\06\00\00\00%\002\006") - (data (i32.const 3788) "\1c") - (data (i32.const 3800) "\01\00\00\00\02\00\00\00&") - (data (i32.const 3820) "\1c") - (data (i32.const 3832) "\01\00\00\00\06\00\00\00%\005\00E") - (data (i32.const 3852) "\1c") - (data (i32.const 3864) "\01\00\00\00\02\00\00\00^") - (data (i32.const 3884) "\1c") - (data (i32.const 3896) "\01\00\00\00\02\00\00\00\00\d8") + (data (i32.const 3768) "\01\00\00\00\02\00\00\00\00\d8") + (data (i32.const 3788) "L") + (data (i32.const 3800) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") + (data (i32.const 3868) ",") + (data (i32.const 3880) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") (data (i32.const 3916) "L") - (data (i32.const 3928) "\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003") - (data (i32.const 3996) ",") - (data (i32.const 4008) "\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#") - (data (i32.const 4044) "L") - (data (i32.const 4056) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") - (data (i32.const 4124) "|") - (data (i32.const 4136) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") - (data (i32.const 4252) "\1c") - (data (i32.const 4264) "\01\00\00\00\0c\00\00\00%\00D\00F\00%\008\000") - (data (i32.const 4284) "\1c") - (data (i32.const 4296) "\01\00\00\00\02\00\00\00\c0\07") - (data (i32.const 4316) "\1c") - (data (i32.const 4328) "\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F") - (data (i32.const 4348) "\1c") - (data (i32.const 4360) "\01\00\00\00\02\00\00\00\bf") - (data (i32.const 4380) ",") - (data (i32.const 4392) "\01\00\00\00\0e\00\00\00\f7\00\b8\00W\00\ef\00\0f\00\f4\00V") - (data (i32.const 4428) "\1c") - (data (i32.const 4440) "\01\00\00\00\06\00\00\00\f4\00\b8\00\ef") - (data (i32.const 4464) "\03\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3928) "\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003") + (data (i32.const 3996) "|") + (data (i32.const 4008) "\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n") + (data (i32.const 4124) "\1c") + (data (i32.const 4136) "\01\00\00\00\0c\00\00\00%\00D\00F\00%\008\000") + (data (i32.const 4156) "\1c") + (data (i32.const 4168) "\01\00\00\00\02\00\00\00\c0\07") + (data (i32.const 4188) "\1c") + (data (i32.const 4200) "\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F") + (data (i32.const 4220) "\1c") + (data (i32.const 4232) "\01\00\00\00\02\00\00\00\bf") + (data (i32.const 4252) ",") + (data (i32.const 4264) "\01\00\00\00\0e\00\00\00\f7\00\b8\00W\00\ef\00\0f\00\f4\00V") + (data (i32.const 4300) "\1c") + (data (i32.const 4312) "\01\00\00\00\06\00\00\00\f4\00\b8\00\ef") + (data (i32.const 4336) "\03\00\00\00 \00\00\00\00\00\00\00 ") (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -151,7 +150,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20876)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20748)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) @@ -282,7 +281,7 @@ if i32.const 0 local.get $0 - i32.const 20876 + i32.const 20748 i32.lt_u local.get $0 i32.load offset=8 @@ -328,7 +327,7 @@ i32.const 1 else local.get $1 - i32.const 4464 + i32.const 4336 i32.load i32.gt_u if @@ -342,7 +341,7 @@ local.get $1 i32.const 3 i32.shl - i32.const 4468 + i32.const 4340 i32.add i32.load i32.const 32 @@ -947,10 +946,10 @@ if unreachable end - i32.const 20880 + i32.const 20752 i32.const 0 i32.store - i32.const 22448 + i32.const 22320 i32.const 0 i32.store loop $for-loop|0 @@ -961,7 +960,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 20880 + i32.const 20752 i32.add i32.const 0 i32.store offset=4 @@ -979,7 +978,7 @@ i32.add i32.const 2 i32.shl - i32.const 20880 + i32.const 20752 i32.add i32.const 0 i32.store offset=96 @@ -997,13 +996,13 @@ br $for-loop|0 end end - i32.const 20880 - i32.const 22452 + i32.const 20752 + i32.const 22324 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20880 + i32.const 20752 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -1082,7 +1081,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20876 + i32.const 20748 i32.lt_u if local.get $0 @@ -1172,7 +1171,7 @@ unreachable end local.get $0 - i32.const 20876 + i32.const 20748 i32.lt_u if local.get $0 @@ -1195,7 +1194,7 @@ i32.const 4 i32.add local.tee $1 - i32.const 20876 + i32.const 20748 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -2224,7 +2223,7 @@ if i32.const 1584 i32.const 1632 - i32.const 86 + i32.const 72 i32.const 9 call $~lib/builtins/abort unreachable @@ -2239,7 +2238,7 @@ if i32.const 1584 i32.const 1632 - i32.const 90 + i32.const 76 i32.const 11 call $~lib/builtins/abort unreachable @@ -2264,7 +2263,7 @@ if i32.const 1584 i32.const 1632 - i32.const 94 + i32.const 80 i32.const 11 call $~lib/builtins/abort unreachable @@ -2645,42 +2644,42 @@ (local $9 i32) loop $while-continue|0 local.get $2 - local.get $6 + local.get $4 i32.gt_u if block $while-break|0 - local.get $6 + local.get $4 local.set $5 loop $while-continue|1 local.get $2 - local.get $6 + local.get $4 i32.gt_u if (result i32) local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $4 + local.tee $6 i32.const 37 i32.ne else i32.const 0 end if - local.get $6 + local.get $4 i32.const 1 i32.add - local.set $6 + local.set $4 br $while-continue|1 end end + local.get $4 local.get $5 - local.get $6 - i32.lt_u + i32.gt_u if - local.get $6 + local.get $4 local.get $5 i32.sub i32.const 1 @@ -2732,16 +2731,16 @@ i32.add local.set $7 local.get $2 - local.get $6 + local.get $4 i32.le_u br_if $while-break|0 end i32.const 1 - local.get $4 + local.get $6 i32.const 37 i32.ne local.get $2 - local.get $6 + local.get $4 i32.const 2 i32.add i32.le_u @@ -2750,29 +2749,29 @@ i32.const 1 else local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $4 + local.tee $6 i32.const -1 i32.eq end if i32.const 1584 i32.const 1632 - i32.const 166 + i32.const 152 i32.const 7 call $~lib/builtins/abort unreachable end - local.get $6 + local.get $4 i32.const 3 i32.add - local.set $6 - local.get $4 + local.set $4 + local.get $6 i32.const 128 i32.lt_u if @@ -2780,13 +2779,13 @@ if (result i32) i32.const 0 else - local.get $4 + local.get $6 i32.const 35 i32.sub i32.const 30 i32.lt_u if (result i32) - local.get $4 + local.get $6 i32.const 3561 i32.add i32.load16_u @@ -2795,31 +2794,29 @@ end end if - local.get $6 + i32.const 37 + local.set $6 + local.get $4 i32.const 2 i32.sub - local.set $6 - i32.const 37 local.set $4 end else - local.get $4 - local.set $5 i32.const 1 - local.get $4 - i32.const 128 + local.get $6 + i32.const 24 + i32.shl + i32.const -1 + i32.xor + i32.clz + i32.const 0 + local.get $6 + i32.const 192 i32.sub - i32.const 128 + i32.const 55 i32.le_u - if (result i32) - local.get $5 - i32.const 3498 - i32.add - i32.load8_u - else - i32.const 0 - end - local.tee $5 + select + local.tee $8 i32.const 17 i32.mul i32.const 2 @@ -2827,27 +2824,27 @@ i32.const 1 i32.sub i32.shl - local.set $8 - local.get $4 + local.set $5 + local.get $6 i32.const 128 - local.get $5 + local.get $8 i32.shr_u i32.const 1 i32.sub i32.const 0 - local.get $5 + local.get $8 select i32.and - local.set $4 + local.set $6 loop $while-continue|2 - local.get $5 + local.get $8 i32.const 1 i32.sub - local.tee $5 + local.tee $8 if block $while-break|2 local.get $2 - local.get $6 + local.get $4 i32.const 2 i32.add i32.le_u @@ -2855,7 +2852,7 @@ i32.const 1 else local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.shl i32.add @@ -2867,7 +2864,7 @@ i32.const 1 else local.get $1 - local.get $6 + local.get $4 i32.const 1 i32.add i32.const 1 @@ -2880,15 +2877,15 @@ if i32.const 1584 i32.const 1632 - i32.const 189 + i32.const 175 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $6 + local.get $4 i32.const 3 i32.add - local.set $6 + local.set $4 local.get $9 i32.const 192 i32.and @@ -2896,70 +2893,70 @@ i32.ne if i32.const 0 - local.set $4 + local.set $6 br $while-break|2 end local.get $9 i32.const 63 i32.and - local.get $4 + local.get $6 i32.const 6 i32.shl i32.or - local.set $4 + local.set $6 br $while-continue|2 end end end i32.const 1 - local.get $4 + local.get $6 i32.const 57344 i32.lt_u i32.const 0 - local.get $4 + local.get $6 i32.const 55296 i32.ge_u select i32.const 1 - local.get $4 + local.get $6 i32.const 1114111 i32.gt_u i32.const 1 - local.get $8 + local.get $5 i32.const -1 i32.eq - local.get $4 - local.get $8 - i32.lt_u + local.get $5 + local.get $6 + i32.gt_u select select select if i32.const 1584 i32.const 1632 - i32.const 200 + i32.const 186 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $6 i32.const 65536 i32.ge_u if local.get $0 local.get $7 i32.add - local.get $4 + local.get $6 i32.const 65536 i32.sub - local.tee $4 + local.tee $6 i32.const 1023 i32.and i32.const 56320 i32.or i32.const 16 i32.shl - local.get $4 + local.get $6 i32.const 10 i32.shr_u i32.const 55296 @@ -2976,7 +2973,7 @@ local.get $0 local.get $7 i32.add - local.get $4 + local.get $6 i32.store16 local.get $7 i32.const 2 @@ -2994,7 +2991,7 @@ if i32.const 0 i32.const 1632 - i32.const 216 + i32.const 202 i32.const 3 call $~lib/builtins/abort unreachable @@ -3096,11 +3093,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 4492 + i32.const 4364 i32.lt_s if - i32.const 20896 - i32.const 20944 + i32.const 20768 + i32.const 20816 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3115,7 +3112,7 @@ memory.size i32.const 16 i32.shl - i32.const 20876 + i32.const 20748 i32.sub i32.const 1 i32.shr_u @@ -3832,19 +3829,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3776 + i32.const 3648 i32.store offset=8 - i32.const 3776 + i32.const 3648 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3808 + i32.const 3680 i32.store offset=4 local.get $0 - i32.const 3808 + i32.const 3680 call $~lib/string/String.__eq i32.eqz if @@ -3856,19 +3853,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3840 + i32.const 3712 i32.store offset=8 - i32.const 3840 + i32.const 3712 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3872 + i32.const 3744 i32.store offset=4 local.get $0 - i32.const 3872 + i32.const 3744 call $~lib/string/String.__eq i32.eqz if @@ -3880,19 +3877,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3904 + i32.const 3776 i32.store offset=8 - i32.const 3904 + i32.const 3776 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3904 + i32.const 3776 i32.store offset=4 local.get $0 - i32.const 3904 + i32.const 3776 call $~lib/string/String.__eq i32.eqz if @@ -3928,19 +3925,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3936 + i32.const 3808 i32.store offset=8 - i32.const 3936 + i32.const 3808 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4016 + i32.const 3888 i32.store offset=4 local.get $0 - i32.const 4016 + i32.const 3888 call $~lib/string/String.__eq i32.eqz if @@ -3952,19 +3949,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4064 + i32.const 3936 i32.store offset=8 - i32.const 4064 + i32.const 3936 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4016 + i32.const 3888 i32.store offset=4 local.get $0 - i32.const 4016 + i32.const 3888 call $~lib/string/String.__eq i32.eqz if @@ -3976,9 +3973,9 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4144 + i32.const 4016 i32.store offset=8 - i32.const 4144 + i32.const 4016 call $~lib/uri/decodeURIComponent local.set $0 global.get $~lib/memory/__stack_pointer @@ -4072,19 +4069,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3776 + i32.const 3648 i32.store offset=8 - i32.const 3776 + i32.const 3648 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3776 + i32.const 3648 i32.store offset=4 local.get $0 - i32.const 3776 + i32.const 3648 call $~lib/string/String.__eq i32.eqz if @@ -4096,19 +4093,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4272 + i32.const 4144 i32.store offset=8 - i32.const 4272 + i32.const 4144 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4304 + i32.const 4176 i32.store offset=4 local.get $0 - i32.const 4304 + i32.const 4176 call $~lib/string/String.__eq i32.eqz if @@ -4120,19 +4117,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4336 + i32.const 4208 i32.store offset=8 - i32.const 4336 + i32.const 4208 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4368 + i32.const 4240 i32.store offset=4 local.get $0 - i32.const 4368 + i32.const 4240 call $~lib/string/String.__eq i32.eqz if @@ -4144,19 +4141,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3904 + i32.const 3776 i32.store offset=8 - i32.const 3904 + i32.const 3776 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3904 + i32.const 3776 i32.store offset=4 local.get $0 - i32.const 3904 + i32.const 3776 call $~lib/string/String.__eq i32.eqz if @@ -4192,19 +4189,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 3936 + i32.const 3808 i32.store offset=8 - i32.const 3936 + i32.const 3808 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 3936 + i32.const 3808 i32.store offset=4 local.get $0 - i32.const 3936 + i32.const 3808 call $~lib/string/String.__eq i32.eqz if @@ -4240,19 +4237,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4400 + i32.const 4272 i32.store offset=8 - i32.const 4400 + i32.const 4272 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4400 + i32.const 4272 i32.store offset=4 local.get $0 - i32.const 4400 + i32.const 4272 call $~lib/string/String.__eq i32.eqz if @@ -4264,19 +4261,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4448 + i32.const 4320 i32.store offset=8 - i32.const 4448 + i32.const 4320 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4448 + i32.const 4320 i32.store offset=4 local.get $0 - i32.const 4448 + i32.const 4320 call $~lib/string/String.__eq i32.eqz if @@ -4288,19 +4285,19 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 4144 + i32.const 4016 i32.store offset=8 - i32.const 4144 + i32.const 4016 call $~lib/uri/decodeURI local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 i32.store global.get $~lib/memory/__stack_pointer - i32.const 4144 + i32.const 4016 i32.store offset=4 local.get $0 - i32.const 4144 + i32.const 4016 call $~lib/string/String.__eq i32.eqz if @@ -4311,7 +4308,7 @@ call $~lib/builtins/abort unreachable end - i32.const 20876 + i32.const 20748 global.set $~lib/memory/__stack_pointer global.get $~lib/rt/itcms/state i32.const 0 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index b62b44433f..441eb4f88f 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -63,23 +63,22 @@ (data (i32.const 2508) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00 \00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2540) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\000\00\00\00\00\00\00\00") (data (i32.const 2572) "\01\01\00\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\00\01\00\01\01") - (data (i32.const 2602) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\04\04\04\04\04\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2732) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") - (data (i32.const 2764) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2796) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\005\00E\00\00\00\00\00\00\00") - (data (i32.const 2828) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00^\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2860) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\d8\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 2892) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") - (data (i32.const 2972) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") - (data (i32.const 3020) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") - (data (i32.const 3100) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") - (data (i32.const 3228) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00D\00F\00%\008\000\00") - (data (i32.const 3260) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\c0\07\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 3292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F\00") - (data (i32.const 3324) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\bf\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 3356) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00\f7\00\b8\00W\00\ef\00\0f\00\f4\00V\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 3404) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\f4\00\b8\00\ef\00\00\00\00\00\00\00") - (data (i32.const 3440) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2604) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\002\006\00\00\00\00\00\00\00") + (data (i32.const 2636) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00&\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2668) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00%\005\00E\00\00\00\00\00\00\00") + (data (i32.const 2700) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00^\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2732) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\00\d8\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2764) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00b\00%\002\00f\00%\003\00f\00%\003\00a\00%\004\000\00%\003\00d\00%\002\00b\00%\002\004\00%\002\00c\00%\002\003\00") + (data (i32.const 2844) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00;\00/\00?\00:\00@\00=\00+\00$\00,\00#\00\00\00\00\00\00\00\00\00") + (data (i32.const 2892) "L\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00<\00\00\00%\003\00B\00%\002\00F\00%\003\00F\00%\003\00A\00%\004\000\00%\003\00D\00%\002\00B\00%\002\004\00%\002\00C\00%\002\003\00") + (data (i32.const 2972) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00h\00\00\00h\00t\00t\00p\00:\00%\002\00F\00%\002\00F\00e\00n\00.\00w\00i\00k\00i\00p\00e\00d\00i\00a\00.\00o\00r\00g\00/\00w\00i\00k\00i\00/\00U\00T\00F\00-\008\00%\002\003\00D\00e\00s\00c\00r\00i\00p\00t\00i\00o\00n\00\00\00\00\00") + (data (i32.const 3100) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00D\00F\00%\008\000\00") + (data (i32.const 3132) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\c0\07\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3164) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00%\00C\002\00%\00B\00F\00") + (data (i32.const 3196) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\02\00\00\00\bf\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3228) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0e\00\00\00\f7\00\b8\00W\00\ef\00\0f\00\f4\00V\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 3276) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\f4\00\b8\00\ef\00\00\00\00\00\00\00") + (data (i32.const 3312) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -96,11 +95,10 @@ (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) - (global $~lib/util/uri/UTF8_BYTE_LEN i32 (i32.const 2602)) - (global $~lib/rt/__rtti_base i32 (i32.const 3440)) - (global $~lib/memory/__data_end i32 (i32.const 3468)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19852)) - (global $~lib/memory/__heap_base i32 (i32.const 19852)) + (global $~lib/rt/__rtti_base i32 (i32.const 3312)) + (global $~lib/memory/__data_end i32 (i32.const 3340)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19724)) + (global $~lib/memory/__heap_base i32 (i32.const 19724)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) @@ -3913,7 +3911,7 @@ if i32.const 560 i32.const 608 - i32.const 86 + i32.const 72 i32.const 9 call $~lib/builtins/abort unreachable @@ -3928,7 +3926,7 @@ if i32.const 560 i32.const 608 - i32.const 90 + i32.const 76 i32.const 11 call $~lib/builtins/abort unreachable @@ -3956,7 +3954,7 @@ if i32.const 560 i32.const 608 - i32.const 94 + i32.const 80 i32.const 11 call $~lib/builtins/abort unreachable @@ -4548,7 +4546,7 @@ if i32.const 560 i32.const 608 - i32.const 166 + i32.const 152 i32.const 7 call $~lib/builtins/abort unreachable @@ -4593,29 +4591,22 @@ local.set $4 end else - block $~lib/util/uri/utf8LenFromUpperByte|inlined.0 (result i32) - local.get $7 - local.set $9 - i32.const 0 - i32.const 1 - i32.gt_s - drop + local.get $7 + local.set $9 + local.get $9 + i32.const 192 + i32.sub + i32.const 55 + i32.le_u + if (result i32) local.get $9 - i32.const 128 - i32.sub - i32.const 128 - i32.le_u - if (result i32) - global.get $~lib/util/uri/UTF8_BYTE_LEN - local.get $9 - i32.const 128 - i32.sub - i32.add - i32.load8_u - else - i32.const 0 - end - br $~lib/util/uri/utf8LenFromUpperByte|inlined.0 + i32.const 24 + i32.shl + i32.const -1 + i32.xor + i32.clz + else + i32.const 0 end local.set $9 i32.const 1 @@ -4686,7 +4677,7 @@ if i32.const 560 i32.const 608 - i32.const 189 + i32.const 175 i32.const 11 call $~lib/builtins/abort unreachable @@ -4751,7 +4742,7 @@ if i32.const 560 i32.const 608 - i32.const 200 + i32.const 186 i32.const 9 call $~lib/builtins/abort unreachable @@ -4814,7 +4805,7 @@ if i32.const 0 i32.const 608 - i32.const 216 + i32.const 202 i32.const 3 call $~lib/builtins/abort unreachable @@ -4988,8 +4979,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19872 - i32.const 19920 + i32.const 19744 + i32.const 19792 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -5846,7 +5837,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2752 + i32.const 2624 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5858,7 +5849,7 @@ local.get $0 i32.store local.get $0 - i32.const 2784 + i32.const 2656 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5874,7 +5865,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2816 + i32.const 2688 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5886,7 +5877,7 @@ local.get $0 i32.store local.get $0 - i32.const 2848 + i32.const 2720 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5902,7 +5893,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2880 + i32.const 2752 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5914,7 +5905,7 @@ local.get $0 i32.store local.get $0 - i32.const 2880 + i32.const 2752 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5958,7 +5949,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2912 + i32.const 2784 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5970,7 +5961,7 @@ local.get $0 i32.store local.get $0 - i32.const 2992 + i32.const 2864 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5986,7 +5977,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3040 + i32.const 2912 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -5998,7 +5989,7 @@ local.get $0 i32.store local.get $0 - i32.const 2992 + i32.const 2864 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6014,7 +6005,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3120 + i32.const 2992 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6126,7 +6117,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2752 + i32.const 2624 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6138,7 +6129,7 @@ local.get $0 i32.store local.get $0 - i32.const 2752 + i32.const 2624 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6154,7 +6145,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3248 + i32.const 3120 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6166,7 +6157,7 @@ local.get $0 i32.store local.get $0 - i32.const 3280 + i32.const 3152 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6182,7 +6173,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3312 + i32.const 3184 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6194,7 +6185,7 @@ local.get $0 i32.store local.get $0 - i32.const 3344 + i32.const 3216 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6210,7 +6201,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2880 + i32.const 2752 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6222,7 +6213,7 @@ local.get $0 i32.store local.get $0 - i32.const 2880 + i32.const 2752 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6266,7 +6257,7 @@ call $~lib/builtins/abort unreachable end - i32.const 2912 + i32.const 2784 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6278,7 +6269,7 @@ local.get $0 i32.store local.get $0 - i32.const 2912 + i32.const 2784 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6322,7 +6313,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3376 + i32.const 3248 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6334,7 +6325,7 @@ local.get $0 i32.store local.get $0 - i32.const 3376 + i32.const 3248 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6350,7 +6341,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3424 + i32.const 3296 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6362,7 +6353,7 @@ local.get $0 i32.store local.get $0 - i32.const 3424 + i32.const 3296 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6378,7 +6369,7 @@ call $~lib/builtins/abort unreachable end - i32.const 3120 + i32.const 2992 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -6390,7 +6381,7 @@ local.get $0 i32.store local.get $0 - i32.const 3120 + i32.const 2992 local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 From 81e5a13a161320a649543b16207f53a34acd790b Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Mar 2021 12:53:19 +0300 Subject: [PATCH 77/87] better comments --- std/assembly/util/uri.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index ad8e10c2d5..1997ce45a8 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -160,9 +160,9 @@ export function decode(dst: usize, src: usize, len: usize, component: bool): usi } else { // decode UTF-8 sequence let nb = utf8LenFromUpperByte(ch); - // lo = 2 => 0x80, 3 => 0x800, 4 => 0x10000, _ => -1 + // minimal surrogate: 2 => 0x80, 3 => 0x800, 4 => 0x10000, _ => -1 let lo: u32 = 1 << (17 * nb >> 2) - 1; - // ch &= 2 => 31, 3 => 15, 4 => 7, _ => 0 + // mask: 2 => 31, 3 => 15, 4 => 7, _ => 0 ch &= nb ? (0x80 >> nb) - 1 : 0; while (--nb != 0) { @@ -236,6 +236,7 @@ function loadHex(src: usize, offset: usize): u32 { // @ts-ignore: decorator @inline function utf8LenFromUpperByte(c0: u32): u32 { + // same as // if (c0 - 0xC0 <= 0xDF - 0xC0) return 2; // if (c0 - 0xE0 <= 0xEF - 0xE0) return 3; // if (c0 - 0xF0 <= 0xF7 - 0xF0) return 4; From 3250ef86fca1ece1d4387d4b07653049e9d8562a Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sun, 28 Mar 2021 12:56:38 +0300 Subject: [PATCH 78/87] refactor --- std/assembly/util/uri.ts | 4 ++-- tests/compiler/std/uri.optimized.wat | 4 ++-- tests/compiler/std/uri.untouched.wat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 1997ce45a8..8a26984522 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -241,14 +241,14 @@ function loadHex(src: usize, offset: usize): u32 { // if (c0 - 0xE0 <= 0xEF - 0xE0) return 3; // if (c0 - 0xF0 <= 0xF7 - 0xF0) return 4; // return 0; - return c0 - 0xC0 <= 55 + return c0 - 0xC0 < 56 ? clz(~(c0 << 24)) : 0; } // @ts-ignore: decorator @inline function isReserved(ch: u32): bool { - return (ch - 35) < 30 + return ch - 35 < 30 ? load(URI_RESERVED + (ch - 35)) : false; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 79c64b8107..6715c7105e 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2813,8 +2813,8 @@ local.get $6 i32.const 192 i32.sub - i32.const 55 - i32.le_u + i32.const 56 + i32.lt_u select local.tee $8 i32.const 17 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 441eb4f88f..8a5b63cf87 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4596,8 +4596,8 @@ local.get $9 i32.const 192 i32.sub - i32.const 55 - i32.le_u + i32.const 56 + i32.lt_u if (result i32) local.get $9 i32.const 24 From 91be0b2cc6eb1d0c9c018746b64de09333e18d5e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Mar 2021 15:52:36 +0300 Subject: [PATCH 79/87] refactoring --- std/assembly/uri.ts | 20 +- std/assembly/util/uri.ts | 10 +- tests/compiler/std/uri.optimized.wat | 630 ++++++++++----------- tests/compiler/std/uri.untouched.wat | 813 ++++++++++++--------------- 4 files changed, 668 insertions(+), 805 deletions(-) diff --git a/std/assembly/uri.ts b/std/assembly/uri.ts index 5e4a2c0d57..1c73edd251 100644 --- a/std/assembly/uri.ts +++ b/std/assembly/uri.ts @@ -1,29 +1,17 @@ import { encode, decode, URI_UNSAFE, URL_UNSAFE } from "./util/uri"; export function encodeURI(str: string): string { - var len = str.length; - if (!len) return str; - var result = __new(len << 1, idof()); - return changetype(encode(result, changetype(str), len, URI_UNSAFE)); + return changetype(encode(changetype(str), str.length, URI_UNSAFE)); } export function decodeURI(str: string): string { - var len = str.length; - if (!len) return str; - var result = __new(len << 1, idof()); - return changetype(decode(result, changetype(str), len, false)); + return changetype(decode(changetype(str), str.length, false)); } export function encodeURIComponent(str: string): string { - var len = str.length; - if (!len) return str; - var result = __new(len << 1, idof()); - return changetype(encode(result, changetype(str), len, URL_UNSAFE)); + return changetype(encode(changetype(str), str.length, URL_UNSAFE)); } export function decodeURIComponent(str: string): string { - var len = str.length; - if (!len) return str; - var result = __new(len << 1, idof()); - return changetype(decode(result, changetype(str), len, true)); + return changetype(decode(changetype(str), str.length, true)); } diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 8a26984522..009b695056 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -33,8 +33,11 @@ import { CharCode } from "./string"; 1, /* skip 191 always set to '0' tail slots */ ]); -export function encode(dst: usize, src: usize, len: usize, table: usize): usize { +export function encode(src: usize, len: usize, table: usize): usize { + if (!len) return src; + var i: usize = 0, offset: usize = 0, outSize = len << 1; + var dst = __new(outSize, idof()); while (i < len) { let org = i; @@ -120,8 +123,11 @@ export function encode(dst: usize, src: usize, len: usize, table: usize): usize return dst; } -export function decode(dst: usize, src: usize, len: usize, component: bool): usize { +export function decode(src: usize, len: usize, component: bool): usize { + if (!len) return src; + var i: usize = 0, offset: usize = 0, org: usize, ch: u32 = 0; + var dst = __new(len << 1, idof()); while (i < len) { org = i; diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 6715c7105e..b60ad94cd3 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -5,27 +5,27 @@ (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_=>_none (func (param i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01") - (data (i32.const 1068) "<") - (data (i32.const 1080) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") - (data (i32.const 1132) "<") - (data (i32.const 1144) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") - (data (i32.const 1260) "<") - (data (i32.const 1272) "\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") - (data (i32.const 1324) ",") - (data (i32.const 1336) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") - (data (i32.const 1404) "<") - (data (i32.const 1416) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") - (data (i32.const 1469) "\01\01\01\01\01\00\00\00\00\01\01\00\00\01") - (data (i32.const 1493) "\01\01\01\01\01\01\01") - (data (i32.const 1526) "\01\01\01\01\00\01") - (data (i32.const 1558) "\01\01\01") + (data (i32.const 1069) "\01\01\01\01\01\00\00\00\00\01\01\00\00\01") + (data (i32.const 1093) "\01\01\01\01\01\01\01") + (data (i32.const 1126) "\01\01\01\01\00\01") + (data (i32.const 1158) "\01\01\01") + (data (i32.const 1164) "<") + (data (i32.const 1176) "\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data (i32.const 1228) "<") + (data (i32.const 1240) "\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data (i32.const 1356) "<") + (data (i32.const 1368) "\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data (i32.const 1420) ",") + (data (i32.const 1432) "\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data (i32.const 1500) "<") + (data (i32.const 1512) "\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") (data (i32.const 1564) ",") (data (i32.const 1576) "\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d") (data (i32.const 1612) "<") @@ -165,9 +165,9 @@ (func $~lib/rt/itcms/visitRoots (local $0 i32) (local $1 i32) - i32.const 1280 + i32.const 1376 call $~lib/rt/itcms/__visit - i32.const 1088 + i32.const 1184 call $~lib/rt/itcms/__visit i32.const 1584 call $~lib/rt/itcms/__visit @@ -190,7 +190,7 @@ i32.ne if i32.const 0 - i32.const 1152 + i32.const 1248 i32.const 159 i32.const 16 call $~lib/builtins/abort @@ -262,7 +262,7 @@ i32.eqz if i32.const 0 - i32.const 1152 + i32.const 1248 i32.const 147 i32.const 30 call $~lib/builtins/abort @@ -289,7 +289,7 @@ i32.eqz if i32.const 0 - i32.const 1152 + i32.const 1248 i32.const 127 i32.const 18 call $~lib/builtins/abort @@ -303,7 +303,7 @@ i32.eqz if i32.const 0 - i32.const 1152 + i32.const 1248 i32.const 131 i32.const 16 call $~lib/builtins/abort @@ -331,8 +331,8 @@ i32.load i32.gt_u if - i32.const 1280 - i32.const 1344 + i32.const 1376 + i32.const 1440 i32.const 22 i32.const 28 call $~lib/builtins/abort @@ -392,8 +392,8 @@ i32.eqz if i32.const 0 - i32.const 1424 - i32.const 273 + i32.const 1520 + i32.const 268 i32.const 14 call $~lib/builtins/abort unreachable @@ -402,18 +402,12 @@ i32.const -4 i32.and local.tee $2 - i32.const 1073741820 - i32.lt_u - i32.const 0 - local.get $2 i32.const 12 - i32.ge_u - select - i32.eqz + i32.lt_u if i32.const 0 - i32.const 1424 - i32.const 275 + i32.const 1520 + i32.const 270 i32.const 14 call $~lib/builtins/abort unreachable @@ -427,12 +421,19 @@ i32.shr_u local.set $2 else - local.get $2 i32.const 31 local.get $2 + i32.const 1073741820 + local.get $2 + i32.const 1073741820 + i32.lt_u + select + local.tee $2 i32.clz i32.sub - local.tee $3 + local.set $3 + local.get $2 + local.get $3 i32.const 4 i32.sub i32.shr_u @@ -455,8 +456,8 @@ i32.eqz if i32.const 0 - i32.const 1424 - i32.const 288 + i32.const 1520 + i32.const 284 i32.const 14 call $~lib/builtins/abort unreachable @@ -541,13 +542,11 @@ (local $4 i32) (local $5 i32) (local $6 i32) - (local $7 i32) - (local $8 i32) local.get $1 i32.eqz if i32.const 0 - i32.const 1424 + i32.const 1520 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -555,13 +554,13 @@ end local.get $1 i32.load - local.tee $4 + local.tee $3 i32.const 1 i32.and i32.eqz if i32.const 0 - i32.const 1424 + i32.const 1520 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -575,15 +574,17 @@ i32.const -4 i32.and i32.add - local.tee $5 + local.tee $4 i32.load local.tee $2 i32.const 1 i32.and if + local.get $0 local.get $4 - i32.const -4 - i32.and + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 i32.const 4 i32.add local.get $2 @@ -591,34 +592,20 @@ i32.and i32.add local.tee $3 - i32.const 1073741820 - i32.lt_u - if - local.get $0 - local.get $5 - call $~lib/rt/tlsf/removeBlock - local.get $1 - local.get $3 - local.get $4 - i32.const 3 - i32.and - i32.or - local.tee $4 - i32.store - local.get $1 - i32.const 4 - i32.add - local.get $1 - i32.load - i32.const -4 - i32.and - i32.add - local.tee $5 - i32.load - local.set $2 - end + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.set $2 end - local.get $4 + local.get $3 i32.const 2 i32.and if @@ -626,76 +613,54 @@ i32.const 4 i32.sub i32.load - local.tee $3 + local.tee $1 i32.load - local.tee $7 + local.tee $6 i32.const 1 i32.and i32.eqz if i32.const 0 - i32.const 1424 - i32.const 224 + i32.const 1520 + i32.const 221 i32.const 16 call $~lib/builtins/abort unreachable end - local.get $7 - i32.const -4 - i32.and + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $6 i32.const 4 i32.add - local.get $4 + local.get $3 i32.const -4 i32.and i32.add - local.tee $8 - i32.const 1073741820 - i32.lt_u - if (result i32) - local.get $0 - local.get $3 - call $~lib/rt/tlsf/removeBlock - local.get $3 - local.get $8 - local.get $7 - i32.const 3 - i32.and - i32.or - local.tee $4 - i32.store - local.get $3 - else - local.get $1 - end - local.set $1 + local.tee $3 + i32.store end - local.get $5 + local.get $4 local.get $2 i32.const 2 i32.or i32.store - local.get $4 + local.get $3 i32.const -4 i32.and local.tee $3 - i32.const 1073741820 - i32.lt_u - i32.const 0 - local.get $3 i32.const 12 - i32.ge_u - select - i32.eqz + i32.lt_u if i32.const 0 - i32.const 1424 - i32.const 239 + i32.const 1520 + i32.const 233 i32.const 14 call $~lib/builtins/abort unreachable end - local.get $5 + local.get $4 local.get $3 local.get $1 i32.const 4 @@ -704,13 +669,13 @@ i32.ne if i32.const 0 - i32.const 1424 - i32.const 240 + i32.const 1520 + i32.const 234 i32.const 14 call $~lib/builtins/abort unreachable end - local.get $5 + local.get $4 i32.const 4 i32.sub local.get $1 @@ -718,49 +683,53 @@ local.get $3 i32.const 256 i32.lt_u - if + if (result i32) local.get $3 i32.const 4 i32.shr_u - local.set $3 else - local.get $3 i32.const 31 local.get $3 + i32.const 1073741820 + local.get $3 + i32.const 1073741820 + i32.lt_u + select + local.tee $3 i32.clz i32.sub local.tee $4 + i32.const 7 + i32.sub + local.set $5 + local.get $3 + local.get $4 i32.const 4 i32.sub i32.shr_u i32.const 16 i32.xor - local.set $3 - local.get $4 - i32.const 7 - i32.sub - local.set $6 end - local.get $3 + local.tee $3 i32.const 16 i32.lt_u i32.const 0 - local.get $6 + local.get $5 i32.const 23 i32.lt_u select i32.eqz if i32.const 0 - i32.const 1424 - i32.const 256 + i32.const 1520 + i32.const 251 i32.const 14 call $~lib/builtins/abort unreachable end local.get $0 local.get $3 - local.get $6 + local.get $5 i32.const 4 i32.shl i32.add @@ -783,7 +752,7 @@ end local.get $0 local.get $3 - local.get $6 + local.get $5 i32.const 4 i32.shl i32.add @@ -796,12 +765,12 @@ local.get $0 i32.load i32.const 1 - local.get $6 + local.get $5 i32.shl i32.or i32.store local.get $0 - local.get $6 + local.get $5 i32.const 2 i32.shl i32.add @@ -822,8 +791,8 @@ i32.gt_u if i32.const 0 - i32.const 1424 - i32.const 381 + i32.const 1520 + i32.const 377 i32.const 14 call $~lib/builtins/abort unreachable @@ -850,8 +819,8 @@ i32.lt_u if i32.const 0 - i32.const 1424 - i32.const 388 + i32.const 1520 + i32.const 384 i32.const 16 call $~lib/builtins/abort unreachable @@ -878,8 +847,8 @@ i32.lt_u if i32.const 0 - i32.const 1424 - i32.const 401 + i32.const 1520 + i32.const 397 i32.const 5 call $~lib/builtins/abort unreachable @@ -1164,7 +1133,7 @@ i32.ne if i32.const 0 - i32.const 1152 + i32.const 1248 i32.const 228 i32.const 20 call $~lib/builtins/abort @@ -1226,8 +1195,8 @@ i32.eqz if i32.const 0 - i32.const 1424 - i32.const 565 + i32.const 1520 + i32.const 559 i32.const 3 call $~lib/builtins/abort unreachable @@ -1314,8 +1283,8 @@ i32.eqz if i32.const 0 - i32.const 1424 - i32.const 334 + i32.const 1520 + i32.const 330 i32.const 14 call $~lib/builtins/abort unreachable @@ -1366,8 +1335,8 @@ i32.eqz if i32.const 0 - i32.const 1424 - i32.const 347 + i32.const 1520 + i32.const 343 i32.const 18 call $~lib/builtins/abort unreachable @@ -1396,9 +1365,9 @@ i32.const 1073741820 i32.ge_u if - i32.const 1088 - i32.const 1424 - i32.const 462 + i32.const 1184 + i32.const 1520 + i32.const 458 i32.const 30 call $~lib/builtins/abort unreachable @@ -1488,8 +1457,8 @@ i32.eqz if i32.const 0 - i32.const 1424 - i32.const 500 + i32.const 1520 + i32.const 496 i32.const 16 call $~lib/builtins/abort unreachable @@ -1503,8 +1472,8 @@ i32.gt_u if i32.const 0 - i32.const 1424 - i32.const 502 + i32.const 1520 + i32.const 498 i32.const 14 call $~lib/builtins/abort unreachable @@ -1522,8 +1491,8 @@ i32.and if i32.const 0 - i32.const 1424 - i32.const 361 + i32.const 1520 + i32.const 357 i32.const 14 call $~lib/builtins/abort unreachable @@ -1751,8 +1720,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 1088 - i32.const 1152 + i32.const 1184 + i32.const 1248 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -2081,29 +2050,39 @@ local.get $2 i32.store offset=2 ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) (local $9 i32) - local.get $2 + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 i32.const 1 i32.shl - local.set $8 + local.tee $8 + i32.const 1 + call $~lib/rt/itcms/__new + local.set $3 loop $while-continue|0 - local.get $2 - local.get $5 + local.get $1 + local.get $6 i32.gt_u if block $while-break|0 - local.get $5 - local.set $6 + local.get $6 + local.set $5 loop $do-continue|1 block $do-break|1 - local.get $1 - local.get $5 + local.get $0 + local.get $6 i32.const 1 i32.shl i32.add @@ -2114,98 +2093,98 @@ i32.const 94 i32.ge_u br_if $do-break|1 - local.get $3 + local.get $2 local.get $4 i32.const 33 i32.sub i32.add i32.load8_u br_if $do-break|1 - local.get $2 - local.get $5 + local.get $1 + local.get $6 i32.const 1 i32.add - local.tee $5 + local.tee $6 i32.gt_u br_if $do-continue|1 end end local.get $5 local.get $6 - i32.gt_u + i32.lt_u if local.get $8 - local.get $9 - local.get $5 + local.get $7 local.get $6 + local.get $5 i32.sub i32.const 1 i32.shl - local.tee $7 + local.tee $9 i32.add i32.lt_u if - local.get $0 + local.get $3 local.get $7 local.get $9 i32.add local.tee $8 call $~lib/rt/itcms/__renew - local.set $0 + local.set $3 end - local.get $7 + local.get $9 i32.const 2 i32.eq if - local.get $0 - local.get $9 + local.get $3 + local.get $7 i32.add - local.get $1 - local.get $6 + local.get $0 + local.get $5 i32.const 1 i32.shl i32.add i32.load16_u i32.store16 else - local.get $7 + local.get $9 i32.const 4 i32.eq if - local.get $0 - local.get $9 + local.get $3 + local.get $7 i32.add - local.get $1 - local.get $6 + local.get $0 + local.get $5 i32.const 1 i32.shl i32.add i32.load i32.store else - local.get $0 - local.get $9 + local.get $3 + local.get $7 i32.add - local.get $1 - local.get $6 + local.get $0 + local.get $5 i32.const 1 i32.shl i32.add - local.get $7 + local.get $9 call $~lib/memory/memory.copy end end local.get $7 local.get $9 i32.add - local.set $9 - local.get $2 - local.get $5 + local.set $7 + local.get $1 + local.get $6 i32.le_u br_if $while-break|0 end local.get $8 - local.get $9 + local.get $7 i32.const 6 i32.const 24 local.get $4 @@ -2223,7 +2202,7 @@ if i32.const 1584 i32.const 1632 - i32.const 72 + i32.const 75 i32.const 9 call $~lib/builtins/abort unreachable @@ -2232,43 +2211,43 @@ i32.const 56319 i32.le_u if (result i32) - local.get $2 - local.get $5 + local.get $1 + local.get $6 i32.le_u if i32.const 1584 i32.const 1632 - i32.const 76 + i32.const 79 i32.const 11 call $~lib/builtins/abort unreachable end i32.const 1 - local.get $1 - local.get $5 + local.get $0 + local.get $6 i32.const 1 i32.add - local.tee $5 + local.tee $6 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $6 + local.tee $5 i32.const 57343 i32.gt_u - local.get $6 + local.get $5 i32.const 56320 i32.lt_u select if i32.const 1584 i32.const 1632 - i32.const 80 + i32.const 83 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $6 + local.get $5 i32.const 1023 i32.and local.get $4 @@ -2289,28 +2268,28 @@ i32.lt_u select i32.add - local.tee $6 + local.tee $5 i32.lt_u if - local.get $0 - local.get $6 + local.get $3 + local.get $5 i32.const 1 i32.shl - local.get $6 - local.get $2 + local.get $5 + local.get $1 i32.const 1 i32.gt_u select local.tee $8 call $~lib/rt/itcms/__renew - local.set $0 + local.set $3 end local.get $4 i32.const 128 i32.lt_u if - local.get $0 - local.get $9 + local.get $3 + local.get $7 local.get $4 call $~lib/util/uri/storeHex else @@ -2318,8 +2297,8 @@ i32.const 2048 i32.lt_u if - local.get $0 - local.get $9 + local.get $3 + local.get $7 local.get $4 i32.const 6 i32.shr_u @@ -2327,36 +2306,36 @@ i32.or call $~lib/util/uri/storeHex else - local.get $0 + local.get $3 local.get $4 i32.const 65536 i32.lt_u if (result i32) - local.get $0 - local.get $9 + local.get $3 + local.get $7 local.get $4 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $9 + local.get $7 i32.const 6 i32.add else - local.get $0 - local.get $9 + local.get $3 + local.get $7 local.get $4 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex - local.get $0 - local.get $9 + local.get $3 + local.get $7 i32.const 6 i32.add - local.tee $6 + local.tee $5 local.get $4 i32.const 12 i32.shr_u @@ -2365,11 +2344,11 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $6 + local.get $5 i32.const 6 i32.add end - local.tee $9 + local.tee $7 local.get $4 i32.const 6 i32.shr_u @@ -2379,11 +2358,11 @@ i32.or call $~lib/util/uri/storeHex end - local.get $0 - local.get $9 + local.get $3 + local.get $7 i32.const 6 i32.add - local.tee $9 + local.tee $7 local.get $4 i32.const 63 i32.and @@ -2391,51 +2370,38 @@ i32.or call $~lib/util/uri/storeHex end - local.get $9 + local.get $7 i32.const 6 i32.add - local.set $9 - local.get $5 + local.set $7 + local.get $6 i32.const 1 i32.add - local.set $5 + local.set $6 br $while-continue|0 end end end + local.get $7 local.get $8 - local.get $9 - i32.gt_u + i32.lt_u if (result i32) - local.get $0 - local.get $9 + local.get $3 + local.get $7 call $~lib/rt/itcms/__renew else - local.get $0 + local.get $3 end ) (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) + local.get $0 local.get $0 i32.const 20 i32.sub i32.load offset=16 i32.const 1 i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 - i32.const 1468 + i32.const 1068 call $~lib/util/uri/encode ) (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) @@ -2555,26 +2521,13 @@ i32.eqz ) (func $~lib/uri/encodeURI (param $0 i32) (result i32) - (local $1 i32) + local.get $0 local.get $0 i32.const 20 i32.sub i32.load offset=16 i32.const 1 i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 i32.const 3388 call $~lib/util/uri/encode ) @@ -2635,28 +2588,41 @@ select select ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) (local $8 i32) (local $9 i32) + local.get $1 + i32.eqz + if + local.get $0 + return + end + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new + local.set $4 loop $while-continue|0 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.gt_u if block $while-break|0 - local.get $4 + local.get $3 local.set $5 loop $while-continue|1 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.gt_u if (result i32) - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.shl i32.add @@ -2668,18 +2634,18 @@ i32.const 0 end if - local.get $4 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 br $while-continue|1 end end - local.get $4 + local.get $3 local.get $5 i32.gt_u if - local.get $4 + local.get $3 local.get $5 i32.sub i32.const 1 @@ -2688,10 +2654,10 @@ i32.const 2 i32.eq if - local.get $0 + local.get $4 local.get $7 i32.add - local.get $1 + local.get $0 local.get $5 i32.const 1 i32.shl @@ -2703,10 +2669,10 @@ i32.const 4 i32.eq if - local.get $0 + local.get $4 local.get $7 i32.add - local.get $1 + local.get $0 local.get $5 i32.const 1 i32.shl @@ -2714,10 +2680,10 @@ i32.load i32.store else - local.get $0 + local.get $4 local.get $7 i32.add - local.get $1 + local.get $0 local.get $5 i32.const 1 i32.shl @@ -2730,8 +2696,8 @@ local.get $8 i32.add local.set $7 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.le_u br_if $while-break|0 end @@ -2739,8 +2705,8 @@ local.get $6 i32.const 37 i32.ne - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.const 2 i32.add i32.le_u @@ -2748,8 +2714,8 @@ if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.add i32.const 1 @@ -2762,20 +2728,20 @@ if i32.const 1584 i32.const 1632 - i32.const 152 + i32.const 158 i32.const 7 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 + local.set $3 local.get $6 i32.const 128 i32.lt_u if - local.get $3 + local.get $2 if (result i32) i32.const 0 else @@ -2796,10 +2762,10 @@ if i32.const 37 local.set $6 - local.get $4 + local.get $3 i32.const 2 i32.sub - local.set $4 + local.set $3 end else i32.const 1 @@ -2843,16 +2809,16 @@ local.tee $8 if block $while-break|2 - local.get $2 - local.get $4 + local.get $1 + local.get $3 i32.const 2 i32.add i32.le_u if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.shl i32.add @@ -2863,8 +2829,8 @@ if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.add i32.const 1 @@ -2877,15 +2843,15 @@ if i32.const 1584 i32.const 1632 - i32.const 175 + i32.const 181 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 + local.set $3 local.get $9 i32.const 192 i32.and @@ -2934,7 +2900,7 @@ if i32.const 1584 i32.const 1632 - i32.const 186 + i32.const 192 i32.const 9 call $~lib/builtins/abort unreachable @@ -2943,7 +2909,7 @@ i32.const 65536 i32.ge_u if - local.get $0 + local.get $4 local.get $7 i32.add local.get $6 @@ -2970,7 +2936,7 @@ br $while-continue|0 end end - local.get $0 + local.get $4 local.get $7 i32.add local.get $6 @@ -2984,76 +2950,50 @@ end end local.get $7 - local.get $2 + local.get $1 i32.const 1 i32.shl i32.gt_u if i32.const 0 i32.const 1632 - i32.const 202 + i32.const 208 i32.const 3 call $~lib/builtins/abort unreachable end local.get $7 - local.get $2 + local.get $1 i32.const 1 i32.shl i32.lt_u if (result i32) - local.get $0 + local.get $4 local.get $7 call $~lib/rt/itcms/__renew else - local.get $0 + local.get $4 end ) (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) - (local $1 i32) + local.get $0 local.get $0 i32.const 20 i32.sub i32.load offset=16 i32.const 1 i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 i32.const 1 call $~lib/util/uri/decode ) (func $~lib/uri/decodeURI (param $0 i32) (result i32) - (local $1 i32) + local.get $0 local.get $0 i32.const 20 i32.sub i32.load offset=16 i32.const 1 i32.shr_u - local.tee $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.get $0 - local.get $1 i32.const 0 call $~lib/util/uri/decode ) @@ -3117,13 +3057,13 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1200 + i32.const 1296 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 1232 + i32.const 1328 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/toSpace - i32.const 1376 + i32.const 1472 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace global.get $~lib/memory/__stack_pointer diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 8a5b63cf87..938978e218 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -5,23 +5,22 @@ (type $none_=>_none (func)) (type $i32_i32_i32_=>_none (func (param i32 i32 i32))) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) - (type $i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32) (result i32))) + (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) - (type $i32_i32_i32_=>_i32 (func (param i32 i32 i32) (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 44) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") - (data (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 208) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 236) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") - (data (i32.const 300) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data (i32.const 352) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 380) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data (i32.const 444) "\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") + (data (i32.const 44) "\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") + (data (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data (i32.const 204) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 272) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 304) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 332) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data (i32.const 396) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data (i32.const 448) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 476) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 540) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\1a\00\00\00U\00R\00I\00 \00m\00a\00l\00f\00o\00r\00m\00e\00d\00\00\00") (data (i32.const 588) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00 \00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00u\00r\00i\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 652) "0123456789ABCDEF") @@ -80,6 +79,7 @@ (data (i32.const 3276) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\f4\00\b8\00\ef\00\00\00\00\00\00\00") (data (i32.const 3312) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) + (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 44)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) @@ -92,7 +92,6 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 444)) (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) (global $~lib/rt/__rtti_base i32 (i32.const 3312)) @@ -169,7 +168,7 @@ i32.eqz if i32.const 0 - i32.const 128 + i32.const 224 i32.const 159 i32.const 16 call $~lib/builtins/abort @@ -235,7 +234,7 @@ i32.eqz if i32.const 0 - i32.const 128 + i32.const 224 i32.const 127 i32.const 18 call $~lib/builtins/abort @@ -252,7 +251,7 @@ i32.eqz if i32.const 0 - i32.const 128 + i32.const 224 i32.const 131 i32.const 16 call $~lib/builtins/abort @@ -274,8 +273,8 @@ i32.load i32.gt_u if - i32.const 256 - i32.const 320 + i32.const 352 + i32.const 416 i32.const 22 i32.const 28 call $~lib/builtins/abort @@ -341,7 +340,7 @@ i32.eqz if (result i32) i32.const 0 - i32.const 128 + i32.const 224 i32.const 147 i32.const 30 call $~lib/builtins/abort @@ -467,8 +466,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 273 + i32.const 496 + i32.const 268 i32.const 14 call $~lib/builtins/abort unreachable @@ -484,18 +483,11 @@ local.get $3 i32.const 12 i32.ge_u - if (result i32) - local.get $3 - i32.const 1073741820 - i32.lt_u - else - i32.const 0 - end i32.eqz if i32.const 0 - i32.const 400 - i32.const 275 + i32.const 496 + i32.const 270 i32.const 14 call $~lib/builtins/abort unreachable @@ -511,12 +503,21 @@ i32.shr_u local.set $5 else - i32.const 31 local.get $3 + local.tee $6 + i32.const 1073741820 + local.tee $7 + local.get $6 + local.get $7 + i32.lt_u + select + local.set $6 + i32.const 31 + local.get $6 i32.clz i32.sub local.set $4 - local.get $3 + local.get $6 local.get $4 i32.const 4 i32.sub @@ -548,42 +549,42 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 288 + i32.const 496 + i32.const 284 i32.const 14 call $~lib/builtins/abort unreachable end local.get $1 i32.load offset=4 - local.set $6 + local.set $8 local.get $1 i32.load offset=8 - local.set $7 - local.get $6 + local.set $9 + local.get $8 if - local.get $6 - local.get $7 + local.get $8 + local.get $9 call $~lib/rt/tlsf/Block#set:next end - local.get $7 + local.get $9 if - local.get $7 - local.get $6 + local.get $9 + local.get $8 call $~lib/rt/tlsf/Block#set:prev end local.get $1 local.get $0 local.set $10 local.get $4 - local.set $9 + local.set $6 local.get $5 - local.set $8 + local.set $7 local.get $10 - local.get $9 + local.get $6 i32.const 4 i32.shl - local.get $8 + local.get $7 i32.add i32.const 2 i32.shl @@ -596,55 +597,55 @@ local.get $4 local.set $10 local.get $5 - local.set $9 - local.get $7 - local.set $8 + local.set $6 + local.get $9 + local.set $7 local.get $11 local.get $10 i32.const 4 i32.shl - local.get $9 + local.get $6 i32.add i32.const 2 i32.shl i32.add - local.get $8 - i32.store offset=96 local.get $7 + i32.store offset=96 + local.get $9 i32.eqz if local.get $0 - local.set $9 + local.set $6 local.get $4 - local.set $8 - local.get $9 - local.get $8 + local.set $7 + local.get $6 + local.get $7 i32.const 2 i32.shl i32.add i32.load offset=4 - local.set $9 + local.set $6 local.get $0 - local.set $8 + local.set $7 local.get $4 local.set $11 - local.get $9 + local.get $6 i32.const 1 local.get $5 i32.shl i32.const -1 i32.xor i32.and - local.tee $9 + local.tee $6 local.set $10 - local.get $8 + local.get $7 local.get $11 i32.const 2 i32.shl i32.add local.get $10 i32.store offset=4 - local.get $9 + local.get $6 i32.eqz if local.get $0 @@ -680,7 +681,7 @@ i32.eqz if i32.const 0 - i32.const 400 + i32.const 496 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -697,7 +698,7 @@ i32.eqz if i32.const 0 - i32.const 400 + i32.const 496 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -723,86 +724,73 @@ i32.const 1 i32.and if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 local.get $2 + i32.const 4 + i32.add + local.get $5 i32.const 3 i32.const -1 i32.xor i32.and + i32.add + local.tee $2 + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $1 + local.set $3 + local.get $3 i32.const 4 i32.add - local.get $5 + local.get $3 + i32.load i32.const 3 i32.const -1 i32.xor i32.and i32.add - local.set $3 - local.get $3 - i32.const 1073741820 - i32.lt_u - if - local.get $0 - local.get $4 - call $~lib/rt/tlsf/removeBlock - local.get $1 - local.get $2 - i32.const 3 - i32.and - local.get $3 - i32.or - local.tee $2 - call $~lib/rt/common/BLOCK#set:mmInfo - local.get $1 - local.set $6 - local.get $6 - i32.const 4 - i32.add - local.get $6 - i32.load - i32.const 3 - i32.const -1 - i32.xor - i32.and - i32.add - local.set $4 - local.get $4 - i32.load - local.set $5 - end + local.set $4 + local.get $4 + i32.load + local.set $5 end local.get $2 i32.const 2 i32.and if local.get $1 - local.set $6 - local.get $6 + local.set $3 + local.get $3 i32.const 4 i32.sub i32.load - local.set $6 - local.get $6 - i32.load local.set $3 + local.get $3 + i32.load + local.set $6 i32.const 1 drop - local.get $3 + local.get $6 i32.const 1 i32.and i32.eqz if i32.const 0 - i32.const 400 - i32.const 224 + i32.const 496 + i32.const 221 i32.const 16 call $~lib/builtins/abort unreachable end + local.get $0 local.get $3 - i32.const 3 - i32.const -1 - i32.xor - i32.and + call $~lib/rt/tlsf/removeBlock + local.get $3 + local.set $1 + local.get $1 + local.get $6 i32.const 4 i32.add local.get $2 @@ -811,25 +799,8 @@ i32.xor i32.and i32.add - local.set $7 - local.get $7 - i32.const 1073741820 - i32.lt_u - if - local.get $0 - local.get $6 - call $~lib/rt/tlsf/removeBlock - local.get $6 - local.get $3 - i32.const 3 - i32.and - local.get $7 - i32.or - local.tee $2 - call $~lib/rt/common/BLOCK#set:mmInfo - local.get $6 - local.set $1 - end + local.tee $2 + call $~lib/rt/common/BLOCK#set:mmInfo end local.get $4 local.get $5 @@ -841,24 +812,17 @@ i32.const -1 i32.xor i32.and - local.set $8 + local.set $7 i32.const 1 drop - local.get $8 + local.get $7 i32.const 12 i32.ge_u - if (result i32) - local.get $8 - i32.const 1073741820 - i32.lt_u - else - i32.const 0 - end i32.eqz if i32.const 0 - i32.const 400 - i32.const 239 + i32.const 496 + i32.const 233 i32.const 14 call $~lib/builtins/abort unreachable @@ -868,15 +832,15 @@ local.get $1 i32.const 4 i32.add - local.get $8 + local.get $7 i32.add local.get $4 i32.eq i32.eqz if i32.const 0 - i32.const 400 - i32.const 240 + i32.const 496 + i32.const 234 i32.const 14 call $~lib/builtins/abort unreachable @@ -886,24 +850,33 @@ i32.sub local.get $1 i32.store - local.get $8 + local.get $7 i32.const 256 i32.lt_u if i32.const 0 - local.set $9 - local.get $8 + local.set $8 + local.get $7 i32.const 4 i32.shr_u - local.set $10 + local.set $9 else + local.get $7 + local.tee $3 + i32.const 1073741820 + local.tee $6 + local.get $3 + local.get $6 + i32.lt_u + select + local.set $3 i32.const 31 - local.get $8 + local.get $3 i32.clz i32.sub - local.set $9 + local.set $8 + local.get $3 local.get $8 - local.get $9 i32.const 4 i32.sub i32.shr_u @@ -911,21 +884,21 @@ i32.const 4 i32.shl i32.xor - local.set $10 - local.get $9 + local.set $9 + local.get $8 i32.const 8 i32.const 1 i32.sub i32.sub - local.set $9 + local.set $8 end i32.const 1 drop - local.get $9 + local.get $8 i32.const 23 i32.lt_u if (result i32) - local.get $10 + local.get $9 i32.const 16 i32.lt_u else @@ -934,19 +907,19 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 256 + i32.const 496 + i32.const 251 i32.const 14 call $~lib/builtins/abort unreachable end local.get $0 - local.set $7 - local.get $9 + local.set $10 + local.get $8 local.set $3 - local.get $10 + local.get $9 local.set $6 - local.get $7 + local.get $10 local.get $3 i32.const 4 i32.shl @@ -971,14 +944,14 @@ end local.get $0 local.set $12 + local.get $8 + local.set $10 local.get $9 - local.set $7 - local.get $10 local.set $3 local.get $1 local.set $6 local.get $12 - local.get $7 + local.get $10 i32.const 4 i32.shl local.get $3 @@ -992,17 +965,17 @@ local.get $0 i32.load i32.const 1 - local.get $9 + local.get $8 i32.shl i32.or call $~lib/rt/tlsf/Root#set:flMap local.get $0 local.set $13 - local.get $9 + local.get $8 local.set $12 local.get $0 local.set $3 - local.get $9 + local.get $8 local.set $6 local.get $3 local.get $6 @@ -1011,16 +984,16 @@ i32.add i32.load offset=4 i32.const 1 - local.get $10 + local.get $9 i32.shl i32.or - local.set $7 + local.set $10 local.get $13 local.get $12 i32.const 2 i32.shl i32.add - local.get $7 + local.get $10 i32.store offset=4 ) (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i32) (result i32) @@ -1039,8 +1012,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 381 + i32.const 496 + i32.const 377 i32.const 14 call $~lib/builtins/abort unreachable @@ -1082,8 +1055,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 388 + i32.const 496 + i32.const 384 i32.const 16 call $~lib/builtins/abort unreachable @@ -1115,8 +1088,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 401 + i32.const 496 + i32.const 397 i32.const 5 call $~lib/builtins/abort unreachable @@ -1358,8 +1331,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 565 + i32.const 496 + i32.const 559 i32.const 3 call $~lib/builtins/abort unreachable @@ -1580,7 +1553,7 @@ i32.eqz if i32.const 0 - i32.const 128 + i32.const 224 i32.const 228 i32.const 20 call $~lib/builtins/abort @@ -1688,9 +1661,9 @@ i32.const 1073741820 i32.ge_u if - i32.const 64 - i32.const 400 - i32.const 462 + i32.const 160 + i32.const 496 + i32.const 458 i32.const 30 call $~lib/builtins/abort unreachable @@ -1773,8 +1746,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 334 + i32.const 496 + i32.const 330 i32.const 14 call $~lib/builtins/abort unreachable @@ -1838,8 +1811,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 347 + i32.const 496 + i32.const 343 i32.const 18 call $~lib/builtins/abort unreachable @@ -1989,8 +1962,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 361 + i32.const 496 + i32.const 357 i32.const 14 call $~lib/builtins/abort unreachable @@ -2098,8 +2071,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 500 + i32.const 496 + i32.const 496 i32.const 16 call $~lib/builtins/abort unreachable @@ -2118,8 +2091,8 @@ i32.eqz if i32.const 0 - i32.const 400 - i32.const 502 + i32.const 496 + i32.const 498 i32.const 14 call $~lib/builtins/abort unreachable @@ -2377,8 +2350,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 64 - i32.const 128 + i32.const 160 + i32.const 224 i32.const 260 i32.const 31 call $~lib/builtins/abort @@ -3751,7 +3724,8 @@ local.get $3 i32.store offset=2 ) - (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) @@ -3760,28 +3734,38 @@ (local $9 i32) (local $10 i32) (local $11 i32) + local.get $1 + i32.eqz + if + local.get $0 + return + end i32.const 0 - local.set $4 + local.set $3 i32.const 0 - local.set $5 - local.get $2 + local.set $4 + local.get $1 i32.const 1 i32.shl + local.set $5 + local.get $5 + i32.const 1 + call $~lib/rt/itcms/__new local.set $6 block $while-break|0 loop $while-continue|0 - local.get $4 - local.get $2 + local.get $3 + local.get $1 i32.lt_u local.set $7 local.get $7 if - local.get $4 + local.get $3 local.set $8 block $do-break|1 loop $do-continue|1 - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.shl i32.add @@ -3793,7 +3777,7 @@ i32.const 94 i32.lt_u if - local.get $3 + local.get $2 local.get $9 i32.const 33 i32.sub @@ -3805,50 +3789,50 @@ else br $do-break|1 end - local.get $4 + local.get $3 i32.const 1 i32.add - local.tee $4 - local.get $2 + local.tee $3 + local.get $1 i32.lt_u local.set $11 local.get $11 br_if $do-continue|1 end end - local.get $4 + local.get $3 local.get $8 i32.gt_u if - local.get $4 + local.get $3 local.get $8 i32.sub i32.const 1 i32.shl local.set $11 - local.get $5 + local.get $4 local.get $11 i32.add - local.get $6 + local.get $5 i32.gt_u if - local.get $5 + local.get $4 local.get $11 i32.add - local.set $6 - local.get $0 + local.set $5 local.get $6 + local.get $5 call $~lib/rt/itcms/__renew - local.set $0 + local.set $6 end local.get $11 i32.const 2 i32.eq if - local.get $0 - local.get $5 + local.get $6 + local.get $4 i32.add - local.get $1 + local.get $0 local.get $8 i32.const 1 i32.shl @@ -3860,10 +3844,10 @@ i32.const 4 i32.eq if - local.get $0 - local.get $5 + local.get $6 + local.get $4 i32.add - local.get $1 + local.get $0 local.get $8 i32.const 1 i32.shl @@ -3871,10 +3855,10 @@ i32.load i32.store else - local.get $0 - local.get $5 + local.get $6 + local.get $4 i32.add - local.get $1 + local.get $0 local.get $8 i32.const 1 i32.shl @@ -3883,12 +3867,12 @@ call $~lib/memory/memory.copy end end - local.get $5 + local.get $4 local.get $11 i32.add - local.set $5 - local.get $4 - local.get $2 + local.set $4 + local.get $3 + local.get $1 i32.ge_u if br $while-break|0 @@ -3911,7 +3895,7 @@ if i32.const 560 i32.const 608 - i32.const 72 + i32.const 75 i32.const 9 call $~lib/builtins/abort unreachable @@ -3920,22 +3904,22 @@ i32.const 56319 i32.le_u if - local.get $4 - local.get $2 + local.get $3 + local.get $1 i32.ge_u if i32.const 560 i32.const 608 - i32.const 76 + i32.const 79 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.add - local.tee $4 + local.tee $3 i32.const 1 i32.shl i32.add @@ -3954,7 +3938,7 @@ if i32.const 560 i32.const 608 - i32.const 80 + i32.const 83 i32.const 11 call $~lib/builtins/abort unreachable @@ -3973,7 +3957,7 @@ local.set $9 end end - local.get $5 + local.get $4 local.get $9 i32.const 128 i32.lt_u @@ -3989,10 +3973,10 @@ i32.add local.set $11 local.get $11 - local.get $6 + local.get $5 i32.gt_u if - local.get $2 + local.get $1 i32.const 1 i32.gt_u if (result i32) @@ -4002,73 +3986,73 @@ else local.get $11 end - local.set $6 - local.get $0 + local.set $5 local.get $6 + local.get $5 call $~lib/rt/itcms/__renew - local.set $0 + local.set $6 end local.get $9 i32.const 128 i32.lt_u if - local.get $0 - local.get $5 + local.get $6 + local.get $4 local.get $9 call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 + local.set $4 else local.get $9 i32.const 2048 i32.lt_u if - local.get $0 - local.get $5 + local.get $6 + local.get $4 local.get $9 i32.const 6 i32.shr_u i32.const 192 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 + local.set $4 else local.get $9 i32.const 65536 i32.lt_u if - local.get $0 - local.get $5 + local.get $6 + local.get $4 local.get $9 i32.const 12 i32.shr_u i32.const 224 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 + local.set $4 else - local.get $0 - local.get $5 + local.get $6 + local.get $4 local.get $9 i32.const 18 i32.shr_u i32.const 240 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 - local.get $0 - local.get $5 + local.set $4 + local.get $6 + local.get $4 local.get $9 i32.const 12 i32.shr_u @@ -4077,13 +4061,13 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 + local.set $4 end - local.get $0 - local.get $5 + local.get $6 + local.get $4 local.get $9 i32.const 6 i32.shr_u @@ -4092,64 +4076,47 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 + local.set $4 end - local.get $0 - local.get $5 + local.get $6 + local.get $4 local.get $9 i32.const 63 i32.and i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $4 i32.const 6 i32.add - local.set $5 + local.set $4 end - local.get $4 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 br $while-continue|0 end end end - local.get $6 local.get $5 + local.get $4 i32.gt_u if - local.get $0 - local.get $5 + local.get $6 + local.get $4 call $~lib/rt/itcms/__renew - local.set $0 + local.set $6 end - local.get $0 + local.get $6 ) (func $~lib/uri/encodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 local.get $0 - local.get $1 + call $~lib/string/String#get:length global.get $~lib/util/uri/URL_UNSAFE call $~lib/util/uri/encode ) @@ -4303,26 +4270,9 @@ i32.eqz ) (func $~lib/uri/encodeURI (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 local.get $0 - local.get $1 + call $~lib/string/String#get:length global.get $~lib/util/uri/URI_UNSAFE call $~lib/util/uri/encode ) @@ -4400,7 +4350,8 @@ i32.const -1 end ) - (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/util/uri/decode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) @@ -4411,34 +4362,46 @@ (local $11 i32) (local $12 i32) (local $13 i32) + local.get $1 + i32.eqz + if + local.get $0 + return + end i32.const 0 - local.set $4 + local.set $3 i32.const 0 - local.set $5 + local.set $4 i32.const 0 + local.set $6 + local.get $1 + i32.const 1 + i32.shl + i32.const 1 + call $~lib/rt/itcms/__new local.set $7 block $while-break|0 loop $while-continue|0 - local.get $4 - local.get $2 + local.get $3 + local.get $1 i32.lt_u local.set $8 local.get $8 if - local.get $4 - local.set $6 + local.get $3 + local.set $5 loop $while-continue|1 - local.get $4 - local.get $2 + local.get $3 + local.get $1 i32.lt_u if (result i32) - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $7 + local.tee $6 i32.const 37 i32.ne else @@ -4447,19 +4410,19 @@ local.set $9 local.get $9 if - local.get $4 + local.get $3 i32.const 1 i32.add - local.set $4 + local.set $3 br $while-continue|1 end end - local.get $4 - local.get $6 + local.get $3 + local.get $5 i32.gt_u if - local.get $4 - local.get $6 + local.get $3 + local.get $5 i32.sub i32.const 1 i32.shl @@ -4468,11 +4431,11 @@ i32.const 2 i32.eq if + local.get $7 + local.get $4 + i32.add local.get $0 local.get $5 - i32.add - local.get $1 - local.get $6 i32.const 1 i32.shl i32.add @@ -4483,22 +4446,22 @@ i32.const 4 i32.eq if + local.get $7 + local.get $4 + i32.add local.get $0 local.get $5 - i32.add - local.get $1 - local.get $6 i32.const 1 i32.shl i32.add i32.load i32.store else + local.get $7 + local.get $4 + i32.add local.get $0 local.get $5 - i32.add - local.get $1 - local.get $6 i32.const 1 i32.shl i32.add @@ -4506,63 +4469,63 @@ call $~lib/memory/memory.copy end end - local.get $5 + local.get $4 local.get $9 i32.add - local.set $5 - local.get $4 - local.get $2 + local.set $4 + local.get $3 + local.get $1 i32.ge_u if br $while-break|0 end end - local.get $4 + local.get $3 i32.const 2 i32.add - local.get $2 + local.get $1 i32.ge_u if (result i32) i32.const 1 else - local.get $7 + local.get $6 i32.const 37 i32.ne end if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.add i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $7 + local.tee $6 i32.const -1 i32.eq end if i32.const 560 i32.const 608 - i32.const 152 + i32.const 158 i32.const 7 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 - local.get $7 + local.set $3 + local.get $6 i32.const 128 i32.lt_u if - local.get $3 + local.get $2 i32.eqz if (result i32) - local.get $7 + local.get $6 local.set $9 local.get $9 i32.const 35 @@ -4584,14 +4547,14 @@ end if i32.const 37 - local.set $7 - local.get $4 + local.set $6 + local.get $3 i32.const 2 i32.sub - local.set $4 + local.set $3 end else - local.get $7 + local.get $6 local.set $9 local.get $9 i32.const 192 @@ -4619,7 +4582,7 @@ i32.sub i32.shl local.set $10 - local.get $7 + local.get $6 local.get $9 if (result i32) i32.const 128 @@ -4631,7 +4594,7 @@ i32.const 0 end i32.and - local.set $7 + local.set $6 block $while-break|2 loop $while-continue|2 local.get $9 @@ -4643,16 +4606,16 @@ local.set $11 local.get $11 if - local.get $4 + local.get $3 i32.const 2 i32.add - local.get $2 + local.get $1 i32.ge_u if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.shl i32.add @@ -4663,8 +4626,8 @@ if (result i32) i32.const 1 else - local.get $1 - local.get $4 + local.get $0 + local.get $3 i32.const 1 i32.add i32.const 1 @@ -4677,15 +4640,15 @@ if i32.const 560 i32.const 608 - i32.const 175 + i32.const 181 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $4 + local.get $3 i32.const 3 i32.add - local.set $4 + local.set $3 local.get $12 i32.const 192 i32.and @@ -4693,22 +4656,22 @@ i32.ne if i32.const 0 - local.set $7 + local.set $6 br $while-break|2 end - local.get $7 + local.get $6 i32.const 6 i32.shl local.get $12 i32.const 63 i32.and i32.or - local.set $7 + local.set $6 br $while-continue|2 end end end - local.get $7 + local.get $6 local.get $10 i32.lt_u if (result i32) @@ -4721,18 +4684,18 @@ if (result i32) i32.const 1 else - local.get $7 + local.get $6 i32.const 1114111 i32.gt_u end if (result i32) i32.const 1 else - local.get $7 + local.get $6 i32.const 55296 i32.ge_u if (result i32) - local.get $7 + local.get $6 i32.const 57344 i32.lt_u else @@ -4742,33 +4705,33 @@ if i32.const 560 i32.const 608 - i32.const 186 + i32.const 192 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $7 + local.get $6 i32.const 65536 i32.ge_u if - local.get $7 + local.get $6 i32.const 65536 i32.sub - local.set $7 - local.get $7 + local.set $6 + local.get $6 i32.const 10 i32.shr_u i32.const 55296 i32.or local.set $11 - local.get $7 + local.get $6 i32.const 1023 i32.and i32.const 56320 i32.or local.set $13 - local.get $0 - local.get $5 + local.get $7 + local.get $4 i32.add local.get $11 local.get $13 @@ -4776,28 +4739,28 @@ i32.shl i32.or i32.store - local.get $5 + local.get $4 i32.const 4 i32.add - local.set $5 + local.set $4 br $while-continue|0 end end - local.get $0 - local.get $5 - i32.add local.get $7 + local.get $4 + i32.add + local.get $6 i32.store16 - local.get $5 + local.get $4 i32.const 2 i32.add - local.set $5 + local.set $4 br $while-continue|0 end end end - local.get $5 - local.get $2 + local.get $4 + local.get $1 i32.const 1 i32.shl i32.le_u @@ -4805,69 +4768,35 @@ if i32.const 0 i32.const 608 - i32.const 202 + i32.const 208 i32.const 3 call $~lib/builtins/abort unreachable end - local.get $2 + local.get $1 i32.const 1 i32.shl - local.get $5 + local.get $4 i32.gt_u if - local.get $0 - local.get $5 + local.get $7 + local.get $4 call $~lib/rt/itcms/__renew - local.set $0 + local.set $7 end - local.get $0 + local.get $7 ) (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 local.get $0 - local.get $1 + call $~lib/string/String#get:length i32.const 1 call $~lib/util/uri/decode ) (func $~lib/uri/decodeURI (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) local.get $0 - call $~lib/string/String#get:length - local.set $1 - local.get $1 - i32.eqz - if - local.get $0 - return - end - local.get $1 - i32.const 1 - i32.shl - i32.const 1 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 local.get $0 - local.get $1 + call $~lib/string/String#get:length i32.const 0 call $~lib/util/uri/decode ) @@ -4928,10 +4857,10 @@ ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) - i32.const 256 + i32.const 352 local.get $0 call $~lib/rt/itcms/__visit - i32.const 64 + i32.const 160 local.get $0 call $~lib/rt/itcms/__visit i32.const 560 @@ -5008,13 +4937,13 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 176 + i32.const 272 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 208 + i32.const 304 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/toSpace - i32.const 352 + i32.const 448 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace i32.const 32 From 3ca72e4199432cf88021596540372d5f0886091e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Tue, 30 Mar 2021 16:03:23 +0300 Subject: [PATCH 80/87] more --- std/assembly/util/uri.ts | 17 +++-- tests/compiler/std/uri.optimized.wat | 24 +++--- tests/compiler/std/uri.untouched.wat | 107 +++++++++++++-------------- 3 files changed, 73 insertions(+), 75 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 009b695056..2e455212f8 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -88,6 +88,8 @@ export function encode(src: usize, len: usize, table: usize): usize { let estSize = offset + (c < 0x80 ? 1 * 6 : 4 * 6); if (estSize > outSize) { + // doubling estimated size but only for greater than one + // input lenght due to we already estemated it for worst case outSize = len > 1 ? estSize << 1 : estSize; dst = __renew(dst, outSize); } @@ -126,11 +128,11 @@ export function encode(src: usize, len: usize, table: usize): usize { export function decode(src: usize, len: usize, component: bool): usize { if (!len) return src; - var i: usize = 0, offset: usize = 0, org: usize, ch: u32 = 0; + var i: usize = 0, offset: usize = 0, ch: u32 = 0; var dst = __new(len << 1, idof()); while (i < len) { - org = i; + let org = i; while (i < len && (ch = load(src + (i << 1))) != CharCode.PERCENT) i++; if (i > org) { @@ -219,12 +221,13 @@ function storeHex(dst: usize, offset: usize, ch: u32): void { 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 ]); - let hex = - load(HEX_CHARS + (ch >> 4 & 0x0F)) | - load(HEX_CHARS + (ch & 0x0F)) << 16; - store(dst + offset, CharCode.PERCENT, 0); // % - store(dst + offset, hex, 2); // XX + store( + dst + offset, + load(HEX_CHARS + (ch >> 4 & 0x0F)) | + load(HEX_CHARS + (ch & 0x0F)) << 16, + 2 + ); // XX } function loadHex(src: usize, offset: usize): u32 { diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index b60ad94cd3..c5d6a71211 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2022,6 +2022,13 @@ local.get $3 ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) + local.get $0 + local.get $1 + i32.add + local.tee $0 + i32.const 37 + i32.store16 + local.get $0 local.get $2 i32.const 4 i32.shr_u @@ -2039,15 +2046,6 @@ i32.const 16 i32.shl i32.or - local.set $2 - local.get $0 - local.get $1 - i32.add - local.tee $0 - i32.const 37 - i32.store16 - local.get $0 - local.get $2 i32.store offset=2 ) (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) @@ -2728,7 +2726,7 @@ if i32.const 1584 i32.const 1632 - i32.const 158 + i32.const 160 i32.const 7 call $~lib/builtins/abort unreachable @@ -2843,7 +2841,7 @@ if i32.const 1584 i32.const 1632 - i32.const 181 + i32.const 183 i32.const 11 call $~lib/builtins/abort unreachable @@ -2900,7 +2898,7 @@ if i32.const 1584 i32.const 1632 - i32.const 192 + i32.const 194 i32.const 9 call $~lib/builtins/abort unreachable @@ -2957,7 +2955,7 @@ if i32.const 0 i32.const 1632 - i32.const 208 + i32.const 210 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 938978e218..4060914636 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3694,7 +3694,14 @@ local.get $3 ) (func $~lib/util/uri/storeHex (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) + local.get $0 + local.get $1 + i32.add + i32.const 37 + i32.store16 + local.get $0 + local.get $1 + i32.add i32.const 652 local.get $2 i32.const 4 @@ -3712,16 +3719,6 @@ i32.const 16 i32.shl i32.or - local.set $3 - local.get $0 - local.get $1 - i32.add - i32.const 37 - i32.store16 - local.get $0 - local.get $1 - i32.add - local.get $3 i32.store offset=2 ) (func $~lib/util/uri/encode (param $0 i32) (param $1 i32) (param $2 i32) (result i32) @@ -4373,23 +4370,23 @@ i32.const 0 local.set $4 i32.const 0 - local.set $6 + local.set $5 local.get $1 i32.const 1 i32.shl i32.const 1 call $~lib/rt/itcms/__new - local.set $7 + local.set $6 block $while-break|0 loop $while-continue|0 local.get $3 local.get $1 i32.lt_u - local.set $8 - local.get $8 + local.set $7 + local.get $7 if local.get $3 - local.set $5 + local.set $8 loop $while-continue|1 local.get $3 local.get $1 @@ -4401,7 +4398,7 @@ i32.shl i32.add i32.load16_u - local.tee $6 + local.tee $5 i32.const 37 i32.ne else @@ -4418,11 +4415,11 @@ end end local.get $3 - local.get $5 + local.get $8 i32.gt_u if local.get $3 - local.get $5 + local.get $8 i32.sub i32.const 1 i32.shl @@ -4431,11 +4428,11 @@ i32.const 2 i32.eq if - local.get $7 + local.get $6 local.get $4 i32.add local.get $0 - local.get $5 + local.get $8 i32.const 1 i32.shl i32.add @@ -4446,22 +4443,22 @@ i32.const 4 i32.eq if - local.get $7 + local.get $6 local.get $4 i32.add local.get $0 - local.get $5 + local.get $8 i32.const 1 i32.shl i32.add i32.load i32.store else - local.get $7 + local.get $6 local.get $4 i32.add local.get $0 - local.get $5 + local.get $8 i32.const 1 i32.shl i32.add @@ -4488,7 +4485,7 @@ if (result i32) i32.const 1 else - local.get $6 + local.get $5 i32.const 37 i32.ne end @@ -4502,14 +4499,14 @@ i32.const 1 i32.shl call $~lib/util/uri/loadHex - local.tee $6 + local.tee $5 i32.const -1 i32.eq end if i32.const 560 i32.const 608 - i32.const 158 + i32.const 160 i32.const 7 call $~lib/builtins/abort unreachable @@ -4518,14 +4515,14 @@ i32.const 3 i32.add local.set $3 - local.get $6 + local.get $5 i32.const 128 i32.lt_u if local.get $2 i32.eqz if (result i32) - local.get $6 + local.get $5 local.set $9 local.get $9 i32.const 35 @@ -4547,14 +4544,14 @@ end if i32.const 37 - local.set $6 + local.set $5 local.get $3 i32.const 2 i32.sub local.set $3 end else - local.get $6 + local.get $5 local.set $9 local.get $9 i32.const 192 @@ -4582,7 +4579,7 @@ i32.sub i32.shl local.set $10 - local.get $6 + local.get $5 local.get $9 if (result i32) i32.const 128 @@ -4594,7 +4591,7 @@ i32.const 0 end i32.and - local.set $6 + local.set $5 block $while-break|2 loop $while-continue|2 local.get $9 @@ -4640,7 +4637,7 @@ if i32.const 560 i32.const 608 - i32.const 181 + i32.const 183 i32.const 11 call $~lib/builtins/abort unreachable @@ -4656,22 +4653,22 @@ i32.ne if i32.const 0 - local.set $6 + local.set $5 br $while-break|2 end - local.get $6 + local.get $5 i32.const 6 i32.shl local.get $12 i32.const 63 i32.and i32.or - local.set $6 + local.set $5 br $while-continue|2 end end end - local.get $6 + local.get $5 local.get $10 i32.lt_u if (result i32) @@ -4684,18 +4681,18 @@ if (result i32) i32.const 1 else - local.get $6 + local.get $5 i32.const 1114111 i32.gt_u end if (result i32) i32.const 1 else - local.get $6 + local.get $5 i32.const 55296 i32.ge_u if (result i32) - local.get $6 + local.get $5 i32.const 57344 i32.lt_u else @@ -4705,32 +4702,32 @@ if i32.const 560 i32.const 608 - i32.const 192 + i32.const 194 i32.const 9 call $~lib/builtins/abort unreachable end - local.get $6 + local.get $5 i32.const 65536 i32.ge_u if - local.get $6 + local.get $5 i32.const 65536 i32.sub - local.set $6 - local.get $6 + local.set $5 + local.get $5 i32.const 10 i32.shr_u i32.const 55296 i32.or local.set $11 - local.get $6 + local.get $5 i32.const 1023 i32.and i32.const 56320 i32.or local.set $13 - local.get $7 + local.get $6 local.get $4 i32.add local.get $11 @@ -4746,10 +4743,10 @@ br $while-continue|0 end end - local.get $7 + local.get $6 local.get $4 i32.add - local.get $6 + local.get $5 i32.store16 local.get $4 i32.const 2 @@ -4768,7 +4765,7 @@ if i32.const 0 i32.const 608 - i32.const 208 + i32.const 210 i32.const 3 call $~lib/builtins/abort unreachable @@ -4779,12 +4776,12 @@ local.get $4 i32.gt_u if - local.get $7 + local.get $6 local.get $4 call $~lib/rt/itcms/__renew - local.set $7 + local.set $6 end - local.get $7 + local.get $6 ) (func $~lib/uri/decodeURIComponent (param $0 i32) (result i32) local.get $0 From 1132f6c64c5b10df0f38eaac97fc593d7f535d6e Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 2 Apr 2021 00:02:19 +0300 Subject: [PATCH 81/87] remove fast pathes --- std/assembly/util/uri.ts | 34 ++---- tests/compiler/std/uri.optimized.wat | 162 ++++++++------------------- tests/compiler/std/uri.untouched.wat | 114 +++++-------------- 3 files changed, 86 insertions(+), 224 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 2e455212f8..65755c86bd 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -55,17 +55,12 @@ export function encode(src: usize, len: usize, table: usize): usize { outSize = offset + size; dst = __renew(dst, outSize); } - if (size == 2) { - store(dst + offset, load(src + (org << 1))); - } else if (size == 4) { - store(dst + offset, load(src + (org << 1))); - } else { - memory.copy( - dst + offset, - src + (org << 1), - size - ); - } + // TODO: should we optimize for short cases like 2 byte size? + memory.copy( + dst + offset, + src + (org << 1), + size + ); offset += size; if (i >= len) break; } @@ -137,17 +132,12 @@ export function decode(src: usize, len: usize, component: bool): usize { if (i > org) { let size = i - org << 1; - if (size == 2) { - store(dst + offset, load(src + (org << 1))); - } else if (size == 4) { - store(dst + offset, load(src + (org << 1))); - } else { - memory.copy( - dst + offset, - src + (org << 1), - size - ); - } + // TODO: should we optimize for short cases like 2 byte size? + memory.copy( + dst + offset, + src + (org << 1), + size + ); offset += size; if (i >= len) break; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index c5d6a71211..adabd78605 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2071,16 +2071,16 @@ local.set $3 loop $while-continue|0 local.get $1 - local.get $6 + local.get $5 i32.gt_u if block $while-break|0 - local.get $6 - local.set $5 + local.get $5 + local.set $6 loop $do-continue|1 block $do-break|1 local.get $0 - local.get $6 + local.get $5 i32.const 1 i32.shl i32.add @@ -2099,22 +2099,22 @@ i32.load8_u br_if $do-break|1 local.get $1 - local.get $6 + local.get $5 i32.const 1 i32.add - local.tee $6 + local.tee $5 i32.gt_u br_if $do-continue|1 end end local.get $5 local.get $6 - i32.lt_u + i32.gt_u if local.get $8 local.get $7 - local.get $6 local.get $5 + local.get $6 i32.sub i32.const 1 i32.shl @@ -2130,54 +2130,22 @@ call $~lib/rt/itcms/__renew local.set $3 end + local.get $3 + local.get $7 + i32.add + local.get $0 + local.get $6 + i32.const 1 + i32.shl + i32.add local.get $9 - i32.const 2 - i32.eq - if - local.get $3 - local.get $7 - i32.add - local.get $0 - local.get $5 - i32.const 1 - i32.shl - i32.add - i32.load16_u - i32.store16 - else - local.get $9 - i32.const 4 - i32.eq - if - local.get $3 - local.get $7 - i32.add - local.get $0 - local.get $5 - i32.const 1 - i32.shl - i32.add - i32.load - i32.store - else - local.get $3 - local.get $7 - i32.add - local.get $0 - local.get $5 - i32.const 1 - i32.shl - i32.add - local.get $9 - call $~lib/memory/memory.copy - end - end + call $~lib/memory/memory.copy local.get $7 local.get $9 i32.add local.set $7 local.get $1 - local.get $6 + local.get $5 i32.le_u br_if $while-break|0 end @@ -2200,7 +2168,7 @@ if i32.const 1584 i32.const 1632 - i32.const 75 + i32.const 70 i32.const 9 call $~lib/builtins/abort unreachable @@ -2210,42 +2178,42 @@ i32.le_u if (result i32) local.get $1 - local.get $6 + local.get $5 i32.le_u if i32.const 1584 i32.const 1632 - i32.const 79 + i32.const 74 i32.const 11 call $~lib/builtins/abort unreachable end i32.const 1 local.get $0 - local.get $6 + local.get $5 i32.const 1 i32.add - local.tee $6 + local.tee $5 i32.const 1 i32.shl i32.add i32.load16_u - local.tee $5 + local.tee $6 i32.const 57343 i32.gt_u - local.get $5 + local.get $6 i32.const 56320 i32.lt_u select if i32.const 1584 i32.const 1632 - i32.const 83 + i32.const 78 i32.const 11 call $~lib/builtins/abort unreachable end - local.get $5 + local.get $6 i32.const 1023 i32.and local.get $4 @@ -2266,14 +2234,14 @@ i32.lt_u select i32.add - local.tee $5 + local.tee $6 i32.lt_u if local.get $3 - local.get $5 + local.get $6 i32.const 1 i32.shl - local.get $5 + local.get $6 local.get $1 i32.const 1 i32.gt_u @@ -2333,7 +2301,7 @@ local.get $7 i32.const 6 i32.add - local.tee $5 + local.tee $6 local.get $4 i32.const 12 i32.shr_u @@ -2342,7 +2310,7 @@ i32.const 128 i32.or call $~lib/util/uri/storeHex - local.get $5 + local.get $6 i32.const 6 i32.add end @@ -2372,10 +2340,10 @@ i32.const 6 i32.add local.set $7 - local.get $6 + local.get $5 i32.const 1 i32.add - local.set $6 + local.set $5 br $while-continue|0 end end @@ -2643,55 +2611,23 @@ local.get $5 i32.gt_u if + local.get $4 + local.get $7 + i32.add + local.get $0 + local.get $5 + i32.const 1 + i32.shl + i32.add local.get $3 local.get $5 i32.sub i32.const 1 i32.shl - local.tee $8 - i32.const 2 - i32.eq - if - local.get $4 - local.get $7 - i32.add - local.get $0 - local.get $5 - i32.const 1 - i32.shl - i32.add - i32.load16_u - i32.store16 - else - local.get $8 - i32.const 4 - i32.eq - if - local.get $4 - local.get $7 - i32.add - local.get $0 - local.get $5 - i32.const 1 - i32.shl - i32.add - i32.load - i32.store - else - local.get $4 - local.get $7 - i32.add - local.get $0 - local.get $5 - i32.const 1 - i32.shl - i32.add - local.get $8 - call $~lib/memory/memory.copy - end - end + local.tee $5 + call $~lib/memory/memory.copy + local.get $5 local.get $7 - local.get $8 i32.add local.set $7 local.get $1 @@ -2726,7 +2662,7 @@ if i32.const 1584 i32.const 1632 - i32.const 160 + i32.const 150 i32.const 7 call $~lib/builtins/abort unreachable @@ -2841,7 +2777,7 @@ if i32.const 1584 i32.const 1632 - i32.const 183 + i32.const 173 i32.const 11 call $~lib/builtins/abort unreachable @@ -2898,7 +2834,7 @@ if i32.const 1584 i32.const 1632 - i32.const 194 + i32.const 184 i32.const 9 call $~lib/builtins/abort unreachable @@ -2955,7 +2891,7 @@ if i32.const 0 i32.const 1632 - i32.const 210 + i32.const 200 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 4060914636..3e6385c231 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3822,48 +3822,16 @@ call $~lib/rt/itcms/__renew local.set $6 end + local.get $6 + local.get $4 + i32.add + local.get $0 + local.get $8 + i32.const 1 + i32.shl + i32.add local.get $11 - i32.const 2 - i32.eq - if - local.get $6 - local.get $4 - i32.add - local.get $0 - local.get $8 - i32.const 1 - i32.shl - i32.add - i32.load16_u - i32.store16 - else - local.get $11 - i32.const 4 - i32.eq - if - local.get $6 - local.get $4 - i32.add - local.get $0 - local.get $8 - i32.const 1 - i32.shl - i32.add - i32.load - i32.store - else - local.get $6 - local.get $4 - i32.add - local.get $0 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $11 - call $~lib/memory/memory.copy - end - end + call $~lib/memory/memory.copy local.get $4 local.get $11 i32.add @@ -3892,7 +3860,7 @@ if i32.const 560 i32.const 608 - i32.const 75 + i32.const 70 i32.const 9 call $~lib/builtins/abort unreachable @@ -3907,7 +3875,7 @@ if i32.const 560 i32.const 608 - i32.const 79 + i32.const 74 i32.const 11 call $~lib/builtins/abort unreachable @@ -3935,7 +3903,7 @@ if i32.const 560 i32.const 608 - i32.const 83 + i32.const 78 i32.const 11 call $~lib/builtins/abort unreachable @@ -4424,48 +4392,16 @@ i32.const 1 i32.shl local.set $9 + local.get $6 + local.get $4 + i32.add + local.get $0 + local.get $8 + i32.const 1 + i32.shl + i32.add local.get $9 - i32.const 2 - i32.eq - if - local.get $6 - local.get $4 - i32.add - local.get $0 - local.get $8 - i32.const 1 - i32.shl - i32.add - i32.load16_u - i32.store16 - else - local.get $9 - i32.const 4 - i32.eq - if - local.get $6 - local.get $4 - i32.add - local.get $0 - local.get $8 - i32.const 1 - i32.shl - i32.add - i32.load - i32.store - else - local.get $6 - local.get $4 - i32.add - local.get $0 - local.get $8 - i32.const 1 - i32.shl - i32.add - local.get $9 - call $~lib/memory/memory.copy - end - end + call $~lib/memory/memory.copy local.get $4 local.get $9 i32.add @@ -4506,7 +4442,7 @@ if i32.const 560 i32.const 608 - i32.const 160 + i32.const 150 i32.const 7 call $~lib/builtins/abort unreachable @@ -4637,7 +4573,7 @@ if i32.const 560 i32.const 608 - i32.const 183 + i32.const 173 i32.const 11 call $~lib/builtins/abort unreachable @@ -4702,7 +4638,7 @@ if i32.const 560 i32.const 608 - i32.const 194 + i32.const 184 i32.const 9 call $~lib/builtins/abort unreachable @@ -4765,7 +4701,7 @@ if i32.const 0 i32.const 608 - i32.const 210 + i32.const 200 i32.const 3 call $~lib/builtins/abort unreachable From b5ef31b10d7297a7fb1b1ad4a0e0e0465fe2d1a2 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Fri, 16 Apr 2021 09:37:25 +0300 Subject: [PATCH 82/87] update fixture --- tests/compiler/std/uri.optimized.wat | 44 ++++++++++++++++++++-------- tests/compiler/std/uri.untouched.wat | 44 ++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index adabd78605..4de637fda4 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -1568,11 +1568,11 @@ local.get $0 local.get $1 i32.add - i32.const 4 - i32.sub local.tee $2 + i32.const 1 + i32.sub i32.const 0 - i32.store8 offset=3 + i32.store8 local.get $1 i32.const 2 i32.le_u @@ -1584,11 +1584,15 @@ i32.const 0 i32.store8 offset=2 local.get $2 + i32.const 2 + i32.sub i32.const 0 - i32.store8 offset=2 + i32.store8 local.get $2 + i32.const 3 + i32.sub i32.const 0 - i32.store8 offset=1 + i32.store8 local.get $1 i32.const 6 i32.le_u @@ -1597,6 +1601,8 @@ i32.const 0 i32.store8 offset=3 local.get $2 + i32.const 4 + i32.sub i32.const 0 i32.store8 local.get $1 @@ -1622,11 +1628,11 @@ i32.and local.tee $2 i32.add - i32.const 28 - i32.sub local.tee $1 + i32.const 4 + i32.sub i32.const 0 - i32.store offset=24 + i32.store local.get $2 i32.const 8 i32.le_u @@ -1638,11 +1644,15 @@ i32.const 0 i32.store offset=8 local.get $1 + i32.const 12 + i32.sub i32.const 0 - i32.store offset=16 + i32.store local.get $1 + i32.const 8 + i32.sub i32.const 0 - i32.store offset=20 + i32.store local.get $2 i32.const 24 i32.le_u @@ -1660,17 +1670,25 @@ i32.const 0 i32.store offset=24 local.get $1 + i32.const 28 + i32.sub i32.const 0 i32.store local.get $1 + i32.const 24 + i32.sub i32.const 0 - i32.store offset=4 + i32.store local.get $1 + i32.const 20 + i32.sub i32.const 0 - i32.store offset=8 + i32.store local.get $1 + i32.const 16 + i32.sub i32.const 0 - i32.store offset=12 + i32.store local.get $0 local.get $0 i32.const 4 diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 3e6385c231..dbd97fe042 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -2158,15 +2158,15 @@ local.get $5 local.get $3 i32.add - i32.const 4 - i32.sub local.set $6 local.get $5 local.get $4 i32.store8 local.get $6 + i32.const 1 + i32.sub local.get $4 - i32.store8 offset=3 + i32.store8 local.get $3 i32.const 2 i32.le_u @@ -2180,11 +2180,15 @@ local.get $4 i32.store8 offset=2 local.get $6 + i32.const 2 + i32.sub local.get $4 - i32.store8 offset=2 + i32.store8 local.get $6 + i32.const 3 + i32.sub local.get $4 - i32.store8 offset=1 + i32.store8 local.get $3 i32.const 6 i32.le_u @@ -2195,6 +2199,8 @@ local.get $4 i32.store8 offset=3 local.get $6 + i32.const 4 + i32.sub local.get $4 i32.store8 local.get $3 @@ -2232,15 +2238,15 @@ local.get $5 local.get $3 i32.add - i32.const 28 - i32.sub local.set $6 local.get $5 local.get $8 i32.store local.get $6 + i32.const 4 + i32.sub local.get $8 - i32.store offset=24 + i32.store local.get $3 i32.const 8 i32.le_u @@ -2254,11 +2260,15 @@ local.get $8 i32.store offset=8 local.get $6 + i32.const 12 + i32.sub local.get $8 - i32.store offset=16 + i32.store local.get $6 + i32.const 8 + i32.sub local.get $8 - i32.store offset=20 + i32.store local.get $3 i32.const 24 i32.le_u @@ -2278,17 +2288,25 @@ local.get $8 i32.store offset=24 local.get $6 + i32.const 28 + i32.sub local.get $8 i32.store local.get $6 + i32.const 24 + i32.sub local.get $8 - i32.store offset=4 + i32.store local.get $6 + i32.const 20 + i32.sub local.get $8 - i32.store offset=8 + i32.store local.get $6 + i32.const 16 + i32.sub local.get $8 - i32.store offset=12 + i32.store i32.const 24 local.get $5 i32.const 4 From e23fa802a6027b02a8d3daf585e5e216c044c315 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 17 Apr 2021 09:04:51 +0300 Subject: [PATCH 83/87] upd fixture --- tests/compiler/std/uri.optimized.wat | 22 ++++++++-------- tests/compiler/std/uri.untouched.wat | 38 ++++++++++++++-------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 4de637fda4..a31a888b1b 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -9,6 +9,17 @@ (type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32))) (type $none_=>_i32 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20748)) (memory $0 1) (data (i32.const 1036) "\1c") (data (i32.const 1048) "\01") @@ -140,17 +151,6 @@ (data (i32.const 4300) "\1c") (data (i32.const 4312) "\01\00\00\00\06\00\00\00\f4\00\b8\00\ef") (data (i32.const 4336) "\03\00\00\00 \00\00\00\00\00\00\00 ") - (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) - (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20748)) (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/initLazy (param $0 i32) (result i32) diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index dbd97fe042..15a7c936ab 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -10,6 +10,25 @@ (type $none_=>_i32 (func (result i32))) (type $i32_i32_i32_i32_i32_=>_i32 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 44)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) + (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) + (global $~lib/rt/__rtti_base i32 (i32.const 3312)) + (global $~lib/memory/__data_end i32 (i32.const 3340)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19724)) + (global $~lib/memory/__heap_base i32 (i32.const 19724)) (memory $0 1) (data (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 44) "\00\01\01\01\01\01\00\00\00\00\01\01\00\00\01\00\00\00\00\00\00\00\00\00\00\01\01\01\01\01\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\01\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\01\01\00") @@ -79,25 +98,6 @@ (data (i32.const 3276) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00\f4\00\b8\00\ef\00\00\00\00\00\00\00") (data (i32.const 3312) "\03\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (table $0 1 funcref) - (global $~lib/util/uri/URL_UNSAFE i32 (i32.const 44)) - (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) - (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) - (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) - (global $~lib/ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/util/uri/URI_UNSAFE i32 (i32.const 2364)) - (global $~lib/util/uri/URI_RESERVED i32 (i32.const 2572)) - (global $~lib/rt/__rtti_base i32 (i32.const 3312)) - (global $~lib/memory/__data_end i32 (i32.const 3340)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19724)) - (global $~lib/memory/__heap_base i32 (i32.const 19724)) (export "memory" (memory $0)) (start $~start) (func $~lib/string/String#get:length (param $0 i32) (result i32) From 48a032a59b3a33d8b54de1b2b06537d3752cb075 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 17 Apr 2021 13:26:22 +0300 Subject: [PATCH 84/87] more comments --- std/assembly/util/uri.ts | 17 +++++++++++++++++ tests/compiler/std/uri.optimized.wat | 14 +++++++------- tests/compiler/std/uri.untouched.wat | 14 +++++++------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 65755c86bd..f79832d712 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -1,6 +1,8 @@ import { E_URI_MALFORMED } from "./error"; import { CharCode } from "./string"; +// Tuncated lookup boolean table that helps us quickly determine +// if a char needs to be escaped for URIs (RFC 2396). // @ts-ignore: decorator @lazy export const URI_UNSAFE = memory.data([ /* skip 32 + 1 always set to '1' head slots @@ -13,6 +15,8 @@ import { CharCode } from "./string"; skip 128 + 1 always set to '1' tail slots */ ]); +// Tuncated lookup boolean table that helps us quickly determine +// if a char needs to be escaped for URLs (RFC 3986). // @ts-ignore: decorator @lazy export const URL_UNSAFE = memory.data([ /* skip 32 + 1 always set to '1' head slots @@ -25,6 +29,7 @@ import { CharCode } from "./string"; skip 128 + 1 always set to '1' tail slots */ ]); +// Tuncated lookup boolean table for determine reserved chars: ;/?:@&=+$,# // @ts-ignore: decorator @lazy export const URI_RESERVED = memory.data([ /* skip 32 + 3 always set to '0' head slots @@ -42,13 +47,17 @@ export function encode(src: usize, len: usize, table: usize): usize { while (i < len) { let org = i; let c: u32, c1: u32; + // fast scan a check chars until it valid ASCII + // and safe for copying withoud escaping. do { c = load(src + (i << 1)); + // is it valid ASII and safe? if (c - 33 < 94) { // 127 - 33 if (load(table + (c - 33))) break; } else break; } while (++i < len); + // if we have some safe range of sequence just copy it without encoding if (i > org) { let size = i - org << 1; if (offset + size > outSize) { @@ -62,9 +71,11 @@ export function encode(src: usize, len: usize, table: usize): usize { size ); offset += size; + // return if we reach end on input string if (i >= len) break; } + // decode UTF16 with checking for unpaired surrogates if (c >= 0xD800) { if (c >= 0xDC00 && c <= 0xDFFF) { throw new URIError(E_URI_MALFORMED); @@ -90,9 +101,11 @@ export function encode(src: usize, len: usize, table: usize): usize { } if (c < 0x80) { + // encode ASCII unsafe cope point storeHex(dst, offset, c); offset += 6; } else { + // encode UTF-8 unsafe cope point if (c < 0x800) { storeHex(dst, offset, (c >> 6) | 0xC0); offset += 6; @@ -114,6 +127,7 @@ export function encode(src: usize, len: usize, table: usize): usize { } ++i; } + // shink output string buffer if necessary if (outSize > offset) { dst = __renew(dst, offset); } @@ -180,10 +194,12 @@ export function decode(src: usize, len: usize, component: bool): usize { ch = (ch << 6) | (c1 & 0x3F); } + // check if UTF8 code point properly fit into invalid UTF16 encoding if (ch < lo || lo == -1 || ch > 0x10FFFF || (ch >= 0xD800 && ch < 0xE000)) { throw new URIError(E_URI_MALFORMED); } + // encode UTF16 if (ch >= 0x10000) { ch -= 0x10000; let lo = ch >> 10 | 0xD800; @@ -198,6 +214,7 @@ export function decode(src: usize, len: usize, component: bool): usize { } assert(offset <= (len << 1)); + // shink output string buffer if necessary if ((len << 1) > offset) { dst = __renew(dst, offset); } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index a31a888b1b..4b7986e0d6 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2186,7 +2186,7 @@ if i32.const 1584 i32.const 1632 - i32.const 70 + i32.const 81 i32.const 9 call $~lib/builtins/abort unreachable @@ -2201,7 +2201,7 @@ if i32.const 1584 i32.const 1632 - i32.const 74 + i32.const 85 i32.const 11 call $~lib/builtins/abort unreachable @@ -2226,7 +2226,7 @@ if i32.const 1584 i32.const 1632 - i32.const 78 + i32.const 89 i32.const 11 call $~lib/builtins/abort unreachable @@ -2680,7 +2680,7 @@ if i32.const 1584 i32.const 1632 - i32.const 150 + i32.const 164 i32.const 7 call $~lib/builtins/abort unreachable @@ -2795,7 +2795,7 @@ if i32.const 1584 i32.const 1632 - i32.const 173 + i32.const 187 i32.const 11 call $~lib/builtins/abort unreachable @@ -2852,7 +2852,7 @@ if i32.const 1584 i32.const 1632 - i32.const 184 + i32.const 199 i32.const 9 call $~lib/builtins/abort unreachable @@ -2909,7 +2909,7 @@ if i32.const 0 i32.const 1632 - i32.const 200 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index 15a7c936ab..bbec833497 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -3878,7 +3878,7 @@ if i32.const 560 i32.const 608 - i32.const 70 + i32.const 81 i32.const 9 call $~lib/builtins/abort unreachable @@ -3893,7 +3893,7 @@ if i32.const 560 i32.const 608 - i32.const 74 + i32.const 85 i32.const 11 call $~lib/builtins/abort unreachable @@ -3921,7 +3921,7 @@ if i32.const 560 i32.const 608 - i32.const 78 + i32.const 89 i32.const 11 call $~lib/builtins/abort unreachable @@ -4460,7 +4460,7 @@ if i32.const 560 i32.const 608 - i32.const 150 + i32.const 164 i32.const 7 call $~lib/builtins/abort unreachable @@ -4591,7 +4591,7 @@ if i32.const 560 i32.const 608 - i32.const 173 + i32.const 187 i32.const 11 call $~lib/builtins/abort unreachable @@ -4656,7 +4656,7 @@ if i32.const 560 i32.const 608 - i32.const 184 + i32.const 199 i32.const 9 call $~lib/builtins/abort unreachable @@ -4719,7 +4719,7 @@ if i32.const 0 i32.const 608 - i32.const 200 + i32.const 216 i32.const 3 call $~lib/builtins/abort unreachable From d10f0165e0a04abe23d286cb0671aa2f80bbcb1d Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 17 Apr 2021 15:54:14 +0300 Subject: [PATCH 85/87] fix typos --- std/assembly/util/uri.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index f79832d712..b8fb9c9785 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -101,11 +101,11 @@ export function encode(src: usize, len: usize, table: usize): usize { } if (c < 0x80) { - // encode ASCII unsafe cope point + // encode ASCII unsafe code point storeHex(dst, offset, c); offset += 6; } else { - // encode UTF-8 unsafe cope point + // encode UTF-8 unsafe code point if (c < 0x800) { storeHex(dst, offset, (c >> 6) | 0xC0); offset += 6; From 1e785515304be1fd0f39641ccd3e039e6fa822a8 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 17 Apr 2021 18:48:28 +0300 Subject: [PATCH 86/87] more typos --- std/assembly/util/uri.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index b8fb9c9785..36da51ba84 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -1,7 +1,7 @@ import { E_URI_MALFORMED } from "./error"; import { CharCode } from "./string"; -// Tuncated lookup boolean table that helps us quickly determine +// Truncated lookup boolean table that helps us quickly determine // if a char needs to be escaped for URIs (RFC 2396). // @ts-ignore: decorator @lazy export const URI_UNSAFE = memory.data([ @@ -15,7 +15,7 @@ import { CharCode } from "./string"; skip 128 + 1 always set to '1' tail slots */ ]); -// Tuncated lookup boolean table that helps us quickly determine +// Truncated lookup boolean table that helps us quickly determine // if a char needs to be escaped for URLs (RFC 3986). // @ts-ignore: decorator @lazy export const URL_UNSAFE = memory.data([ @@ -29,7 +29,7 @@ import { CharCode } from "./string"; skip 128 + 1 always set to '1' tail slots */ ]); -// Tuncated lookup boolean table for determine reserved chars: ;/?:@&=+$,# +// Truncated lookup boolean table for determine reserved chars: ;/?:@&=+$,# // @ts-ignore: decorator @lazy export const URI_RESERVED = memory.data([ /* skip 32 + 3 always set to '0' head slots From a5444053b3944de9314ee4f4151ea6f17fcbbef2 Mon Sep 17 00:00:00 2001 From: MaxGraey Date: Sat, 17 Apr 2021 18:52:33 +0300 Subject: [PATCH 87/87] fix --- std/assembly/util/uri.ts | 2 +- tests/compiler/std/uri.optimized.wat | 2 +- tests/compiler/std/uri.untouched.wat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/std/assembly/util/uri.ts b/std/assembly/util/uri.ts index 36da51ba84..c8d72bca24 100644 --- a/std/assembly/util/uri.ts +++ b/std/assembly/util/uri.ts @@ -265,7 +265,7 @@ function loadHex(src: usize, offset: usize): u32 { // @ts-ignore: decorator @inline function isReserved(ch: u32): bool { return ch - 35 < 30 - ? load(URI_RESERVED + (ch - 35)) + ? load(URI_RESERVED + (ch - 35)) : false; } diff --git a/tests/compiler/std/uri.optimized.wat b/tests/compiler/std/uri.optimized.wat index 4b7986e0d6..375b2142ca 100644 --- a/tests/compiler/std/uri.optimized.wat +++ b/tests/compiler/std/uri.optimized.wat @@ -2706,7 +2706,7 @@ local.get $6 i32.const 3561 i32.add - i32.load16_u + i32.load8_u else i32.const 0 end diff --git a/tests/compiler/std/uri.untouched.wat b/tests/compiler/std/uri.untouched.wat index bbec833497..78ddd9e480 100644 --- a/tests/compiler/std/uri.untouched.wat +++ b/tests/compiler/std/uri.untouched.wat @@ -4489,7 +4489,7 @@ i32.const 35 i32.sub i32.add - i32.load16_u + i32.load8_u else i32.const 0 end